第12章:虚拟内存

本章概述

虚拟内存是现代操作系统最重要的抽象之一。本章将实现x86的分页机制,建立从虚拟地址到物理地址的映射。

学习目标

  • 理解虚拟内存的概念和必要性
  • 实现页目录和页表
  • 启用分页(设置CR0和CR3)
  • 处理缺页异常(Page Fault, INT 14)
  • 实现内核高地址映射

前置知识

  • 第11章的物理内存管理器
  • 位运算
  • 基本的地址转换概念

知识要点

虚拟地址翻译

虚拟地址(32位):
┌──────────┬──────────┬──────────┐
│ 页目录索引 │ 页表索引  │ 页内偏移  │
│  (10位)    │  (10位)  │  (12位)  │
└──────────┴──────────┴──────────┘
     │            │          │
     ↓            ↓          ↓
  页目录 ──→ 页表 ──→ 物理帧 + 偏移 = 物理地址

二级页表结构

  • 页目录: 1024个条目,每个指向一个页表
  • 页表: 1024个条目,每个指向一个4KB物理帧
  • 覆盖范围: 1024 × 1024 × 4KB = 4GB

文件结构

12-虚拟内存/
├── README.md           ← 本文件
├── 理论讲解.md          ← 分页理论详解
├── code/
│   ├── vmm.h           ← 虚拟内存管理器接口
│   ├── vmm.c           ← 分页实现
│   ├── kernel.c        ← 更新:启用分页
│   ├── Makefile
│   └── [共享文件]
├── 常见错误.md
└── 练习题.md

构建与测试

cd code
make
make run

本章收获

  • ✅ 理解x86二级页表机制
  • ✅ 能够创建和管理页映射
  • ✅ 启用分页后内核正常运行
  • ✅ 缺页异常处理