MIT 6.S081 pgtbl 前置篇(lab3):xv6 中的页表是什么东西 ?
开篇我第一次看下面这段话的时候非常痛苦还贴了两张图片(我后面会给出)让我更痛苦了现在好多了RISC-V指令用户和内核指令使用的是虚拟地址而机器的RAM或物理内存是由物理地址索引的。RISC-V页表硬件通过将每个虚拟地址映射到物理地址来为这两种地址建立联系。XV6基于Sv39 RISC-V运行这意味着它只使用64位虚拟地址的低39位而高25位不使用。在这种Sv39配置中RISC-V页表在逻辑上是一个由2272^{27}227个页表条目Page Table Entries/PTE组成的数组每个PTE包含一个44位的物理页码Physical Page Number/PPN和一些标志。分页硬件通过使用虚拟地址39位中的前27位索引页表以找到该虚拟地址对应的一个PTE然后生成一个56位的物理地址其前44位来自PTE中的PPN其后12位来自原始虚拟地址。图3.1显示了这个过程页表的逻辑视图是一个简单的PTE数组参见图3.2进行更详细的了解。页表使操作系统能够以 4096 (2122^{12}212) 字节的对齐块的粒度控制虚拟地址到物理地址的转换这样的块称为页page。先搞懂最基础的单位页Page分页机制的核心思想是把内存切成固定大小的小块以块为单位做地址映射这个小块就叫「页」。xv6 里一页固定是 4096 字节4KB也就是2122^{12}212字节。对应到地址上一页内的地址偏移需要 12 位二进制才能完全表示 (0~4095)这 12 位就叫页内偏移地址翻译时这 12 位完全不变虚拟地址的低 12 位直接就是物理地址的低 12 位。可以把一页理解成一栋楼的「楼层」页内偏移就是「房间号」。翻译地址只需要找到对应的楼层房间号直接照搬就行。Sv39 到底是什么39 位虚拟地址怎么拆Sv39 的全称是 「RISC-V 39 位虚拟地址分页方案」虚拟地址虽然是 64 位寄存器存储但只有低 39 位是有效的高 25 位不用(实际要求做符号扩展)整个虚拟地址空间大小是239512GB2^{39} 512 GB239512GB对教学内核来说完全够用39 位有效地址扣掉低 12 位的页内偏移剩下27 位是虚拟页号VPN用来在页表里查找对应的物理页号。两种视图逻辑视图 vs 实际硬件视图逻辑视图线性页表为了方便理解概念可以把页表想象成一个超大的一维数组数组长度 2272^{27}227个条目PTE正好对应 27 位虚拟页号(VPN)虚拟页号(VPN)直接当数组下标就能查到对应的物理页号这个模型理解起来最简单但有个致命问题太浪费内存。每个 PTE 占 8 字节一整张线性页表就要227×81GB2^{27} × 8 1 GB227×81GB。一个进程就占 1GB 页表现实中根本不可能。实际硬件三级页表xv6 实际使用为了节省内存硬件把 27 位虚拟页号(VPN) 拆成了3 段每段 9 位对应三级页表层级位数对应虚拟地址段单级页表大小L2根页表 / 最高级9 位第 30 ~ 38 位292^929 512 个 PTE共 4KB正好占 1 页L1中间级9 位第 21 ~ 29 位同上512 个 PTE4KB 一页L0最低级 / 叶子级9 位第 12 ~ 20 位同上512 个 PTE4KB 一页每级页表正好 512 个条目 × 8 字节 4096 字节刚好放进一个物理页里。这不是巧合是专门设计的。比喻线性页表 一本写满所有地址的超级厚电话本大部分页面都是空的非常占地方。三级页表 省→市→街道三级目录。没人住的街道就不用建目录页大大节省空间。只有真正用到的地址区域才会分配对应的页表页。页表条目PTE里存了什么每个 PTE 是一个 64 位的整数核心分两部分高 44 位物理页号PPN物理地址总共 56 位扣掉低 12 位页内偏移剩下 44 位就是物理页号。翻译地址时把这里的 PPN 拿出来拼上虚拟地址的低 12 位偏移就得到了完整的 56 位物理地址。低 10 位标志位用来控制这个页的权限和状态xv6 常用的标志位有 6 个标志位含义PTE_V (第 0 位)有效位。为 1 表示这个 PTE 可用为 0 表示空条目PTE_R (第 1 位)可读权限PTE_W (第 2 位)可写权限PTE_X (第 3 位)可执行权限PTE_U (第 4 位)用户态可访问。为 0 的话只有内核态能访问这个页PTE_A / PTE_D访问位 / 脏位记录页面是否被读写过用于置换算法关键规则如果 PTE_V 是 0后面的 PPN 和其他标志位全部无效代表这个虚拟页没有映射到物理内存。完整的地址翻译过程硬件自动完成CPU 拿到一个虚拟地址后会自动通过页表完成翻译整个过程不需要软件干预具体分 4 步拿到根页表地址CPU 里有个专门的寄存器satp里面存着当前进程根页表L2 级的物理页号(PPN)。每个进程有自己独立的页表进程切换时内核会修改satp。查 L2 级页表取出虚拟地址的 L2 索引第 30~38 位共 9 位作为下标去根页表里找对应的 PTE。如果 PTE 无效V0触发缺页异常page fault交给内核处理如果有效从 PTE 中取出 L1 级页表的物理地址查 L1 级页表取出虚拟地址的 L1 索引第 21~29 位去 L1 页表里找下一级 PTE。同样判断有效性有效则取出 L0 级页表的物理地址。查 L0 级页表得到最终物理地址取出虚拟地址的 L0 索引第 12~20 位去 L0 页表里找到叶子 PTE。有效则取出 44 位物理页号 PPN把 PPN 左移 12 位拼上虚拟地址的低 12 位页内偏移得到最终的 56 位物理地址整个过程由 MMU内存管理单元硬件自动完成对程序完全透明。对应 xv6 内核源码的关键定义这些定义都在 kernel/riscv.h 里做实验时会频繁用到和上面的概念一一对应// kernel/riscv.h// 页大小与偏移#definePGSIZE4096// 一页4096字节#definePGSHIFT12// 页内偏移占12位// 提取每一级页表的索引9位#definePXMASK0x1FF// 9位掩码 0b111111111#definePXSHIFT(level)(PGSHIFT(9*(level)))#definePX(level,va)((((uint64)(va))PXSHIFT(level))PXMASK)// PTE 标志位#definePTE_V(1L0)// 有效#definePTE_R(1L1)// 可读#definePTE_W(1L2)// 可写#definePTE_X(1L3)// 可执行#definePTE_U(1L4)// 用户态可访问// 从 PTE 中提取物理页号 / 把物理页号打包成 PTE#definePTE2PA(pte)(((pte)10)12)#definePA2PTE(pa)((((uint64)pa)12)10)注意高 25 位不是随便写的Sv39 要求虚拟地址的第 38 位是符号位第 39~63 位必须和第 38 位保持一致符号扩展。如果随便填高位硬件会直接报地址错误。xv6 的用户地址空间从 0 开始内核地址空间从 0xffffffe000000000 开始就是为了符合符号扩展规则。页表本身存在物理内存里页表不是什么特殊的硬件结构就是普通的物理内存页内核在物理内存里分配页面来存放各级页表条目。satp里存的也是物理地址不是虚拟地址。三级页表是按需分配的不用的虚拟地址区域对应的中间级页表都不会分配这就是三级页表节省内存的核心原因。举个例子如果一个应用程序只使用了一个页面那么顶级页面目录将只使用条目0条目 1 到 511 都将被忽略因此内核不必为这511个条目所对应的中间页面目录分配页面也就更不必为这 511 个中间页目录分配底层页目录的页。 所以在这个例子中三级设计仅使用了三个页面共占用3×40963\times40963×4096个字节。

相关新闻

【2027最新】基于SpringBoot+Vue的学生心理压力咨询评判pf管理系统源码+MyBatis+MySQL

【2027最新】基于SpringBoot+Vue的学生心理压力咨询评判pf管理系统源码+MyBatis+MySQL

博主介绍:🌟 个人简介 CSDN特邀作者 | 掘金优质创作者,深耕Java生态与现代Web开发技术栈。专业领域涵盖Java企业级开发、Spring Boot微服务架构、前后端分离解决方案,以及学术项目的工程化实践。 📊 影响力数据 全平台…

2026/7/23 8:55:21 阅读更多 →
开源AI项目的长期维护复盘:依赖管理、兼容性与Breaking Change的处理哲学

开源AI项目的长期维护复盘:依赖管理、兼容性与Breaking Change的处理哲学

开源AI项目的长期维护复盘:依赖管理、兼容性与Breaking Change的处理哲学 一、维护比开发更难 AgenFlow项目在第6个月达到了2000 Star和15个活跃贡献者。但真正的问题才刚刚开始——项目要活着,不只是活得好。 三个维护痛点同时爆发: Go版本升…

2026/7/23 8:54:21 阅读更多 →
前端设计系统建设复盘:Design Token从理念到代码的落地全过程

前端设计系统建设复盘:Design Token从理念到代码的落地全过程

前端设计系统建设复盘:Design Token从理念到代码的落地全过程 一、设计的不一致性有多贵 某SaaS产品的UI经历2年开发后,积累了82种灰色值(不同组件用了不同的gray-100)、14种主色调变体、7套不同的圆角规则。设计师抱怨"开发…

2026/7/23 8:54:21 阅读更多 →

最新新闻

一次监管整改,全部门加班2个月,就因为没做超自动化巡检

一次监管整改,全部门加班2个月,就因为没做超自动化巡检

“通知下来了,下周三,监管现场检查。”这条消息让运维总监老张手里的咖啡杯差点没拿稳。距离上一次等保测评过去还不到一年,本以为可以安稳到年底,没想到监管的“回头看”抽查说来就来。更让老张心里发虚的是——他知道&#xff0…

2026/7/23 14:51:07 阅读更多 →
VirtualBox虚拟机安装与优化全指南

VirtualBox虚拟机安装与优化全指南

1. VirtualBox虚拟机入门:为什么选择它? VirtualBox作为Oracle旗下的开源虚拟化解决方案,已经成为个人开发者和小型团队的首选工具。我最初接触VirtualBox是在2013年,当时需要在一台Windows笔记本上测试Linux环境,经过…

2026/7/23 14:51:07 阅读更多 →
ARM Cortex-M4F内核架构深度解析:从FPU、NVIC到调试系统实战

ARM Cortex-M4F内核架构深度解析:从FPU、NVIC到调试系统实战

1. 项目概述在嵌入式开发的世界里,选对一颗“心脏”——微控制器(MCU)的处理器内核,往往决定了整个项目的性能上限和开发体验的下限。对于需要兼顾实时控制、信号处理甚至简单算法运算的应用,比如智能家居的网关、工业…

2026/7/23 14:51:07 阅读更多 →
契约测试如何减少前后端联调矛盾?Pact实战指南

契约测试如何减少前后端联调矛盾?Pact实战指南

1. 为什么契约测试能减少前后端矛盾?在传统开发流程中,前后端联调阶段往往成为项目瓶颈。根据我的团队实测数据,约65%的延期问题源于接口定义与实际实现的差异。常见矛盾点包括:字段类型不一致(如后端返回int而前端预期…

2026/7/23 14:51:07 阅读更多 →
SoapUI进阶:构建四层自动化测试体系与CI/CD集成实战

SoapUI进阶:构建四层自动化测试体系与CI/CD集成实战

1. 项目概述:从单点测试到流程闭环的蜕变 如果你是一名测试工程师或者后端开发,对“SoapUI”这个名字一定不陌生。它常被看作一个简单的Web Service接口测试工具,用来点点按钮、看看返回的XML或JSON对不对。但说实话,这种用法只发…

2026/7/23 14:51:07 阅读更多 →
毕业论文问卷收不到数据?2026年四类样本平台回收方案对比实测

毕业论文问卷收不到数据?2026年四类样本平台回收方案对比实测

前阵子帮社科专业的师妹梳理毕业论文,她卡在问卷数据回收环节。发了半个月社群和朋友圈,有效答卷才九十多份,还几乎都是同校同年龄段的学生,样本代表性严重不足,导师直接要求重新收集数据。这类问题我接触过不少&#…

2026/7/23 14:50:06 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/22 12:54:44 阅读更多 →

月新闻