MIT 6.1810 · Lab pgtbl · 页表
在本实验中,你将探索页表并修改它们以实现常见的操作系统功能。
在开始编码之前,阅读xv6 手册的第 3 章,以及相关文件:
$ git fetch
$ git checkout pgtbl
$ make clean
运行 make qemu 并运行用户程序 pgtbltest。print_pgtbl 函数使用我们为本实验添加到 xv6 的 pgpte 系统调用打印 pgtbltest 进程的前 10 页和后 10 页的页表项。
va 0 pte 0x21FCF45B pa 0x87F3D000 perm 0x5B
va 1000 pte 0x21FCE85B pa 0x87F3A000 perm 0x5B
...
va 0xFFFFD000 pte 0x0 pa 0x0 perm 0x0
va 0xFFFFE000 pte 0x21FD80C7 pa 0x87F60000 perm 0xC7
va 0xFFFFF000 pte 0x20001C4B pa 0x80007000 perm 0x4B
对于 print_pgtbl 输出中的每个页表项,解释它逻辑上包含什么以及它的权限位是什么。教材中的图 3.4 可能有帮助。
创建每个进程时,在 USYSCALL(在 memlayout.h 中定义的虚拟地址)映射一个只读页。在此页的开头存储一个 struct usyscall(也在 memlayout.h 中定义),并将其初始化为存储当前进程的 PID。
一些提示:
哪些其他 xv6 系统调用可以使用这个共享页变得更快?解释如何做到。
我们添加了一个系统调用 kpgtbl(),它调用 vm.c 中的 vmprint()。你的工作是以描述的格式打印该页表。
page table 0x0000000087f22000
..0x0000000000000000: pte 0x0000000021fc7801 pa 0x0000000087f1e000
.. ..0x0000000000000000: pte 0x0000000021fc7401 pa 0x0000000087f1d000
.. .. ..0x0000000000000000: pte 0x0000000021fc7c5b pa 0x0000000087f1f000
一些提示:
RISC-V 分页硬件支持两兆字节页以及普通的 4096 字节页。大页的一般概念称为超级页,2M 页称为兆页。
你的工作是修改 xv6 内核以使用超级页。特别是,如果用户程序使用 2 兆字节或更大的大小调用 sbrk(),并且新创建的地址范围包括一个或多个两兆字节对齐且至少两兆字节的区域,内核应该使用单个超级页。
一些提示:
创建一个新文件 time.txt,放入一个整数,表示你花在实验上的小时数。
将你的答案写在 answers-pgtbl.txt 中。
运行 make zipball,上传到 Gradescope。