操作系统(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 缺失率过高导致的延迟)的核心前提。

相关推荐
188号安全攻城狮6 小时前
【PWN】HappyNewYearCTF_8_ret2csu
linux·汇编·安全·网络安全·系统安全
Yana.nice7 小时前
openssl将证书从p7b转换为crt格式
java·linux
AI逐月8 小时前
tmux 常用命令总结:从入门到稳定使用的一篇实战博客
linux·服务器·ssh·php
小白跃升坊8 小时前
基于1Panel的AI运维
linux·运维·人工智能·ai大模型·教学·ai agent
跃渊Yuey8 小时前
【Linux】线程同步与互斥
linux·笔记
舰长1158 小时前
linux 实现文件共享的实现方式比较
linux·服务器·网络
zmjjdank1ng9 小时前
Linux 输出重定向
linux·运维
路由侠内网穿透.9 小时前
本地部署智能家居集成解决方案 ESPHome 并实现外部访问( Linux 版本)
linux·运维·服务器·网络协议·智能家居
VekiSon9 小时前
Linux内核驱动——基础概念与开发环境搭建
linux·运维·服务器·c语言·arm开发
zl_dfq9 小时前
Linux 之 【进程信号】(signal、kill、raise、abort、alarm、Core Dump核心转储机制)
linux