[db:标题]
摘要:Lab: Xv6 and Unix utilities 在这个,也是第一个Lab当中6.1810Fall 2025,它会要求你通过git拉取最基本的内核代码,然后cd到内核代码目录当中,通过指定的指令(下面会介绍)即可构建起xv6
Lab: Xv6 and Unix utilities
在这个,也是第一个Lab当中6.1810 / Fall 2025,它会要求你通过git拉取最基本的内核代码,然后cd到内核代码目录当中,通过指定的指令(下面会介绍)即可构建起xv6操作系统。
1.拉取基本代码
注意:由于之前Lab0 配置环境的搭建以及前言 && MIT6.1810操作系统工程 的文章中提过本人的环境(Win11当中的ubuntu子系统),因此本人在这里就不再过多强调了。
我们通过官网给出的的指令:git clone git://g.csail.mit.edu/xv6-labs-2025 来拉取代码到本地目录,过程会耗费一些时间,github的服务器在海外,所以会下载的很慢,慢慢等就好了。
在拉取完成后,我们通过指令cd xv6-labs-2025来切换到我们刚才拉取的目录。
2.构建并且运行xv6
构建xv6所用的qemu的版本需要≥7.2.0,因此我们可以通过在系统终端指令:
qemu-system-riscv64 --version
来确认我们的qemu版本,如果qemu不是7.2.0则需要更新,又因为可能会存在这样的情况:官方源最高支持到qemu 6.x.x,所以这边建议下载≥ qemu 7.2.0版本的源代码然后自己编译它安装(具体问AI)。
假设你已经安装好了,确保我们在xv6-labs-2025目录当中,之后在命令行输入:make qemu指令来构建xv6,当我们能看到:
xv6 kernel is booting
hart 2 starting
hart 1 starting
init: starting sh
$
出现这些字样后代表编译成功!如果编译出错多半是因为qemu版本的问题(上面有解决方法),小概率是文件权限的问题(你可能在拉取代码时使用了sudo),权限的问题可以先尝试sudo make qemu,如果不行再问AI。
现在内核已经被启动,接下来你可以通过Ctrl +a 再按x退出xv6的终端,返回ubuntu的终端。然后输入指令“code ./来启动vscode,启动完成后,vscode的页面左侧的文件就是xv6的内核文件,其中kernel 目录 下是内核态源码,user下是用户态源码。
3.实现sleep用户程序【简单】
这一部分要求我们实现一个运行在用户态的程序sleep,这个sleep会调用pause()这个系统调用来挂起进程,成品的效果是输入sleep n后xv6内核会挂起当前的用户进程n个时钟滴答数(ticks),具体多少多次时间一滴答我不太清楚。
官网的原文:
Implement a user-level sleep program for xv6, along the lines of the UNIX sleep command. Your sleep should pause for a user-specified number of ticks. A tick is a notion of time defined by the xv6 kernel, namely the time between two interrupts from the timer chip. Your solution should be in the file user/sleep.c.
要求我们把sleep的程序写入user/sleep.c当中,我们可以在user目录下寻找sleep.c文件,如果没有的话就自己创建一个sleep.c文件在user目录下。
在编码前,我们先看看来自官网的提示:
在开始编码前,请阅读 xv6 书籍的第 1 章。
将你的代码写在 user/sleep.c 文件中。参考 user/ 目录下的其他程序(例如 user/echo.c、user/grep.c 和 user/rm.c),了解命令行参数是如何传递给程序的。
将你的 sleep 程序添加到 Makefile 的 UPROGS 列表中;完成这一步后,执行 make qemu 会编译你的程序,且你能在 xv6 的 shell 中运行它。
如果用户忘记传递参数,sleep 程序应当打印一条错误信息。
命令行参数是以字符串形式传递的;你可以使用 atoi 函数将其转换为整数(参考 user/ulib.c)。
使用 pause() 系统调用来让进程暂停。
