当前位置: 首页 > news >正文

MIT6.828 Lab3-2 Print a page table (easy)

实验内容

  • 实现一个函数来打印页表的内容,帮助我们更好地理解 xv6 的三级页表结构。

修改内容

  • kernel/defs.h中添加函数声明,方便其它函数调用
void            vmprint(pagetable_t);// lab3-2 Print a page table
  • kernel/vm.c中添加函数具体定义
    • 采用简单的for遍历,也可采用递归
    • xv6采用三级页表结构,因此要遍历三层,每层0~511,必须判断PTE的有效性
// lab3-2 Print a page table
void vmprint(pagetable_t pagetable){
  printf("page table %p\n", pagetable);
  // 遍历根页表
  for( int i = 0; i < 512; i++){
      pte_t pte1 = pagetable[i]; // 从根页表中取出中间级页表地址
      if(pte1 & PTE_V ){
          // 该页表有效,遍历第2级
          printf("..%d: pte %p pa %p\n", i, pte1, PTE2PA(pte1));
          pagetable_t pmd = (pagetable_t)PTE2PA(pte1);

          for( int j = 0; j < 512; j++){
            pte_t pte2 = pmd[j]; // 从中间表中取出第3级页表地址
            if(pte2 & PTE_V ){
                // 该页表有效,遍历第3级
                printf(".. ..%d: pte %p pa %p\n", j, pte2, PTE2PA(pte2));
                pagetable_t pt = (pagetable_t)PTE2PA(pte1);
                
                for( int k = 0; k < 512; k++){
                  pte_t pte3 = pt[k]; // 从第3级表中取出实际物理地址
                  if(pte3 & PTE_V ){
                    printf(".. .. ..%d: pte %p pa %p\n", k, pte3, PTE2PA(pte3));
                  }
                }
            }

          }
      }

  }
}
  • PTE2PA(pte) 是一个关键宏,用于从页表项(Page Table Entry, PTE)中提取其指向的物理地址
    • 由于页表项包含了地址和标志位,因此要处理掉标志位,即(pte) >> 10)
    • 因为偏移地址是12位,进一步转换到基址,即((pte) >> 10) << 12
  • 关于pagetable_t的定义在kernel/riscv.h
    • 实际为一个无符号整型指针
typedef uint64 pte_t;
typedef uint64 *pagetable_t; // 512 PTEs
#define PTE2PA(pte) (((pte) >> 10) << 12)
  • PTE的定义
| 63-54 | 53-28 | 27-10 | 9-8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| 保留  | PPN   | 保留   | RSW | D | A | G | U | X | W | R | V |
  • kernel/exec.c中调用vmprint,将进程的根页表传递过去
  // lab3-2 
  if( p->pid == 1 ){
    vmprint( p->pagetable );
  }
  return argc; // this ends up in a0, the first argument to main(argc, argv)
http://www.dtcms.com/a/109940.html

相关文章:

  • 大数据学习(98)-数据治理
  • 预测分析(二):基于机器学习的数值预测
  • 【大模型基础_毛玉仁】6.3 知识检索
  • API接口调用
  • 通信算法之256: 无人机Remote ID(远程识别)
  • adc推荐,单通道,双极性采集
  • 最近常用 python 记录
  • 环境数据综合分析系统
  • 贤小二c#版Yolov5 yolov8 yolov10 yolov11自动标注工具 + 免python环境 GPU一键训练包
  • 贴片加工SMT厂核心工艺解析
  • 码界奇缘 Java 觉醒 第二章 变量迷城
  • 计算机网络-TCP的重传机制
  • 清晰易懂的 Flutter 开发环境搭建教程
  • java短连接,长连接
  • Linux命令-uniq
  • RAGFlow部署与使用介绍-深度文档理解和检索增强生成
  • 本地部署 Firecrawl 爬虫让 AI 知识库更丰满
  • Java创建对象和spring创建对象的过程和区别
  • AI赋能数据库管理“最后一公里”,融合架构重塑数据库承载成本效能——zCloud 6.7与zData X 3.3正式发布
  • MonkeyDev 如何创建一个root级级别的app,并执行root命令获取iphone设备序列号serialNumber(ios15.8)
  • 航电系统之承重与避障技术
  • “二分查找 + (必要时)前缀和” -- 处理 ’有序数组‘ 的区间问题汇总
  • 信息学奥赛一本通 1524:旅游航道
  • 胶铁一体化产品介绍
  • 什么是 SAML身份验证
  • 【DY】信息化集成化信号采集与处理系统;生物信号采集处理系统一体机
  • Qt实现登录界面(输入密码后过几秒,密码变为小黑点,眼睛改变密码明文,密文)
  • 电子电气架构 --- SOC设计流程及其集成开发环境
  • 企业知识库如何搭建?从零开始构建高效知识管理体系
  • 【Spring】Spring 注解解码:@RequestBody 与 @ResponseBody 的双向桥梁艺术