XV6 Labs

参考

Lab Utils

  • Slepp实验:写一个用户程序,调用sleep system call实现,执行sleep 10,表示程序等待10个时钟周期
  • pingpong实验:写一个程序,使用unix system calls在两个进程间”ping-pong“一个字节,使用一对pipe,一个pipe对应一个方向,另外一个pipe对应另外一个方向
  • find实验:实现find用户程序 ,即在某个路径中,找出某个文件
  • xargs实验:实现类似unix xargs类似功能,比如echo hello too|xargs echo bye,要输出bye hello too

Lab System Calls

  • System call tracing实验:实现trace系统调用,跟踪指定的系统调用
  • Sysinfo实验:实现一个sysinfo 系统调用,可以实现打印当前空闲内存大小(字节)、可用进程数

Lab Page tables

  • Print a page table实验:定义一个函数,接收一个页表基址,并按指定格式打印各级PTE的地址和内容
  • A kernel page table per process实验:原始XV6中每个进程的PCB里只有用户空间的页表,该实验需要修改PCB,让每个进程也维护一个独立的内核页表,且该内核页表与全局的内核页表相同
  • Simplify copyin/copyinstr实验:在上一个lab的基础上,在每个进程的内核页表中,也加上用户空间的映射。这样的话在内核中调用copyin/copyinstr就可以直接使用用户空间的地址了,不必像之前那样,由于内核页表中没有用户空间地址的映射,得先手动把传入的user_addr翻译成物理地址再进行数据的传递

Lab Traps

  • Back trace实验:在内核中实现一个backtrace()函数,通过边历各级栈帧打印当前的函数调用链
  • Alarm实验:添加一个新的sigalarm(interval, handler)系统调用(类似一个用户级的中断)。如果一个应用调用sigalarm(n, fn),那么在每n ticks个cpu time后,kernel应该导致应用函数fn被调用

Lab Lazy allocation

  • Eliminate allocation from sbrk()实验:为实现内存惰性分配做铺垫,在使用该函数时,内核不再立即分配物理内存,仅修改PCB里的堆顶位置变量sz
  • Lazy allocation实验:实现内核对于来自用户空间的page fault的处理,实现内存惰性分配
  • Lazytests and Usertests实验:继续修改内核内存分配相关的代码,让这些测试全能通过,主要是处理一些特殊情况

Lab Copy on Write

  • COW fork实验:利用page fault实现fork系统调用的写时复制机制

Lab Multithreading

  • Uthread:switching between threads实验:实现用户级的线程
  • Using threads实验:优化用户级的线程
  • Barrier实验:实现同步屏障

Lab Lock

  • 分别在物理内存⻚管理和⽂件缓存⻚管理这两个场景中降低锁竞争,提⾼并发程度进⽽提升性能

Lab File system

  • 让xv6支持大文件(原来只支持268MB以下的⽂件)
  • 实现符号链接(软链接)

Lab mmap

  • 实现mmap系统调用

Lab network driver

  • 为网卡(NIC)编写⼀个xv6设备驱动程序

简历写法