在实模式下寻址的时候,”段寄存器+偏移地址”进过转换计算以后得到的地址是“物理地址”,也就是在物理内存中的实际地址,而在保护模式下,“段选择器+偏移地址”转换后的地址被称为“线性地址”而不是“物理地址”,那么线性地址就是物理地址吗?
答案可能是,也可能不是,这取决于80386的内存分页机制是否被使用。
为什么有内存分页机制?
我们回顾一下,单任务的DOS系统中,一个应用程序可以使用所有的空闲内存,程序退出以后,操作系统回收所有的碎片并且合并出一个大块内存继续供下一个程序使用。由于TSR程序可能会使得内存碎片化,所以多任务系统中,碎片内存合并很重要。为了解决这个问题,分页机制应运而生。
在80386处理器中,除了和CR3寄存器(指定当前页目录的地址)相关的指令使用的是物理地址,其他所有指令都是用线性地址寻址的。
CR3:用于保存页目录表页面的物理地址的32寄存器,因此被称为PDBR。由于目录是页对齐的,所以仅高20位有效,低12位保留供更加高级的处理器使用。想CR3中装入一个新值时,低12位必须为0,从CR3中取值时,低12位被忽略。
是否启动分页机制是由80386处理器新增的CR0寄存器的31位(PG)决定的。
如果PG=0,不开启分页机制,这时所有指令寻址的地址(线性地址)就是系统中实际的物理地址
如果PG=1,开启分页机制,80386进入内存分页管理模式,所有的线性地址要经过页表才能映射到最后的物理地址。
一个xxxx:yyyyyyyy格式的虚拟地址(xxxx16位,yyyyyyyy32位),前面我们说过这个虚拟地址经过GDT/LDT转换为32位的线性的地址zzzzzzzz,当禁止分页的时候,线性地址就是物理地址;当开启分页的时候,得到的线性地址会经硬件转换为物理地址