MIT 6.1810 · Lab Util · Unix 工具
本实验将使你熟悉 xv6 及其系统调用。你将实现一些常见的 Unix 工具。
查看官方实验工具页面了解如何设置计算机以运行这些实验。
获取 xv6 源的 git 仓库:
$ git clone git://g.csail.mit.edu/xv6-labs-2025
Cloning into 'xv6-labs-2025'...
...
$ cd xv6-labs-2025
本实验和后续实验需要的文件使用 Git 版本控制系统分发。对于每个实验,你将检出为该实验定制的 xv6 版本。
Git 允许你跟踪对代码所做的更改。例如,如果你完成了其中一个练习并想要检查进度,可以通过运行以下命令提交更改:
$ git commit -am 'util lab exercise 1 的解决方案'
Created commit 60d2135: util lab exercise 1 的解决方案
1 files changed, 1 insertions(+), 0 deletions(-)
$
构建并运行 xv6:
$ make qemu
riscv64-unknown-elf-gcc -c -o kernel/entry.o kernel/entry.S
...
nmeta 46 (boot, super, log blocks 30 inode blocks 13, bitmap blocks 1) blocks 954 total 1000
balloc: first 591 blocks have been allocated
balloc: write bitmap block at sector 45
qemu-system-riscv64 -machine virt -bios none -kernel kernel/kernel -m 128M -smp 3 -nographic -drive file=fs.img,if=none,format=raw,id=x0 -device virtio-blk-device,drive=x0,bus=virtio-mmio-bus.0
xv6 kernel is booting
hart 2 starting
hart 1 starting
init: starting sh
$
如果你在提示符下键入 ls,应该会看到类似以下的输出:
$ ls
. 1 1 1024
.. 1 1 1024
README 2 2 2227
xargstest.sh 2 3 93
cat 2 4 32864
echo 2 5 31720
...
console 3 20 0
这些是 mkfs 包含在初始文件系统中的文件;大多数是可以运行的程序。你刚刚运行了其中之一:ls。
xv6 没有 ps 命令,但如果你键入 Ctrl-p,内核会打印每个进程的信息。
要退出 qemu,键入:Ctrl-a x(同时按 Ctrl 和 a,然后按 x)。
为 xv6 实现一个用户级 sleep 程序,类似于 UNIX sleep 命令。你的 sleep 应该暂停用户指定的 tick 数。tick 是 xv6 内核定义的时间概念,即定时器芯片两次中断之间的时间。你的解决方案应该在文件 user/sleep.c 中。
一些提示:
从 xv6 shell 运行程序:
$ make qemu
...
init: starting sh
$ sleep 10
(一段时间内什么也不会发生)
$
在命令行(qemu 外部)运行 make grade 看看是否通过 sleep 测试:
$ ./grade-lab-util sleep
对于每个输入文件,sixfive 必须打印文件中所有 5 或 6 的倍数的数字。数字是由字符串 " -\r\t\n./," 中的字符分隔的十进制数字序列。因此,对于 "xv6" 中的 six,sixfive 不应该打印 6,但对于 "/6,",应该打印。
$ sixfive sixfive.txt
5
100
18
6
$
一些提示:
这个练习将使你更多地练习使用 C 指针。在开始之前,阅读 K&R 的《C 程序设计语言》第 5.1 节(指针和地址)到 5.6 节(指针数组)和第 6.4 节(指向结构的指针)。
查看 user/memdump.c。你的工作是实现 memdump(char *fmt, char *data, int len) 函数。memdump() 的目的是以 fmt 参数描述的格式打印 data 指向的 len 个有效字节的内容。
你的 memdump() 应该处理以下格式字符:
实现 memdump()。
为 xv6 编写一个简单版本的 UNIX find 程序:查找目录树中具有特定名称的所有文件。你的解决方案应该在文件 user/find.c 中。
一些提示:
为 find 添加 "-exec cmd" 选项,对 find 找到的每个文件 f 执行 "cmd file" 程序,而不是打印匹配的文件名。
$ find . wc -exec echo hi
hi ./wc
$
一些提示:
创建一个新文件 time.txt,放入一个整数,表示你花在实验上的小时数。git add 和 git commit 该文件。
如果本实验有问题,将你的答案写在 answers-*.txt 中。git add 和 git commit 这些文件。
作业提交由 Gradescope 处理。准备好后,运行 make zipball,将生成 lab.zip。将此 zip 文件上传到相应的 Gradescope 作业。