Lab: Xv6 and Unix utilities
本实验室将帮助熟悉xv6及其系统调用
1.Boot xv6 (easy)
配置环境: 详细请见:Lab0
获取实验室的xv6源代码并签出util分支
1 | $ git clone git://g.csail.mit.edu/xv6-labs-2021 |
xv6-labs-2021存储库与本书的xv6-riscv略有不同。它主要是添加一些文件。如果你好奇,可以看看git日志:
1 | $ git log |
本次作业和后续实验作业所需的文件使用Git版本控制系统分发。上面你切换到一个分支(git checkout util),其中包含为这个实验室定制的xv6版本。要了解有关Git的更多信息,请查看Git用户手册(Git user’s manual),或者你可能会发现这个面向cs的Git概述很有用。Git允许你跟踪对代码所做的更改。例如,如果你完成了其中一个练习,想检查进度,可以执行以下命令提交修改:
1 | $ git commit -am 'my solution for util lab exercise 1' |
Build and run xv6:
1 | $ make qemu |
产生如下报错该怎么解决:
1 | user/sh.c:58:1: error: infinite recursion detected [-Werror=infinite-recursion] |
解决方法:在xv6-labs-2021/user/sh.c文件中, runcmd函数上面添加设置特殊属性的宏
1 | __attribute__((noreturn)) |
如果在提示符下输入ls,您应该看到类似以下的输出:
1 | . 1 1 1024 |
这些是mkfs包含在初始文件系统中的文件;大多数是可以运行的程序。你刚刚运行了其中一个:ls。
xv6没有ps命令,但如果你键入Ctrl-p,内核将打印每个进程的信息。如果你现在尝试一下,会看到两行代码:一行用于init,另一行用于sh。
ps 命令是 Linux/Unix 系统中一个非常重要和常用的进程查看和控制命令, process status 的缩写,它可以用来显示当前系统的进程状态。
退出qemu输入:Ctrl-a x。
2.sleep (easy)
1 | 为xv6实现UNIX程序睡眠。您的睡眠应该暂停用户指定的时钟次数。时钟是一个时间概念,由xv6内核定义,即定时器芯片两次中断之间的时间。你的解决方案应该在文件user/sleep.c中 |
一些暗示:
- 在开始编写代码之前,请阅读此书的第1章
- 看看user/中的其他程序(例如user/echo.c、user/grep.c和user/rm.c),看看如何获得传递给程序的命令行参数。
- 如果用户忘记传递参数,sleep应该打印一条错误消息
- 命令行参数是一个字符串;你可以使用atoi将其转换为整数(参见user/ulib.c)
- 使用系统调用sleep
- 有关实现sleep系统调用的xv6内核代码,请参见kernel/sysproc, user/user.h是用户程序中可调用的sleep的C定义,user/usys.S表示从用户代码跳转到内核休眠的汇编代码。
- 确保main调用exit()以退出程序
- 在Makefile中添加睡眠程序;完成这一步后,make qemu将编译程序,这样就可以在xv6 shell中运行它了。
关于上面提到的user/echo.c,user/grep.c,user/rm.c,user/ulib.c,kernel/sysproc, user/user.h,user/usys.S需要一一进行解读