第一个实验:打印页表
主要参考vm.c中的freewalk,
void vm_dg(pagetable_t pagetable, int depth) {
for(int i = 0; i < 512; i++){
pte_t pte = pagetable[i];
if(pte & PTE_V) {
for (int i = 0; i < depth; ++i) {
if (i != 0) {
printf(" ");
}
printf("..");
}
uint64 child = PTE2PA(pte);
printf("%d: pte %p pa %p\n", i, pte, child);
// 判断是否是最底层
if ((pte & (PTE_R|PTE_W|PTE_X)) == 0) {
vm_dg((pagetable_t)child, depth + 1);
}
}
}
}
void vmprintf(pagetable_t pagetable) {
// there are 2^9 = 512 PTEs in a page table.
printf("page table %p\n", pagetable);
vm_dg(pagetable, 1);
}
其中要注意的地方就是判断是否是最底层,如果是最底层,就不进行递归了。
然后在相应地方定义并在exec.c中按要求添加代码即可。