保护模式下的逻辑地址,线性地址,物理地址

IA32保护模式中,逻辑地址=16位段选择子:32位偏移地址,具体的值应该是指令经过编译/汇编产生的,如果是应用编程的话,编译/汇编只产生偏移地址,段选择子的值由系统分配。在寻址时,16位段选择子位于CS/SS/DS/ES/FS/GS寄存器中,32位偏移地址位于指令代码中。

 

逻辑地址如何转换成线性地址,线性地址又如何转换成物理地址?

(1)如果要确定某代码段中某变量的实际物理地址,首先要知道CS/SS/DS/ES/FS/GS的值(包含该代码段的段描述符在GDT中的偏移地址)和GDTR/LDTR寄存器值(包含GDT/LDT的基地址),可以从GDT中找出该代码段的段描述符,此段描述符中包含代码段的基地址。

该代码段的基地址(32位)+变量的偏移地址(32位)=该变量的线性地址(32位);

(2)如果该线性地址是4KB页的,根据线性地址查找某变量的物理地址可以理解为在图书馆找书:

某本书位置=第x个书架  +第y层     +第z本

某线性地址=第x页表     +第y个页  +偏移z处

结合CR3(包含页目录的基地址)及线性地址高10位(页表在页目录中的偏移)可以找出第x页表的基地址,再结合中间10位(页在页表中的偏移)找出第y个页的基地址,再加上线性地址的低16位(页内偏移地址,即偏移z处),也就是实际物理地址。

===============================

PS:

CR0的第0位-PE:保护模式使能位,0时CPU工作于实模式,寻址方式为16位段基址*16+16位偏移地址,寻址1M空间,段基址取决于段寄存器CS/SS/DS/ES/FS/GS的内容,但与上面的描述无关。

CR0的第31位-PG:分页使能位,1时寻址如上描述,0时线性地址即物理地址,即不需要第(2)步的地址转换。

相关寄存器及相关概念

CS/SS/DS/ES/FS/GS-----Seg. Selector(段选择子)

GDTR/LDTR---------Seg. Descriptors(段描述符)、GDT/LDT(全局描述符表/局部描述符表)

CR3-------------页目录

                                             页表

                                             页

===============================

主要参考资料:

www.oldlinux.org下载的“IA32卷3:系统编程指南”中译版,在此谢过译者。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值