机器指令中出现的内存地址是逻辑地址,需要转换成线性地址,再经过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,即第十四个表项
将现行地址转换为物理地址则是通过分页机制实现的。