LAB 1: Utilities

了解应用层调用

sleep

进程睡眠n个tick(一个tick时间100毫秒)

pingpong

用fork和pipe创建父进程和子进程,互相发数据

primes

用fork和pip创建多个进程来计算质数

find

查找指定目录下的文件

xargs

为不支持管道的程序支持类似管道的功能

LAB 2: Syscall

了解kernel和user之间交互用的syscall

trace

输出选定范围的Syscall

sysinfo

输出系统剩余的内存空间和运行的进程数量

LAB 3: Pgtbl

了解Riscv架构下的页表和Xv6对于页表的管理

vmprint

输出页表里的所有页表项PTE(page table entry)和它们的物理地址

A kernel page table per process

应用程序的userpagetable都是从0开始到sz顺序存放的,所以要把userpagetable中的页表项复制到kernelpagetable只需要按proc的sz大小来确定计算地址

simplify copyin/copyinstr

做完上面一个步骤,这部就比较容易,核心是实现一个从用户页表复制所有pte到用户的内核页表的一个函数,用户页表是从0开始到sz*PGSIZE的地址,只需要按顺序一页一页存就好,需要注意虚拟地址不可以超过PLIC的地址(plic是RISC-v架构下的中断控制器,超过了这部分就会被覆盖),并且要把复制进内核的PTE的PTE_U flag置0,使得操作系统可以在内核态对用户程序的数据进行访问
注意这个lab的测试运算量比较大,如果用虚拟机需要把虚拟机配置调高或者把测试的超时时间调长,不然有机会超时不通过