win-计算机启动时的模式过渡
第四章 处理器模式与硬件内存管理(x86_64) - 从零开始开发UEFI引导的64位操作系统内核 - 知乎
本文为上面这个网址的摘抄
几种模式
实模式
处理位数被设为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,无限段长,直接用对应权限的段+偏移量索引虚拟地址,然后通过页表映射到对应的物理内存。