概述

阅读本文章前请确认对X86下的分页机制有最基本的了解,否则将难以理解本文中提到的内容。

本文介绍的内容均位X86架构下的PAE技术,而不是ARM架构下的LPAE技术,虽然两者从本质来说是一样的。

介绍如下内容:

  • PAE技术因何问世
  • PAE技术可以干什么
  • PAE技术实现原理
  • 为什么我们所用的32位操作系统只能使用4GB的内存

PAE技术因何问世

PAE(Physical Address Extension,中文译名:物理地址扩展)技术最初是为了弥补32位地址在服务上不够用的情况。因为32位的地址最多只能支持4GB的内存,而这对于很多服务器来说是远远不够的,而那时64位的CPU和操作系统还没有普及,这个技术临时缓解了一下这类问题。

PAE技术可以干什么

PAE技术可以使得多个进程使用的总内存大于4GB,但是单个进程的所使用的内存上限依然只有4GB。

PAE技术实现原理

  • 地址线由32根增加到36根,寻址空间自然也就从4GB增加到了64GB
  • 改动了分页机构使其可以适应36根地址线的寻址空间

这里主要介绍分页机构的改动。

未启动PAE下的分页机制

4K分页

图片加载失败未启动PAE下的4K分页

  1. CR3寄存器中取出页目录的基址。
  2. 取出线性地址中的22位~31位共10位作为页目录项页目录中的索引,由此找到页目录项
  3. 根据页目录项中的内中找到对应的页表的基址。
  4. 取出线性地址中的12位~21位共10位作为页表项页表中的索引,由此找到页表项
  5. 取出线性地址中的0位~11位共12位作为页内偏移,从页表项中取出页基址,两者相加则到物理地址

4M分页

图片加载失败未启动 PAE下的 4M 分页

  1. CR3寄存器中取出页表的基址。
  2. 取出线性地址中的22位~31位共10位作为页表项页表中的索引,由此找到页表项
  3. 取出线性地址中的0位~21位共22位作为页内偏移,从页表项中取出页基址,两者相加则到物理地址

启动 PAE 下的分页机制

4K 分页

图片加载失败启动 PAE下的 4K分页

  1. CR3寄存器中取出页目录指针表的基址
  2. 取出线性地址30位~31位共2位作为页目录指针页目录指针表中的索引,由此找到页目录指针
  3. 根据页目录指针获得对应的页目录的基址
  4. 取出线性地址中的21位~29位共9位作为页目录项页目录中的索引,由此找到页目录项
  5. 根据页目录项找到对应页表的基址。
  6. 取出线性地址中的12位~20位共9位作为页表项页表中索引,由此找到页表项
  7. 取出线性地址中的0位~11位共12位作为页内偏移,从页表项中取出页基址,两者相加则到物理地址

4M 分页

图片加载失败启动 PAE下的 4M 分页

  1. CR3寄存器中取出页表指针表的基址
  2. 取出线性地址30位~31位共2位作为页表指针页表指针表中的索引,由此找到页表指针
  3. 根据页表指针找到对应的页表的基址
  4. 取出线性地址中的21位~29位共9位作为页表项页表中的索引,由此找到页表项
  5. 取出线性地址中的0位~21位共22位作为页内偏移,从页表项中取出页基址,两者相加则到物理地址

为什么我们所用的32位操作系统只能使用4GB的内存

因为大多数情况下我们用的都是提供给个人的操作系统,个人版Windows 32位操作系统可使用内存容量被强制限制到4GB,而Windows Server版的则没有这个限制,所以Windows Server版的32位操作系统是可以使用超过4GB的内存的。

那么为什么微软要在个人版系统上做出如此的限制?因为DMA,具体情况如下:

  1. DMA可以直接让硬件和内存进行数据交换而不需要经由CPU中转,可以大幅度提高效率,硬件驱动开发者也会利用DMA来提高效率。
  2. 但是某些硬件可以用于DMA的内存最多只有4GB,多了就不可以了。
  3. 在PAE技术没有出现的时候这种做法是没有任何问题的,因为大家都只能访问4GB的空间。
  4. 但是PAE技术出现后,如果在驱动代码中访问高于4GB的空间就会导致错误,而驱动代码出现错误是很严重的,常见的情况就是蓝屏。
  5. 因此需要修改驱动代码来适应PAE技术。
  6. 同时,也需要修改Windows自己的内核代码,比如更新API。
  7. 但是修改Windows自己的内核代码和更新API会带来成本问题,最重要的是兼容性的问题。
  8. 而且硬件厂商并未积极更新提供给个人的硬件驱动,这些未更新的驱动在启用了PAE技术的CPU是十分不稳定的。
  9. 鉴于这种情况,微软就直接在个人版的32位系统上禁用了PAE保证系统和驱动稳定性以及兼容性。
  10. 但是Windows Server版微软做了更新,各个驱动厂商也有专门的驱动,所以Server版就没有这个限制。