IA32地址空间映射

环境:bochs2.11,linux0.11

在main函数中定义一个临时变量 int tmp = 1;
然后打印其地址
这个时候得到的是其逻辑地址

变量tmp存在于栈,所以先查找堆栈段寄存器 SS
共16位
高13位为编号(下标)
低前两位为权限(00为内核态,11为用户态)
低第三位(0代表使用GDT全局段描述符表,1代表使用LDT局部段描述符表)
在bochs中用dump_cpu查看所有寄存器的值
这里写图片描述
SS寄存器的值为 0x17
二进制为10 1 11
分析可得其使用LDT段描述符表,下标为2(即:LDT[2])

先找到GDT的起始地址,查看gdtr寄存器中的值
gdtr的值为0x5cb8
ldtr的值为0x68
二进制为 1101 0 00
分析可得ldt使用GDT,下标为13(即:GDT[13])

命令 xp/2w 以8字节显示GDT[13]的值,即全局段描述符表项
这里写图片描述

这里写图片描述
小端模式:0x000082fb 0x02d00068
按位分析可得,起始地址为0x00fb02d0
这是LDT的地址,再取LDT[2]的值

这里写图片描述
小端模式:0x10c0f300 0x00003fff
按位分析可得,起始地址为0x10000000

tmp变量的打印地址0x3fffef4为逻辑地址
起始地址+逻辑地址得到为线性地址(虚拟地址)
为0x13fffef4

查看cr0寄存器
这里写图片描述
最高位PG位显示为1,所以开启了内存分页

页表的分级映射
这里写图片描述
线性地址为:0x13fffef4
二进制为0001001111 1111111111 111011110100
高10位值:79,中10位值:1023,低20位的值:3828

查看cr3寄存器
值为:0x0,即页目录的起始地址为0x0
这里写图片描述
由于高20位地址
所以页表的地址为0x00fac000
这里写图片描述
由于高20位为地址
所以物理页面的地址为0x00f94000
这里写图片描述
其物理地址为:0x00f94ef4
得到值为0x1,这正是tmp的初始值1
这里写图片描述
其物理地址的值也为1,验证正确。
现在改变其值为0
这里写图片描述
查看其物理地址,值已经改变为0
经查看,程序里tmp值改为0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值