机器指令中出现的内存地址是逻辑地址,需要转换成线性地址,再经过MMU转换成为物理地址才能够被访问到。

比如:mov 0x08049560 %eax

其中,0x08049560是逻辑地址,必须加上隐含的DS数据段的基地址,才能构成线性地址。即0x08049560是当前任务的DS段内的偏移。

在linux系统中,逻辑地址==线性地址。

因为linux中所有的段都是从0x00000000开始,长度为4G。

GDT的第12个表项 __KERNEL_CS

     第13个表项 __KERNEL_DS

     第14个表项 __USER_CS

     第15个表项 __USER_DS

用gdb调试时,使用info reg显示当前寄存器的值

cs 0x73 115

ss 0x7b 123

ds 0x7b 123

es 0x7b 123

将其展开为二级制码就能发现这些寄存器中存放的就是GDT中相应的表项

比如0x73 展开为:01110011,后两位(bit0和bit1)是DPL值,bit2是TI字段,前五位就是相应的段在GDT中的索引,cs段的索引就是01110,即第十四个表项

将现行地址转换为物理地址则是通过分页机制实现的。