实验步骤参考哈工大操作系统实验指导书,自行下载。
实验环境的搭建与使用
我用vmware搭的ubuntu做为实验环境,首先,下载hit-oslab-linux-20110823.tar(链接:https://pan.baidu.com/s/1O0HT2iyegHvQUICKdhsTmQ
提取码:98l3 )
里面包含了一下内容:
- 可在Ubuntu下编译的Linux 0.11内核源代码。
- 已打开gdb-stub功能的Bochs及其支撑文件、配置文件。Ubuntu自带的Bochs没有gdb-stub功能,不能用GDB进行C语言级的调试。
- 可忽略Signal 0的GDB调试器。GDB是为调试应用程序而设计,而应用程序不需要处理signal 0,所以GDB捕获到signal 0后会强制暂停程序。Bochs(也许是Linux 0.11内核)会产生大量的signal 0,影响调试。我们给GDB打了一个补丁,使其可以忽略signal 0。
- 磁盘镜像文件hdc-0.11-new.img。它是Linux 0.11的根文件系统,内含gcc、vi等开发工具和bash等常用工具。
- 方便运行、调试和文件交换的一系列脚本。
然后将这个文件解压
$ tar zxf hit-oslab-linux-20110823.tar
为了确保安装成功可以安装一些编译器和工具:
$ sudo apt-get install build-essential
$ sudo apt-get install bin86
$ sudo apt-get install gcc-3.4
$ sudo apt-get install manpages-dev
这里我安装gcc-3.4失败了。后面会遇到麻烦。
下面开始编译内核:
先切换到解压后的目录,我这里是oslab/oslab
,然后进入linux-0.11
目录,执行编译命令
$ make all
不出意外你会遇到各种报错(emmm)
首先我遇到的就是gcc-3.4
命令找不到,刚才说了我没装上gcc-3.4
,Ubuntu里装的是最新版的gcc
,所以我把所有的makefile里的gcc-3.4
全改成了gcc
。(makefile决定一个项目里文件的编译规则)
之后又遇到很多错误,大部分都可以在这里找到解决方法:
感谢这位大神(这是个链接)
走过上面的坑后还有一个错误没提到,就是__stack_chk_fail
未定义,解决方法是:在顶层的Makefile里找到CFLAGS然后添加-fno-stack-protector
标志,添加完后记得make clean
下,不然不会立即生效。
最后不报错并得到linux-0.11/Image
了就说明编译成功。
运行和调试
在解压目录下运行:
$ ./run
然后很自然的就报错了:
./bochs/bochs-gdb: error while loading shared libraries: libSM.so.6: cannot open shared object file: No such file or directory
查了下解决方法如下:
我们需要的是32位的库,所以先查找对应的文件:
apt-file search libSM
得到结果:
libsm6: /usr/lib/x86_64-linux-gnu/libSM.so.6
libsm6: /usr/lib/x86_64-linux-gnu/libSM.so.6.0.1
再安装:
sudo apt-get install libsm6:i386
这里i386
代表32位的
后面又会有其他的库报错,按照相同的方法安装对应的库。
好了,接下来终于不报错了,然后运行bochs,发现一直在loadingsystem哪里闪烁…查无果,遂放弃,失败。
。
。
。
。
。
。
重做,参考这位兄台