目录
- Task
- Task 1: Print a page table
Task
Task 1: Print a page table
该实验需要增加一个 vmprint 函数,用于打印一个 page table,实现过程可以参考 vm.c 文件中的 freewalk() 函数。
在 defs.h 中增加 vmprint 的定义:
void vmprint(pagetable_t);
在 vm.c 中代码如下:
// 打印一行 PTE
void print_pte(int index, pte_t pte, uint64 pa, int level) {for (int j = level; j > 0; j--) {if (j != 1) {printf(".. ");} else {printf("..");}}printf("%d: pte %p pa %p\n", index, pte, pa);
}// 递归地打印 page table
void display_pt(pagetable_t pagetable, int level) {static const int PTE_NUMBERS = 512; // 每个 page 的 PTE 数量for (int i = 0; i < PTE_NUMBERS; i++) {pte_t pte = pagetable[i];if ((pte & PTE_V) && (pte & (PTE_R|PTE_W|PTE_X)) == 0) {uint64 child = PTE2PA(pte);print_pte(i, pte, child, level);display_pt((pagetable_t) child, level + 1);} else if (pte & PTE_V) {print_pte(i, pte, PTE2PA(pte), level);}}
}/*** display the page table*/
void
vmprint(pagetable_t pagetable)
{printf("page table %p\n", pagetable);display_pt(pagetable, 1);
}
在 exec.c 的 exec()
函数中,return argc
之前增加对 vmprint 的调用:
int
exec(char *path, char **argv)
{...if (p->pid == 1) {vmprint(p->pagetable);}return argc;...
}
实现结果:输入 make qemu
后