最近开始学习操作系统的相关知识,选择学 MIT6.S081 的课程。

首先在 课程官方网站 上拉取仓库配置环境。

$ git clone git://g.csail.mit.edu/xv6-labs-2020
$ cd xv6-labs-2020
$ git checkout util
$ make qemu

make 时发现有报错:

user/sh.c: In function ‘runcmd’:
user/sh.c:58:1: error: infinite recursion detected [-Werror=infinite-recursion]
   58 | runcmd(struct cmd *cmd)
      | ^~~~~~

打开该文件发现:

// Execute cmd.  Never returns.
void
runcmd(struct cmd *cmd)

这里已经注释说明了这个函数不返回,但是并没有告诉编译器,因此应该加上注解:

// Execute cmd.  Never returns.
__attribute__ ((noreturn))
void
runcmd(struct cmd *cmd)

现在就可以 make 成功了。

但是又有了新的问题, qemu 无法加载系统,发现该项目最好在 Ubuntu20.04 上运行,我查看了一下 Ubuntu20.04 的 qemu 版本,是 4.2.1 ,比 Fedora 36 的低很多,我干脆直接编译安装得了。

qemu 官网 安装 4.2.1 ,并安装:

$ ./configure --prefix=/home/vandark/.local
$ make -j8 && make install

报错没有选项 -nopie 很明显是 GCC 的版本高了,现在的选项是 --no-pie ,在 config-host.mak 修改就可以编译成功了。

最后就可以进入了:

$ make qemu
xv6 kernel is booting

hart 1 starting
hart 2 starting
init: starting sh
$