第四章 处理器模式与硬件内存管理(x86_64) - 从零开始开发UEFI引导的64位操作系统内核 - 知乎

本文为上面这个网址的摘抄

image-20241227011304326

几种模式

实模式

处理位数被设为16位。在这个模式中,处理器只能访问物理地址的前1MB空间,通过段寄存器左移4位后与一个16位地址相加得到的20位地址访问。

32位实模式

不开启保护模式的32位模式是不稳定的,处理器只能暂时处于32位实模式的状态,需要开启保护模式才能正常执行32位程序。

保护模式

准备保护模式数据结构后将cr0寄存器的PE标志位置位即可开启。这个“保护模式数据结构”指的是GDT,全局描述符表,表中可以添加段描述符系统描述符。保护模式下的段寄存器通过访问段描述符确定所在的段,而不是左移4位后直接与地址相加;保护模式有许多硬件直接触发的保护功能,系统描述符用于支持这些功能的触发。此外,保护模式中引入了特权级0为最高的特权级,3为最低的特权级,越高的特权级,保护功能越弱,程序越容易控制处理器的状态。内核通常在0特权级运行,普通程序通常在3特权级运行。同时,在这个模式中也引入了分页机制(不是必须开启)。32位的基本分页机制使用一级页表进行寻址,能够映射4GB空间,开启PAE后,在原先的以及页表上增加了两级页表,通过类似树状的数据结构使得相同大小的最高级页表能够映射64PB的空间。PAE开启后使用36位物理地址,使得物理地址寻址能力提高到了64GB

长模式

实模式切换而来的32位保护模式被称为IA-32模式。由于64位模式仅仅是在IA-32模式基础上经过简单的功能增强和修改得到的,所以被称为IA-32e模式。

主要有这些功能:分页机制长模式地址扩展(LME)64位段描述符长模式地址扩展中为分页机制又增加了一级或两级页表,使用4级或5级页表映射地址空间。同时使用48位物理地址,进一步提高物理地址寻址能力。也因为48位物理地址称为长地址IA-32e模式又称长模式。由于描述符表中支持32位段描述符64位段描述符同时存在,所以可以通过暂时关闭LME并修改段寄存器索引的段描述符,进入一种支持32位程序运行的IA-32e的子模式,称为兼容模式。虽然所谓的兼容模式只是IA-32e模式的一种支持32位程序运行的状态,但我们依然习惯地称IA-32e的支持64位程序运行的状态IA-32e的支持32位程序运行的状态IA-32e的两个子模式长模式兼容模式

内存布局

分段

通过段寄存器加偏移的方式索引真实物理地址

分页

存在线性连续的虚拟地址,得到虚拟地址后,通过页表映射到对应的物理地址

分段+分页

通过段寄存器加偏移的方式索引到虚拟内存,通过页表映射到对应的物理内存

平坦内存模型

舍弃了大多数分段机制,保留了段寄存器的权限限制能力。在64位下,可以直接用单一段访问整个4G的虚拟内存空间,因此每个段的基址均为0,无限段长,直接用对应权限的段+偏移量索引虚拟地址,然后通过页表映射到对应的物理内存。