0178-开启四级分页
2023-08-20 19:14 作者:jiangbo4444 | 我要投稿
环境
Time 2022-11-12
WSL-Ubuntu 22.04
QEMU 6.2.0
NASM 2.15.05
前言
说明
参考:https://os.phil-opp.com/entering-longmode/
目标
如果要进入长模式,则必须要进行分页。在 64 位系统中,采用 4 级分页。
关于分页的信息,需要找其它的资料另外了解,这里不做详细介绍。
介绍
一共四级分页,原文中将其称为 P4,P3,P2,P1,这里也直接使用这种方式。 最初出发点为 CR3 寄存器,然后到 P4,直到 P1,最后是页偏移。 一个页表包含 512 项,每一项 8 个字节,一共 4K。 地址中的 48-63 必须满足和第 47 位一致,才是合法的地址。 具体的对应如下图:

低地址位的状态
因为至少是 4K 分页,所以低 12 位默认都是 0,可以用它们来表示一些额外的信息。

巨型页
除了可以使用 4K 分页,也可以使用 1G 或者 2M 分页。
为了保证从保护模式的虚拟地址到分页的正确映射,下面使用了 2M 分页。
分页首先需要 4K 对其,然后建立了 P4,P3,P2 三个页表。
关联多级分页
初始化巨型页
开启分页
如果要开启分页,需要完成以下几步:
将 P4 的起始地址存放到 CR3,因为分页从 CR3 开始找。
启用物理地址扩展(PAE)。
扩展特性启用寄存器(Extended Feature Enable Register)需要设置长模式。
启用分页,由 CR0 的最高位控制。
总结
在保护模式下,开启了四级分页。
附录
源码