1. 课程导论:为什么需要页表?
在计算机系统中,内存是程序运行的基石。然而,现代操作系统并非让程序直接操作物理内存,而是通过一层抽象的转换机制——页表(Page Table),来实现从虚拟地址(Virtual Address, VA)到物理地址(Physical Address, PA)的映射。本章作为课程导论,将深入剖析页表存在的根本原因、映射关系以及其在内存管理中的核心地位。
1.1 为什么需要页表?——三大核心驱动力
如果没有页表,每个程序都直接访问物理内存,将会导致以下灾难性问题:
- 隔离性与安全性缺失:恶意程序或错误代码可以随意读取或篡改其他进程的内存数据,甚至操作系统内核。
- 地址空间冲突:多个程序无法同时加载到内存中运行,因为它们都需要从地址 0 开始。
- 内存碎片化与利用率低下:程序加载、卸载后,物理内存会形成大量无法使用的“空洞”。
页表通过为每个进程提供独立的虚拟地址空间,完美解决了上述问题。每个进程都以为自己独占了从 0 到最大地址的连续内存,而页表则负责将这些虚拟地址动态、安全地映射到分散的物理内存页框上。
1.2 虚拟地址与物理地址的映射关系
映射的基本单位是页(Page)和页框(Page Frame)。虚拟地址空间被划分为固定大小的页(通常为 4KB),物理内存被划分为同样大小的页框。页表本质上是一个映射表,其条目(Page Table Entry, PTE)记录了虚拟页号到物理页框号的转换关系。
| 概念 | 定义 | 示例(4KB 页) |
|---|---|---|
| 虚拟地址 (VA) | CPU 发出的地址,由虚拟页号 (VPN) 和页内偏移 (Offset) 组成 | 0x7f4d8b5f (VPN) + 0x3a8 (Offset) |
| 物理地址 (PA) | 实际访问内存芯片的地址,由物理页框号 (PFN) 和页内偏移 (Offset) 组成 | 0x1a3f (PFN) + 0x3a8 (Offset) |
| 页表项 (PTE) | 页表中的一行,包含 PFN 和权限/状态位 | PFN=0x1a3f | Present=1 | RW=1 |
下图展示了从虚拟地址到物理地址的转换流程:
1.3 页表在内存管理中的核心地位
页表不仅仅是地址转换的“字典”,它更是整个内存管理子系统的中枢神经。其核心地位体现在以下几个关键方面:
- 进程隔离与保护:每个进程拥有独立的页表,确保进程 A 无法访问进程 B 的物理内存。页表项中的权限位(如 R/W, XD)可以防止代码段被修改或数据段被执行。
- 按需分页(Demand Paging):页表项中的 Present 位 指示该页是否在物理内存中。当访问一个不在内存中的页时,CPU 触发缺页异常(Page Fault),操作系统从磁盘加载数据,这是虚拟内存得以实现的基础。
- 共享内存:多个进程的页表项可以指向同一个物理页框,实现高效的进程间通信(IPC)和共享库(如 libc.so)的物理内存共享。
- 内存映射文件(mmap):将文件内容映射到进程的虚拟地址空间,通过页表实现按需加载,极大简化了文件 I/O 操作。
- 内核与用户空间隔离:通过修改页表项,在用户态和内核态切换时,可以快速切换地址空间,保护内核代码不被用户程序破坏。
1.4 从单级到多级页表:解决内存开销问题
最简单的单级页表需要为整个虚拟地址空间(例如 32 位系统下的 4GB)维护一个巨大的数组。如果每个 PTE 占 4 字节,则需要 4MB 的连续物理内存来存储页表。对于 64 位系统,这个开销将变得不可接受。
为了解决这个问题,现代操作系统(包括 Linux)采用了多级页表结构。以 64 位 ARM64 架构为例,Linux 使用 4 级页表(PGD → P4D → PUD → PMD → PTE)。这种树形结构允许页表按需分配:只有实际使用的虚拟地址范围才会分配对应的页表层级,从而大幅节省内存。
| 特性 | 单级页表 | 多级页表(4级) |
|---|---|---|
| 内存占用 | 固定且巨大(如 4MB) | 按需分配,通常远小于单级 |
| 地址空间支持 | 有限(通常 32位) | 支持 64 位超大地址空间 |
| 转换速度 | 快(一次内存访问) | 较慢(多次内存访问,依赖 TLB 加速) |
| 灵活性 | 低 | 高(支持大页、内存热插拔) |
下图展示了 Linux 四级页表的层次结构:
1.5 课程预览:我们将深入探讨什么?
本课程将带领你从底层原理到代码实现,全面掌握 Linux 页表机制。后续章节将涵盖:
- ARM64 硬件架构:MMU 配置、TLB 操作、页表遍历的硬件细节。
- Linux 内核源码分析:深入
arch/arm64/mm/mmu.c和include/linux/pgtable.h,理解页表的创建、销毁和修改。 - 大页(Huge Pages)与透明大页(THP):如何利用大页减少 TLB 压力。
- 页表与性能优化:TLB 抖动、缺页异常处理、内存规整等高级话题。