本学期操统课的lab可以自由选择,于是做了MIT 2018的6.828-JOS,光是前期装环境就费老大劲了,我敢保证我遇到了市面上见过的所有问题,最后make qemu出错还是在百度贴吧一个只有两个回复的帖子里遇到和我有相同问题的老哥,终于解决了所有问题(感谢那位老哥)
开个小博客记录一下。
lab主页:https://pdos.csail.mit.edu/6.828/2018/tools.html.
环境装配
我的机子是macOS10.13.6,虚拟机用的ubuntu18.04,据同学说ubuntu20没法装qemu
根据官方手册一步一步做
检查编译工具链
在命令行中输入
$ objdump -i
查看版本信息,第二行应该输出elf32-i386
$ gcc -m32 -print-libgcc-file-name
应该输出libgcc.a这个文件的路径
安装QEMU
$ git clone https://github.com/mit-pdos/6.828-qemu.git qemu
在linux上,可能需要安装一些包
$ sudo apt-get install libsdl1.2-dev
$ sudo apt-get install libtool-bin
$ sudo apt-get install libglib2.0-dev
$ sudo apt-get install libz-dev
$ sudo apt-get install libpixman-1-dev
把qemu git下来后工作路径下会出现一个qemu文件夹,里面有一大堆文件
$ cd qemu
$ ./configure --disable-kvm --disable-werror --prefix=/home/mia/Documents/qemu --target-list="i386-softmmu x86_64-softmmu"
这里prefix参数后面是你为qemu选择的安装目录,如果没写会默认装在/usr/local
这里报了第一个错误,因为我的linux上默认python版本是3.6,qemu不支持3以上的python,需要安装一个python2并在装配时把python2的路径加上
$ ./configure --disable-kvm --disable-werror -prefix=/home/mia/Documents/qemu -target-list-"i386-softmmu x86_64-softmmu" --python=/usr/bin/python2.7
这里中间我还犯了个错误,忘记加上–disable-werror,导致报了werror错误,原因是某些文件中使用了major和minor这两个宏,这两个宏在sys/types.h和sys/sysmacros.h中都被定义了,导致了一个定义冲突。解决也蛮简单的,先去sysmacros.h查看一下这两个宏的完整形式,分别是gnu_dev_major和gnu_dev_minor,再把报错的文件里的major和minor函数名全部替换成这个就可以了
又报错disabling libtool due to broken toolchain support
实在找不到究竟缺什么,只好把libtool全部重装了一遍
$ sudo apt-get remove libtool
$ sudo apt-get install libtool*
输出一大堆配置信息,搞定
OK!configure终于完成了,现在你设置的工作路径下面会出现五个新的文件夹bin、etc、libexec、share和var
$ make
$ sudo make install
印象里没遇到什么问题
下载lab
$ mkdir ~/6.828
$ cd ~/6.828
$ add git
$ git clone https://pdos.csail.mit.edu/6.828/2018/jos.git lab
Cloning into lab...
$ cd lab
然后在你新建的6.828文件夹里面又会出现一个lab文件夹,进入这个文件夹后
make
灾难又来了!!
报错
***Error: Couldn't find a working QEMU executable.
***Is the directory containing the qemu binary in your PATH
***or have you tried setting the QEMU variable in conf/env.mk?
大概是说找不到QEMU,好嘛,找到lab/conf/env.mk文件,看一下注释
If the makefile cannot find your QEMU binary, uncomment the following line and set it to the full path to QEMU
#QEMU=
就是说把QEMU的路径加上再把这句话注释掉
这个地方我真的绕了好多弯,我先把我的qumu/bin文件夹的路径加上去,提示我permission denied,我又sudo chmod -R 777修改文件权限,然而没有卵用
最后在百度贴吧找到了解决办法,原来要加上的是/qemu/bin/qemu-system-i386这个文件的路径!!
这谁能知道啊!!
这个路径就是你最开始./configure时候设置的路径,如果没设就默认是/usr/local/bin/qemu-system-i386
改完文件之后重新make
$ make
$ make qemu
终于成功了!至此lab的前期准备工作完成
本来以为接下来不会遇到装配上的问题了,没想到lab1又花了我一个小时研究makefile
lab1教你用gdb看qemu的输出,要开两个terminal,都进到lab文件夹,一个输入make qemu-gdb,然后另一个输入make gdb
我一直报错:No rule to make target ‘gdb’
去学习了一下makefile的基本知识,大概就是makefile里没有gdb这个目标
看了我的GNUmakefile文件
…
.gdbinit: .gdbinit.tmpl
sed “s/localhost:1234/localhost:$(GDBPORT)/” < $^ > $@
qemu: $(IMAGES)
$(QEMU) $(QEMUOPTS)
总之确实没有gdb,我百思不得其解啊。还好搜到了有人分析jos的makefile的文章,发现他的makefile里还有一句
gdb:
gdb -x .gdbinit
于是我把这段加到我的GNUmakefile里,然后重新make一下
$ make clean
$ make
重新开终端一个跑make qemu-gdb一个跑make gdb,一切正常!