1、配置思路
由于编译器、汇编器等工具的更新,在Ubuntu16.04直接编译Linux-0.11内核代码需要对源代码做很多的修改。为了减少工作量,本文使用了哈尔滨工业大学计算机学院在网易云课堂操作系统课中提供的实验环境,下载地址为 https://cms.hit.edu.cn/mod/folder/view.php?id=1716。
这个压缩包中带有bochs软件并设置好了bochs的运行参数,带有linux-0.11源代码以及一个简易的运行脚本。其中linux-0.11源代码与原版的代码由哈工大的老师做了修改,主要是修改了make文件。要查看详细的修改信息,可以使用diff命令,来比较修改后的源码和原版linux-0.11代码。本文主要做的主要工作:实现在Ubuntu16.04 64位系统上编译上述内核,并在bochs中进行模拟。
2、安装gcc-3.4
上述内核代码中的make文件使用gcc-3.4编译器编译内核,因此我们需要手动安装低版本gcc-3.4编译器。由于gcc-3.4已经不再由官网维护,因此我们需要手动下载deb包进行安装。在ubuntu的归档网站 http://old-releases.ubuntu.com/ubuntu/pool/universe/g/gcc-3.4/ 下载如下包:
cpp-3.4_3.4.6-6ubuntu5_amd64.deb
g++-3.4_3.4.6-6ubuntu3_amd64.deb
gcc-3.4-base_3.4.6-6ubuntu3_amd64.deb
gcc-3.4_3.4.6-6ubuntu3_amd64.deb
libstdc++6-dev_3.4.6-6ubuntu3_amd64.deb
然后使用 sudo dpkg --force-depends *.deb 命令进行安装,*代表上面的包名。
安装完毕后用gcc-3.4 --version进行测试。在测试通过后我们开始尝试编译内核,切换至linux-0.11/目录执行make命令。在执行make命令过程中,如果出现了如下错误提示:
/usr/include/features.h|374|fatal error: sys/cdefs.h: No such file or directory|
说明缺少32位程序的libc库,h执行如下命令进行安装:
sudo apt-get install libc6-dev-i386。
之后内核应该可以正确编译了。
参考:
3、修改运行脚本
内核编译完成之后,需要运行bochs来启动内核,上述压缩包中的run脚本启动了压缩包中自带的32位bochs,但是由于我正在用64位的系统,还需要一些额外的库来运行32位的bochs,因此我安装了64位的bochs。要使用自己安装的boches,需要按照如下方式修改run脚本:
将run脚本的最后一行$OSLAB_PATH/bochs/bochs-gdb -q -f $OSLAB_PATH/bochs/bochsrc.bxrc替换为bochs -q -f $OSLAB_PATH/bochs/bochsrc.bxrc 即,使用系统路径下的bochs命令启动bochsrc.bxrc虚拟机。
如果提示需要安装 x module,那么执行如下命令安装:
sudo apt-get install bochs-x bochs-sdl
如果启动过程中黑屏,应该是进入了调试模式,在终端中输入c命令,可以启动正常模式。至此,可以编译运行的linux-0.11内核环境应该已经构建完毕了。