Windows平台保护模式寻址

保护模式与实模式的区别在于,在保护模型中物理地址解析过程不再仅由CPU独自完成,操作系统必须通过维护大量帮助处理器完成工作的特殊表来与处理器合作。总的来说,就是下面的过程:

Windows平台保护模式寻址_第1张图片

这里讨论的是IA-32处理器,它使用以下两种机制实现内存保护:

  1. 分段

  2. 分页

分页是可选的,而在保护模式下,分段是强制的。理解分段和分页的物理地址解析过程,是理解内存保护的关键。

看过王爽的《汇编语言》一定对实模式下的物理地址计算记忆深刻:物理地址=段地址*16+偏移地址。那么在保护模式下的内存寻址有什么变化吗,在我看来,没有变化。目前姑且可以这样来看:在未开启分页的保护模式下,物理地址=段选择器+偏移地址,唯一的区别在于,段选择器指向了一个操作系统的表设施,而表中才保存了段地址和其它相关信息,如是而已。

可以看一下段选择器结构:

Windows平台保护模式寻址_第2张图片

其中的3-15位是一个索引,可以算出它可以保存2的13次方即8192的索引,第2位设置了索引到的类型,那么什么是GDT和LDT呢,这就是上面提到的操作系统辅助CPU进行内存寻址的关键设施:全局描述符表,它的每一项是一个段描述符。现在我们知道,通过段选择器中的索引可以找到相应的GDT项,索引只是个相对位置,那如何找到参照呢,Answer是IA-32寄存器提供了GDTR寄存器,指向GDT的基地址。GDT这个设施很重要,下面是它的结构:

Windows平台保护模式寻址_第3张图片

可以看到,段描述符的长度为64位,其中有一段32位的基地址,就是我们计算物理地址过程要用到的类似实模式下段地址的东西。目前为止,所有分段内存寻址的知识体系都已经是完善的了,最后用一张图概括一下这个过程:

Windows平台保护模式寻址_第4张图片

下面讨论保护模式分页。

前面说过,分页是可先的。如果操作系统不使用分页,那么事情就非常简单了,线性地址空间直接和物理内存相对应。由于每个线性地址大小是32位,所以我们被限制在4GB的物理内存中。

如果使用分页,那线性地址就和直观所见到的完全不同了。在开启分页后,线性地址到物理地址,另有一番转换过程。启用分页后,线性地址被分成固定大小的块,这些块被称为页(大小可以是4KB,2MB或4MB),这里取4KB讨论之。现在,线性地址是一个被分成3个子域的结构:

其中第3个域(22-31位)指定了被称作页目录的数组结构的项,这些项被称为页目录项(Page Directory Entry,PDE),页目录第一项的物理地址存储在CR3寄存器中。因此CR3也被称作页目录基址寄存器(Page Directory Base Register,PDBR),以下是PDE结构:

Windows平台保护模式寻址_第5张图片

第2个域(12-21位)指定页表中一个特定项,页表中的项被顺序排列为数组,称作页表项(Page Table Entry,PTE),以下为PTE结构:

Windows平台保护模式寻址_第6张图片

我们再来看下目前为目止我们脑海里是怎样一幅图:

Windows平台保护模式寻址_第7张图片

现在我们还有一个知识是没有讨论的,也就是PAE(物理地址扩展),如果通过控制CR4控制寄存器中的PAE标志启用PAE,那么线性地址就被划分为4部分:

Windows平台保护模式寻址_第8张图片

如上所见,PAE和PTE都减少到9位,多出两位组成了我们熟悉的页目录指针表(Page Directory Pointer Table,PDPT),使用PAE可以把32位的线程地址映射为52位的物理地址(以前为40位),仅此而已。


你可能感兴趣的:(Windows平台保护模式寻址)