MIT6828 学习笔记 002 (lab utilities)
1. 准备工作 (ArchLinux)
1.1. 软件
我用的是 Arch ,其他发行版应该也有差不多的软件包
1 | sudo pacman -S riscv64-linux-gnu-binutils riscv64-linux-gnu-gcc riscv64-linux-gnu-gdb qemu-system-riscv |
1.2. 源码
1 | git clone https://github.com/mit-pdos/xv6-riscv.git |
好像这个更方便一点,里面有各个 lab 特化的 branch 和检验用的脚本:
1 git clone git://g.csail.mit.edu/xv6-labs-2022
如果一切都没问题的话,在源码目录下:
1 | make qemu |
应该就可以进入 Xv6 Shell 了
不知道为啥 Xv6 一启动就能把 load average 拉到 3 ,加上
CPUS=1可以把 load average 维持在 1.3 左右,风扇依然狂转, CPU 直升 80 度
2. 实验
2.1. sleep
在 Xv6 里实现 sleep 程序,源码放在 user/sleep.c 里。我的答案:
1 |
|
在 Makefile 174 行 UPROGS 里加上 _sleep 就可以在 make qemu 时编译并在运行 Xv6 时把写的 sleep 程序复制进去。
在 git://g.csail.mit.edu/xv6-labs-2022 clone 下来的话可以通过:
1 ./grade-lab-util sleep自动检测结果,我的运行结果:
1
2
3
4 make: 'kernel/kernel' is up to date.
== Test sleep, no arguments == sleep, no arguments: OK (0.6s)
== Test sleep, returns == sleep, returns: OK (0.9s)
== Test sleep, makes syscall == sleep, makes syscall: OK (1.0s)
2.2. pingpong
和 book 的 Chapter1 的练习题差不多,父进程向子进程发送一个字节,子进程应该输出 <pid>: received ping ,然后子进程向父进程发送一个字节后 exit ,父进程输出 <pid>: received pong 后 exit ,源码放在 user/pingpong.c ,我的答案:
1 |
|
2.3. primes
通过进程和管道采用这样的方式:

实现打印 2~35 之间的质数,源码放在 user/primes.c ,我的答案:
1 |
|
2.4. find
实现一个精简版的 find 源码放在 user/find.c ,我的答案:
1 |
|
如果
open失败了可以检查一下有没有close掉之前的 fd , Xv6 在kernel/param.h定义了NOFILE为16,也就是每个进程最多有 16 个 fd ,超过这个数会导致open失败。
2.5. xargs
实现一个简单的 xargs ,源码放在 user/xargs.c ,我的答案:
1 |
|
- 为了方便这里定义了
BUF_LEN,来自 stdin 的内容不能超过这个长度。 - 这里直接用了
main的argv里的其他参数,没有复制,为了能放进exec里没加const。 - 没看懂题目说用
-n 1是什么意思,反正这样写能过测试,不管了。