保护模式进阶 — 内存检测与页表机制

tags: 操作系统, 内存管理
@烩面 14/01/2026

《操作系统真相还原》学习笔记:BIOS 内存检测的三种方法,以及一级/二级页表的原理与启动分页机制。

获取内存的方法

BIOS 0x15 子功能 0xE820

遍历主机上全部内存,每次调用返回一个地址范围描述符。

  1. 填写好"调用前输入"中列出的寄存器
  2. 执行中断调用 int 0x15
  3. CF 位为 0 时,对应寄存器即有结果

BIOS 0x15 子功能 0xE801

分别检测低 15MB 和 16MB~4GB 的内存,最大支持 4GB。

  1. AX 寄存器写入 0xE801
  2. 执行 int 0x15
  3. CF 位为 0 时获取结果

BIOS 0x15 子功能 0x88

最多检测出 64MB 内存,实际内存超过此容量也按 64MB 返回。

  1. AX 寄存器写入 0x88
  2. 执行 int 0x15

页表

通过映射,使连续的线性地址与任意物理内存地址相关联,逻辑上连续的线性地址其对应的物理地址可以不连续。

一级页表

整个虚拟地址空间被划分成许多虚拟页(4KB 一页)。页表中每个元素(页表项)记录一个虚拟页对应的物理页框号 + 控制位。

将 32 位虚拟地址拆分为两部分:高 20 位用于定位一个物理页,低 12 位用于定位物理页内的偏移。

二级页表

将 32 位虚拟地址拆分成三部分:

VA (32位) = | 页目录索引 10位 | 页表索引 10位 | 页内偏移 12位 |

最终物理地址计算:高 10 位地址 × 4 + 中间 10 位地址 × 4 + 低 12 位偏移

页表项标志位

标志含义
P存在位,1=该页在物理内存中,0=不在物理内存中
RW读写位,1=可读可写,0=可读不可写
US权限位,1=任何权限可访问,0=只允许 3 以上的权限访问
PWT页级通写位,1=采用通写方式(不光是普通内存,还是高速缓存)
PCD高速缓存禁止位,1=启用,0=禁止
A访问位,1=已被 CPU 访问过,可以表示该页使用频率
D脏页位,CPU 对一个页面执行写操作时设为 1,页目录不做修改
PAT页属性表位
G全局位,为 1 为全局页,给出虚拟地址就知道物理地址
AVL软件可用位

二级页表标准分布

  • 0~768 号项:3GB 用户空间
  • 769~1022 号项:1GB 内核空间
  • 1023 号项:指向自己(为动态操作页表做准备)

启动分页机制三步

  1. 准备好页目录表及页表
  2. 将页表地址写入控制寄存器 CR3
  3. 寄存器 CR0 的 PG 位置 1