环境: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