前提
- 如果开启了长模式,则必须同时开启分页模式,因为长模式弱化了分段模型
- 而分段模型也确实有很多不足,不适应现在操作系统和应用软件的发展
- 长模式也扩展了 CPU 的位宽,使得 CPU 能使用 64 位的超大内存地址空间
- 所以,长模式下的虚拟地址必须等于线性地址且为 64 位
4KB 页
4KB 页的构成
-
该分页方式下,64 位虚拟地址被分为 6 个位段,分别是:
保留位段,顶级页目录索引、页目录指针索引、页目录索引、页表索引、页内偏移,顶级页目录、页目录指针、页目录、页表
-
各占有 4KB 大小,其中各有 512 个条目,每个条目 8 字节 64 位大小
-
CR3 已经变成 64 位的 CPU 的寄存器,它指向一个顶级页目录,里面的顶级页目项指向页目录指针,依次类推
-
注意
- 虚拟地址 48 到 63 这 16 位是根据第 47 位来决定的,47 位为 1,它们就为 1,反之为 0
- 这是因为 x86 CPU 并没有实现全 64 位的地址总线,而是只实现了 48 位,但是 CPU 的寄存器却是 64 位的
- 这种最高有效位填充的方式,即使后面扩展 CPU 的地址总线也不会有任何影响
CR3、顶级页目录项、页目录指针项、页目录项、页表项
CR3
顶级页目录项
页目录指针项
页目录项
页表项
总结
- 长模式下的 4KB 分页下,由一个顶层目录、二级中间层目录和一层页表组成了 64 位地址翻译过程
- 顶级页目录项指向页目录指针页,页目录指针项指向页目录页,页目录项指向页表页,页表项指向一个 4KB 大小的物理页
- 各级页目录项中和页表项中依然存在各种属性位,这在图中已经说明
- 其中的 XD 位,可以控制代码页面是否能够运行
2MB 页
2MB 页构成
-
在这种分页方式下,64 位虚拟地址被分为 5 个位段 :保留位段、顶级页目录索引、页目录指针索引、页目录索引,页内偏移,顶级页目录、页目录指针、页目录
-
各占有 4KB 大小,其中各有 512 个条目,每个条目 8 字节 64 位大小
-
长模式下 2MB 和 4KB 分页的区别
- 2MB 分页下是页目录项直接指向了 2MB 大小的物理页面,放弃了页表项
- 然后把虚拟地址的低 21 位作为页内偏移,21 位正好索引 2MB 大小的地址空间
CR3、顶级页目录项、页目录指针项、页目录项
CR3
顶级页目录项
页目录指针项
页目录项
总结
- 上图中没有了页表项,取而代之的是,页目录项中直接存放了 2MB 物理页基地址
- 由于物理页始终 2MB 对齐,所以其地址的低 21 位为 0,用于存放页面属性位