保护模式进阶 — 内存检测与页表机制
tags: 操作系统, 内存管理@烩面
《操作系统真相还原》学习笔记:BIOS 内存检测的三种方法,以及一级/二级页表的原理与启动分页机制。
获取内存的方法
BIOS 0x15 子功能 0xE820
遍历主机上全部内存,每次调用返回一个地址范围描述符。
- 填写好"调用前输入"中列出的寄存器
- 执行中断调用
int 0x15 - CF 位为 0 时,对应寄存器即有结果
BIOS 0x15 子功能 0xE801
分别检测低 15MB 和 16MB~4GB 的内存,最大支持 4GB。
- AX 寄存器写入 0xE801
- 执行
int 0x15 - CF 位为 0 时获取结果
BIOS 0x15 子功能 0x88
最多检测出 64MB 内存,实际内存超过此容量也按 64MB 返回。
- AX 寄存器写入 0x88
- 执行
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 号项:指向自己(为动态操作页表做准备)
启动分页机制三步
- 准备好页目录表及页表
- 将页表地址写入控制寄存器 CR3
- 寄存器 CR0 的 PG 位置 1