diff --git a/Makefile b/Makefile index bb312a0..7ba13bf 100644 --- a/Makefile +++ b/Makefile @@ -343,7 +343,7 @@ grade: @echo $(MAKE) clean @$(MAKE) clean || \ (echo "'make clean' failed. HINT: Do you have another running instance of xv6?" && exit 1) - ./grade-lab-$(LAB) $(GRADEFLAGS) + python3.12 ./grade-lab-$(LAB) $(GRADEFLAGS) ## ## FOR submissions diff --git a/kernel/exec.c b/kernel/exec.c index 6d7c452..ad7a108 100644 --- a/kernel/exec.c +++ b/kernel/exec.c @@ -128,6 +128,10 @@ exec(char *path, char **argv) p->trapframe->sp = sp; // initial stack pointer proc_freepagetable(oldpagetable, oldsz); + if (p->pid == 1) { + vmprint(p->pagetable); + } + return argc; // this ends up in a0, the first argument to main(argc, argv) bad: diff --git a/kernel/vm.c b/kernel/vm.c index 1e9a6d8..c2bc210 100644 --- a/kernel/vm.c +++ b/kernel/vm.c @@ -17,6 +17,9 @@ extern char etext[]; // kernel.ld sets this to end of kernel code. extern char trampoline[]; // trampoline.S +// void sub_vmprint(pagetable_t pagetable, int level); + + // Make a direct-map page table for the kernel. pagetable_t kvmmake(void) @@ -491,14 +494,88 @@ copyinstr(pagetable_t pagetable, char *dst, uint64 srcva, uint64 max) #ifdef LAB_PGTBL -void -vmprint(pagetable_t pagetable) { - // your code here +void vmprint(pagetable_t pagetable); + +static void print_pte_flags(pte_t pte) { + if (pte & PTE_R) printf("R"); + if (pte & PTE_W) printf("W"); + if (pte & PTE_X) printf("X"); + if (pte & PTE_U) printf("U"); +} + +static void vmprint_recursive(pagetable_t pagetable, int level, uint64 va_base) { + for (int i = 0; i < 512; i++) { + pte_t pte = pagetable[i]; + if (pte & PTE_V) { + uint64 pa = PTE2PA(pte); + + for (int j = 0; j < level; j++) + printf(" .."); + + printf("%d: pte %p pa %p", i, (void*)pte, (void*)pa); + + // 如果是叶子节点,打印 va 和 flags + if ((pte & (PTE_R | PTE_W | PTE_X)) != 0) { + uint64 va = va_base + ((uint64)i << (9 * (2 - level))); + printf(" va %p flags ", (void*)va); + print_pte_flags(pte); + } + printf("\n"); + + // 不是叶子节点,递归下一级页表 + if ((pte & (PTE_R | PTE_W | PTE_X)) == 0) { + vmprint_recursive((pagetable_t)pa, level + 1, + va_base + ((uint64)i << (9 * (2 - level)))); + } + } + } +} + +void vmprint(pagetable_t pagetable) { + printf("page table %p\n", pagetable); + vmprint_recursive(pagetable, 0, 0); } #endif - - - +// #ifdef LAB_PGTBL +// void +// vmprint(pagetable_t page_tbl){ +// printf("page table %p\n", page_tbl); +// +// for (int i = 0; i < 512; i++) { +// pte_t pte = page_tbl[i]; +// if ((pte & PTE_V)) { +// uint64 pa = PTE2PA(pte); +// printf("..%d: pte %lx pa %lx\n", i, (uint64)pte, pa); +// +// if ((pte & (PTE_R | PTE_W | PTE_X)) == 0) { +// // 这是指向下一级页表的项 +// sub_vmprint((pagetable_t)pa, 1); +// } +// } +// } +// } +// +// void sub_vmprint(pagetable_t pagetable, int level) { +// for (int i = 0; i < 512; i++) { +// pte_t pte = pagetable[i]; +// if (pte & PTE_V) { +// uint64 pa = PTE2PA(pte); +// +// // 打印缩进 +// for (int j = 0; j < level; j++) { +// printf(" .."); +// } +// +// printf("%d: pte %lx pa %lx\n", i, (uint64)pte, pa); +// +// if ((pte & (PTE_R | PTE_W | PTE_X)) == 0) { +// sub_vmprint((pagetable_t)pa, level + 1); +// } +// } +// } +// } +// #endif +// #ifdef LAB_PGTBL pte_t* pgpte(pagetable_t pagetable, uint64 va) {