MIT 6.S081 pgtbl 实验篇(lab3):Print a page table (easy)
Print a page table (easy)实验目标本实验要求我们在 xv6 内核中实现vmprint()函数给定一个页表按层级结构把它打印出来。当内核启动、加载第一个用户进程initpid1时打印它的页表作为对 Sv39 三级页表结构的直观验证。实验本身代码量很小真正的价值在于借打印过程吃透页表遍历walk的递归本质——这也是A kernel page table per process (hard)、Simplify copyin/copyinstr (hard)的基础。前置知识Sv39 三级页表在 Sv39 分页模式下虚拟地址到物理地址的翻译依赖一棵三级页表树三级指树的深度为 3根页表顶级页表Level-2的物理地址存放在satp寄存器中是这棵树的根节点。每一级页表都是一页 4KB4096 字节大小的内存包含512 个 PTE页表项对应 39 位虚拟地址中每段 9 位的索引2^9 512。PTE 的含义中间节点的 PTE 保存下一级页表的物理地址最后一级叶子节点的 PTE 保存最终映射的物理页地址。整棵树的遍历过程就是从satp指向的根页表出发依据虚拟地址的 3 段 9 位索引逐级下行直到抵达叶子节点取出物理页地址。实现思路复用 freewalk 的遍历骨架xv6 已经在kernel/vm.c中提供了freewalk()它递归遍历整棵页表树并释放页表页。我们的vmprint()与它的遍历逻辑完全一致区别只在于访问节点时做什么freewalk()遇到节点 → 递归子节点 → 最后kfree释放当前页表页vmprint()遇到节点 →打印信息→ 递归子节点 → 不释放。换句话说把释放换成打印骨架原封不动。先看一下freewalk()的实现// kernel/vm.c/* * 递归释放页表页本身不是用户数据页。 * 调用前所有叶子映射用户数据页必须已被移除。 * * 工作原理 * 遍历页表中的 512 个 PTE * - 如果 PTE 有效且没有 R/W/X 标志 → 它指向下一级页表递归释放 * - 如果 PTE 有效且有 R/W/X 标志 → 它是叶子 PTE说明用户数据页还没清除panic * 最后释放当前页表页本身。 */voidfreewalk(pagetable_tpagetable){// 每个页表页有 2^9 512 个 PTEfor(inti0;i512;i){pte_tptepagetable[i];// PTE 有效 没有 R/W/X → 这是指向下级页表的中间节点if((ptePTE_V)(pte(PTE_R|PTE_W|PTE_X))0){uint64 childPTE2PA(pte);freewalk((pagetable_t)child);// 递归释放子页表pagetable[i]0;// 清除当前 PTE}elseif(ptePTE_V){// PTE 有效且有 R/W/X → 叶子节点说明用户数据页还没被释放panic(freewalk: leaf);}}// 释放当前页表页本身kfree((void*)pagetable);}对照上面的逻辑实现vmprint()的关键点只有两个递归出口PTE 无效!PTE_V时直接continue不打印、也不再下行(xing)。区分中间节点与叶子用(pte (PTE_R|PTE_W|PTE_X)) 0判断——没有 R/W/X 权限位的 PTE 一定指向下一级页表中间节点需要继续递归否则就是叶子打印即可。代码实现kernel/vm.c实现vmprint与vmprint_helper// kernel/vm.cstaticintvmprint_helper(pagetable_tpagetable,intdepth){// There are 2^9 512 PTEs in a page tablefor(inti0;i512;i){pte_tptepagetable[i];if((ptePTE_V)0)/* 优先级 */continue;// 如果该 PTE 无效无需再打印对应的页表// 当前第 depth1 级页表打印 depth1 个 ..printf(..);for(inti0;idepth;i)printf( ..);// 按格式打印页表内容uint64 childPTE2PA(pte);printf(%d: pte %p pa %p\n,i,pte,child);// 如果该 PTE 对应的不是物理地址递归打印其对应的中间页表if((pte(PTE_R|PTE_W|PTE_X))0)vmprint_helper((pagetable_t)child,depth1);}return0;}intvmprint(pagetable_tpagetable){// 按格式打印顶级页表 pagetableprintf(page table %p\n,pagetable);// 递归打印中间页表returnvmprint_helper(pagetable,0);}格式说明用depth参数记录当前递归深度根页表为 0。每深入一级depth1就多打印一组..从而用缩进直观体现页表的层级关系——根页表项前缀..二级.. ..三级.. .. ..。小细节if ((pte PTE_V) 0)中的优先级高于所以必须加括号否则会被解析成pte (PTE_V 0)逻辑就错了。kernel/defs.h添加函数声明在defs.h的vm.c函数声明区追加一行让其他文件能调用vmprint// kernel/defs.h...// vm.c...intcopyin(pagetable_t,char*,uint64,uint64);intcopyinstr(pagetable_t,char*,uint64,uint64);intvmprint(pagetable_t);// Print a page tablekernel/exec.c在exec中触发打印按照实验要求在exec()函数的return argc之前插入调用。只打印 pid1 的进程即init避免每个进程启动都刷屏...p-trapframe-epcelf.entry;// initial program counter mainp-trapframe-spsp;// initial stack pointerproc_freepagetable(oldpagetable,oldsz);if(p-pid1)vmprint(p-pagetable);// Print a page table if pid 1returnargc;// this ends up in a0, the first argument to main(argc, argv)bad:...验证回到 xv6 目录执行makeqemu启动后内核加载init时会在串口输出类似下面的内容xv6 kernel is booting hart2starting hart1starting page table 0x0000000087f64000..0: pte 0x0000000021fd8001 pa 0x0000000087f60000....0: pte 0x0000000021fd7c01 pa 0x0000000087f5f000......0: pte 0x0000000021fd841f pa 0x0000000087f61000......1: pte 0x0000000021fd780f pa 0x0000000087f5e000......2: pte 0x0000000021fd741f pa 0x0000000087f5d000..255: pte 0x0000000021fd8c01 pa 0x0000000087f63000....511: pte 0x0000000021fd8801 pa 0x0000000087f62000......510: pte 0x0000000021fed807 pa 0x0000000087fb6000......511: pte 0x0000000020001c0b pa 0x0000000080007000 init: startingsh每一行的缩进层级对应页表的级pa即为该 PTE 指向的物理地址。能够正常打印即说明实现正确。复盘这些在做实验时经常用到当成常识就好页表遍历的递归本质三级页表天然是一棵树walk/freewalk/vmprint本质上都是对树做 DFS深度优先遍历区别仅在访问节点时做什么。中间节点 vs 叶子节点的判别靠PTE_R|PTE_W|PTE_X权限位——中间节点无权限位只指向下级页表叶子节点有权限位指向物理页。

相关新闻

前端直连LLM必踩2大致命坑!BFF中转流式SSE完整方案,一套代码解决密钥泄露+分片解析报错

前端直连LLM必踩2大致命坑!BFF中转流式SSE完整方案,一套代码解决密钥泄露+分片解析报错

前言 做Vue AI对话页面,90%新手会踩两个线上致命大坑: 前端直接请求DeepSeek接口:API Key打包进前端,抓包/查看源码直接泄露,被盗刷高额账单纯前端手写SSE流式解析:TCP网络分包截断JSON,疯狂报p…

2026/8/5 23:56:05 阅读更多 →
Gamma怎样用结构提示生成演示框架_Gamma用结构提示生成演示框架【结构提示】

Gamma怎样用结构提示生成演示框架_Gamma用结构提示生成演示框架【结构提示】

利用结构化提示能迅速弄出清晰的演示框架, 其一, 借助预定义模板输入涵盖引言、背景、核心技术等内容方向的提示, 其二, 运用分段式模块逐个生成引言、技术说明、案例与挑战分析再进行整合, 其三, 凭借“问题 - 原因 - 解决方案”等关键词触发内置结构模式来提升效率。具备AI智…

2026/8/5 23:56:05 阅读更多 →
基于pytest的企业级多租户自动化测试实践

基于pytest的企业级多租户自动化测试实践

1. 企业级多租户测试体系概述 在当今SaaS服务盛行的时代,多租户架构已成为企业级应用的标配。这种架构允许单个应用实例服务多个客户(租户),每个租户的数据和配置相互隔离。作为质量保障的关键环节,自动化测试体系必须…

2026/8/5 23:56:05 阅读更多 →

最新新闻

JMeter教程|0到1学会接口性能压测第12课-JMeter并发测试

JMeter教程|0到1学会接口性能压测第12课-JMeter并发测试

JMeter是一款开源免费的接口性能压测工具,在企业中用的较为广泛,上节我们学习了JMeter常用监听器。今天分享JMeter并发测试,后续文章都会系统分享干货,带大家从0到1学会JMeter,另外还有教程等同步资料,文末…

2026/8/6 0:54:24 阅读更多 →
ncmdump终极指南:专业解密网易云音乐NCM格式的完整方案

ncmdump终极指南:专业解密网易云音乐NCM格式的完整方案

ncmdump终极指南:专业解密网易云音乐NCM格式的完整方案 【免费下载链接】ncmdump ncmdump - 网易云音乐NCM转换 项目地址: https://gitcode.com/gh_mirrors/ncmdu/ncmdump 在数字音乐版权保护日益严格的今天,网易云音乐NCM格式转换成为众多音乐爱…

2026/8/6 0:54:24 阅读更多 →
AI写产品评测到底靠不靠谱?揭秘92%的评测文章被算法识别的3个致命破绽

AI写产品评测到底靠不靠谱?揭秘92%的评测文章被算法识别的3个致命破绽

更多请点击: https://codechina.net 第一章:AI写产品评测到底靠不靠谱?揭秘92%的评测文章被算法识别的3个致命破绽 当AI生成的评测文章在搜索引擎中批量涌现,平台反作弊系统正以前所未有的精度将其标记为“低信度内容”。第三方实…

2026/8/6 0:54:24 阅读更多 →
AI学日语到底靠不靠谱?实测12款工具+378小时数据对比,这3个模型真正改变学习轨迹

AI学日语到底靠不靠谱?实测12款工具+378小时数据对比,这3个模型真正改变学习轨迹

更多请点击: https://kaifayun.com 第一章:AI学日语到底靠不靠谱?实测12款工具378小时数据对比,这3个模型真正改变学习轨迹 过去三个月,我们对12款主流AI日语学习工具(含ChatGPT-4o、Claude 3.5 Sonnet、G…

2026/8/6 0:54:24 阅读更多 →
政务外网环境下视频监控资源整合:新增仓库接入实施方案

政务外网环境下视频监控资源整合:新增仓库接入实施方案

一、现状本项目处于政务外网严格的网络边界环境内。原仓库视频监控系统已稳定运行,包含13路存量监控点位,覆盖主要出入口及核心库区。二、需求接入策略与技术路线: 针对本次新建的12路监控摄像头,将严格遵循政务外网接入规范&…

2026/8/6 0:53:24 阅读更多 →
excel怎么转txt?盘点2026年7款PDF格式转换工具,覆盖单转与批量导出

excel怎么转txt?盘点2026年7款PDF格式转换工具,覆盖单转与批量导出

上个月给公司投标,好不容易把技术方案定稿,甲方突然说还得附一份单独的材料清单,格式必须是纯文本TXT。我手里只有一份完整的方案PDF,打开看着满屏的表格和条款,心里直犯嘀咕:难道要手动敲一遍?…

2026/8/6 0:52:23 阅读更多 →

日新闻

深入解析LimboAI C++内核:架构设计与性能优化实战

深入解析LimboAI C++内核:架构设计与性能优化实战

1. 项目概述:为什么我们需要深入LimboAI的C内核?如果你是一名使用Godot引擎的游戏开发者,尤其是对AI行为逻辑有较高要求的项目,那么LimboAI这个名字你大概率不会陌生。它作为Godot 4生态中一个备受瞩目的行为树与状态机插件&#…

2026/8/6 0:00:06 阅读更多 →
Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

1. 项目概述与核心思路大家好,我是老张,一个在游戏开发一线摸爬滚打了十多年的老码农。今天咱们接着聊《空洞骑士》风格2D动作游戏的Demo制作。上一期我们搭好了基础框架,处理了角色移动和碰撞,这一期,我们要让游戏世界…

2026/8/6 0:00:06 阅读更多 →
被动防火门市场前景发展趋势

被动防火门市场前景发展趋势

被动防火门依靠材质结构、密闭构造阻隔烟火蔓延,无需电控启动,是建筑被动消防系统核心构件,行业依托新规管控、城市更新、工业安全升级迎来稳定扩容,整体朝着合规化、专项化、低碳化、智能化方向发展。现阶段 GB12955‑2024 新版国…

2026/8/6 0:00:06 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/5 15:00:43 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/5 13:13:56 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/5 10:20:36 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/5 23:28:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/5 21:00:14 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/5 23:46:51 阅读更多 →