操作系统(6)虚拟内存-缓存工具-页表(2)

6.1页表

页表是操作系统与硬件协同工作时,用于记录虚拟页与物理页映射关系的核心数据结构。它是虚拟地址转换为物理地址的 "桥梁",通过存储虚拟页号(VPN)与物理页号(PPN)的对应关系,配合内存管理单元(MMU)实现高效地址映射,同时支撑虚拟内存的缓存、权限控制等功能。

6.2页表组成

页表由多个 "页表项( PTE)" 组成,每个页表项对应一个虚拟页,是映射关系的最小存储单元。一个典型的页表项包含以下核心字段:

字段 含义与作用
物理页号(PPN) 核心字段,存储该虚拟页对应的物理页在物理内存中的编号,用于拼接物理地址。
有效位(Valid) 标记虚拟页是否已映射到物理页:- 1(有效):虚拟页在物理内存中,可直接访问;- 0(无效):虚拟页未映射(或被交换到硬盘),访问会触发缺页异常。
访问权限位(Read/Write/Execute) 控制对该虚拟页的访问权限:- R(读):允许读取页内数据;- W(写):允许修改页内数据;- X(执行):允许运行页内代码(如代码段虚拟页)。
脏位(Dirty) 标记物理页数据是否被修改:- 1(脏):页内数据已修改,若需交换到硬盘,需写入新数据;- 0(干净):页内数据与硬盘备份一致,交换时可直接丢弃。
引用位(Reference) 标记虚拟页最近是否被访问:- 1(已引用):最近被访问过;- 0(未引用):长期未被访问。用于页面置换算法(如 LRU),判断哪些虚拟页可优先淘汰。
交换位与交换地址 当虚拟页被交换到硬盘时,有效位设为 0,交换位设为 1,并记录该虚拟页在硬盘交换分区的存储地址,用于缺页时加载回物理内存。

6.3地址转换流程:页表如何工作?

结合虚拟地址结构和页表,虚拟地址到物理地址的转换需经过 4 个核心步骤,全程由硬件(MMU)与软件(操作系统)协同完成:

1. 虚拟地址拆分

CPU 收到虚拟地址后,自动拆分为两部分(拆分规则由页大小决定,以 4KB 页为例):

  • 虚拟页号(VPN):高位部分(如 32 位地址的高 20 位),用于查找页表项;
  • 页内偏移(Offset):低位部分(如 32 位地址的低 12 位),用于定位数据在页内的具体位置(虚拟页与物理页大小相同,页内偏移在两者中完全一致)。

示例 :32 位虚拟地址 0x12345678(4KB 页)

  • 拆分结果:VPN = 0x12345(高 20 位),Offset = 0x678(低 12 位)。

2. 页表查询(MMU 硬件操作)

MMU 根据虚拟页号(VPN),在当前进程的页表中查找对应的页表项(PTE):

  • 页表在物理内存中连续存储,每个 PTE 占固定字节(如 4 字节),因此 PTE 的物理地址 = 页表基地址 + VPN × PTE 大小;
  • MMU 直接访问该物理地址,读取页表项的内容(无需 CPU 参与,硬件级高效查询)。

3. 权限与状态检查

MMU 读取页表项后,先进行合法性检查,避免非法访问:

  1. 有效位检查:若有效位为 0(虚拟页未映射),MMU 触发 "缺页异常",暂停当前进程,转由操作系统处理(如从硬盘加载虚拟页到物理内存,更新页表项);
  2. 权限检查:若当前访问操作(如写数据)与页表项的权限位冲突(如虚拟页仅允许读),MMU 触发 "权限异常",操作系统终止非法操作,保护内存安全。

4. 物理地址拼接

检查通过后,MMU 从页表项中提取物理页号(PPN),与页内偏移(Offset)拼接生成物理地址:

  • 物理地址 = PPN × 页大小 + Offset(或二进制层面:PPN 左移页内偏移位数,再与 Offset 按位或)。

示例 :若 PPN = 0x87654,Offset = 0x678(4KB 页)

  • 物理地址 = 0x87654 << 12 | 0x678 = 0x87654678,最终 CPU 通过该地址访问物理内存。

6.4 页表的分类:单级页表与多级页表

随着 CPU 位数提升(如从 32 位到 64 位),虚拟地址空间急剧扩大(64 位系统虚拟地址空间达 16EB),若使用 "单级页表" 会导致页表体积过大(如 64 位 4KB 页的单级页表需 2⁵² 个 PTE,约 4PB 空间,完全无法存储)。因此,现代系统普遍采用 "多级页表",通过分层拆分虚拟页号,减少页表的实际存储体积。

1. 单级页表(早期 32 位系统)

  • 结构:虚拟页号直接对应页表中的 PTE 索引,页表是一个连续的数组;
  • 优点:地址转换仅需 1 次 MMU 查询,流程简单;
  • 缺点:页表体积固定,即使虚拟地址空间未完全使用,仍需分配完整页表(如 32 位 4KB 页的单级页表需 100 万 PTE,约 4MB 空间,对内存仍有一定浪费)。

仅适用于虚拟地址空间较小的 32 位系统,现代 64 位系统已不再使用。

2. 多级页表(现代 64 位系统)

  • 结构 :将虚拟页号拆分为多个层级(如 2 级、3 级、4 级),每级对应一个 "页目录表",最终指向最底层的 "页表"(存储 PPN);
    • 以 Linux 4 级页表(64 位 4KB 页)为例,虚拟页号拆分为 4 个 9 位字段,分别对应 "全局页目录(PGD)→ 上层页目录(PUD)→ 中间页目录(PMD)→ 页表(PT)" 的索引;
  • 优点:仅为已使用的虚拟页创建底层页表,未使用的层级目录项指向空,大幅减少页表的实际存储体积(如 64 位系统仅使用 1GB 虚拟地址时,多级页表仅需几十 KB 空间);
  • 缺点:地址转换需多次 MMU 查询(如 4 级页表需 4 次查询),但可通过 "快表(TLB,MMU 内置的高速缓存)" 缓存常用映射,抵消多级查询的延迟。

6.5总结

页表是虚拟内存体系的 "核心数据结构",其本质是 "虚拟页与物理页的映射中介"。通过单级 / 多级结构设计,它既实现了高效的地址转换,又支撑了虚拟内存的缓存、权限控制、进程隔离等关键功能;配合 TLB 优化后,进一步平衡了存储效率与转换性能。理解页表的结构、转换流程与优化机制,是掌握虚拟内存原理、排查内存性能问题(如 TLB 缺失率过高导致的延迟)的核心前提。

相关推荐
林一百二十八7 小时前
Win11配置VMware-workstation以及Ubuntu环境
linux·运维·ubuntu
铜豌豆_Y8 小时前
嵌入式Linux驱动开发之I2C子系统(3)--I2C子系统框架
linux·运维·驱动开发
LNN20228 小时前
Qt creator +Valgrind检测内存泄漏(linux)
linux·开发语言·qt
0wioiw09 小时前
Ubuntu(④Mysql)
linux·mysql·ubuntu
球求了9 小时前
Linux 系统入门:环境变量&&虚拟地址空间
linux·运维·服务器·1024程序员节
java_logo9 小时前
Docker 部署 Rocky Linux 全流程教程
linux·运维·服务器·docker·容器·1024程序员节
Lynnxiaowen10 小时前
今天我们学习Linux架构keepalived实现LVS代理双击热备
linux·学习·架构·云计算
0wioiw010 小时前
Ubuntu(⑤Redis)
linux·运维·ubuntu
我爱钱因此会努力11 小时前
ansible实战-不同的用户登录不同的主机
linux·运维·服务器·ansible