本实验让您熟悉xv6及其系统调用。
官方文档:
https://pdos.csail.mit.edu/6.828/2020/labs/util.html
注:目前MIT 2020秋季实验课程网站文档不全,最好参考2019年秋季的课程。
https://pdos.csail.mit.edu/6.828/2019/labs/util.html
1. 启动 xv6
使用命令uname -a查看系统是否为:i386 GNU/Linux、i686 GNU/Linux或x86_64 GNU/Linux。我用的机器系统信息如下,符合要求。
获取xv6源代码并检出util分支。
$ git clone git://github.com/mit-pdos/xv6-riscv-fall19.git
$ cd xv6-riscv-fall19
$ git checkout util
xv6-riscv-fall19存储库与书中的xv6riscv略有不同,目的是使实验更容易。
构建xv6。
$ make
$ make qemu
紧接着会看到xv6正在启动,然后出现'$',此时就在xv6环境中。
如果你在命令行输入ls,应该会看到类似于下面的输出:
2. sleep
为xv6实现Unix Sleep调用调用,在Sleep系统调用中指明一段时长,一般用ticks表示,tick是内核中定义的一个概念,代表两次时钟中断之间的时间长度。程序存放在user/sleep.c。
一些提示:
· 你可以通过查看/user下的其他程序来学习如何将命令行参数传入程序。如果用户忘记传入参数,sleep程序应该打印error信息。
· 命令行参数作为字符串传递,你可以使用atoi将它转换成一个整数(见user/ulib.c)。
· 使用系统调用 sleep(见user/usys.S 与 kernel/sysproc.c)。
· 确保 main 调用 exit() 来退出程序。
· 在makefile中将程序添加到UPROGS并通过 make fs.img 来编译程序。
· 阅读Kernighan and Ritchie’s book The C programming language (second edition) (K&R) 来学习C语言。
查看一下其他程序如何编制,比如mkdir。
如法炮制sleep.c
#include "kernel/types.h"
#include "user/user.h"
int
main(int argc, char *argv[])
{
if (argc != 2) {
fprintf(2,"Usage: sleep <ticks>\n");
exit();
}
int x = atoi(argv[1]);
fprintf(1,"Sleep %d\n",x);
sleep(x);
exit();
}
在Makefile中将程序添加到UPROGS并通过 make fs.img 来编译程序。
$ make clean
$ make qemu
运行sleep