该实验需要增加一个 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
后