当前位置: 首页> 财经> 访谈 > 中国企业新闻网_自助建站网站seo公司_搜索引擎google_精准网络推广

中国企业新闻网_自助建站网站seo公司_搜索引擎google_精准网络推广

时间:2025/8/26 0:22:34来源:https://blog.csdn.net/baidu_41944641/article/details/146991140 浏览次数:1次
中国企业新闻网_自助建站网站seo公司_搜索引擎google_精准网络推广

实验内容

  • 实现一个函数来打印页表的内容,帮助我们更好地理解 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)
关键字:中国企业新闻网_自助建站网站seo公司_搜索引擎google_精准网络推广

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: