实验材料准备python
1,下载实验材料hit-oslab-linux-20110823.tar.gz(包含linux-0.11源码,bochs模拟器等)linux
网址:http://www.ritchiehuang.cn/c++
2,下载安装gcc-3.4(编译linux-0.11须要用到低版本gcc)shell
网址:old-releases.ubuntu.com/ubuntu/pool/universe/g/gcc-3.4/ubuntu
下载内容:(统一下载存放在新建的gcc-3.4文件夹下,因为个人ubuntu是64位因此下载amd64)vim
1 cpp-3.4_3.4.6-6ubuntu3_amd64.deb 2 g++-3.4_3.4.6-6ubuntu3_amd64.deb 3 gcc-3.4_3.4.6-6ubuntu3_amd64.deb 4 gcc-3.4-base_3.4.6-6ubuntu3_amd64.deb 5 libstdc++6-dev_3.4.6-6ubuntu3_amd64.deb
实验相关简述缓存
1,x86模拟器器Bochs架构
Bochs是一个免费且开放源代码的IA-32(x86)架构PC机模拟器。在它模拟出的环境中能够运行Linux、DOS和各类版本的Windows等多种操做系统。而Bochs自己具备很高的移植性,能够运行在多种软硬件平台之上。若是您想拥抱自由的Linux,那么Bochs几乎是您的不二选择。若是您想继续把本身绑定在Windows平台上,那么除了Bochs,您还能够选用VMware或者Microsoft Virtual PC。它们是最著名虚拟机软件,并且均可以避免费使用。由于Bochs的是模拟器,其原理决定了它的运行效率会低于虚拟机。可是,Bochs有虚拟机无可比拟的调试操做系统的能力.编辑器
2,实验环境的工做模式工具
hit-oslab实验环境简称oslab,是一个压缩文件(hit-oslab-linux-20110823.tar.gz),能够将这个文件拷贝到本身的实验工做目录下,用tar zxvf hit-oslab-linux-20110823.tar.gz命令解压展开便可工做。oslab工做在一个宿主操做系统之上,咱们使用的Linux,在宿主操做系统之上完成对Linux 0.11的开发、修改和编译以后,在linux-0.11目录下会生产一个名为Image的文件,它就是编译以后的目标文件。该文件内已经包含引导和全部内核的二进制代码。若是拿来一张软盘,从它的0扇区开始,逐字节写入Image文件的内容,就能够用这张软盘启动一台真正的计算机,并进入Linux 0.11内核。oslab采用bochs模拟器加载这个Image文件,模拟执行Linux 0.11,这样省却了从新启动计算机的麻烦。
bochs目录下是与bochs相关的执行文件、数据文件和配置文件。run是运行bochs的脚本命令。运行后bochs会自动在它的虚拟软驱A和虚拟硬盘上各挂载一个镜像文件,软驱上挂载是linux-0.11/Image,硬盘上挂载的是hdc-0.11.img。由于bochs配置文件中的设置是从软驱A启动,因此Linux 0.11会被自动加载。而Linux 0.11会驱动硬盘,并mount硬盘上的文件系统,也就是将hdc-0.11.img内镜像的文件系统挂载到0.11系统内的根目录——“/”。在0.11下访问文件系统,访问的就是hdc-0.11.img文件内虚拟的文件系统。
hdc-0.11.img文件的格式是Minix文件系统的镜像。Linux全部版本都支持这种格式的文件系统,因此能够直接在宿主Linux上经过mount命令访问此文件内的文件,达到宿主系统和bochs内运行的Linux 0.11之间交换文件的效果。Windows下目前没有(或者是还没发现)直接访问Minix文件系统的办法,因此要借助于fdb.img,这是一个1.44M软盘的镜像文件,内部是FAT12文件系统。将它挂载到bochs的软驱B,就能够在0.11中访问它。而经过filedisk或者WinImage,能够在Windows下访问它内部的文件。
hdc-0.11.img内包含有:
实验环境搭建(ubuntu-14.04.1-desktop-amd64)
1,在~(用户Home文件夹)下建立oslab文件夹,将hit-oslab-linux-20110823.tar.gz解压到oslab下
mkdir oslab cd oslab tar -zxvf hit-oslab-linux-20110823.tar.gz
2,gcc-3.4安装
cd gcc-3.4 sudo apt-get --purge remove gcc
sudo chmod 777 * sudo dpkg -i *.deb
3,as86,ld86安装(用于编译和连接linux/boot下的bootsect.s和setup.s,它们采用as86汇编语法;而linux-0.11下的其余汇编语言文件采用gas的语法AT&T)
搜索包含as86,ld86的包:
apt-cache search as86 ld86
执行结果以下:
bin86 - 16-bit x86 assembler and loader
安装bin86:
sudo apt-get install bin86
4,通常环境设置
64位系统须要安装32位兼容库
sudo apt-get install libc6-dev-i386
C语言编译环境
sudo apt-get install build-essential
安装IDE
sudo apt-get install vim cscope exuberant-ctags
编译内核
cd ~/oslab/oslab/linux-0.11 make
编译中断,输出错误信息:
In file included from /usr/include/linux/fs.h:10, from tools/build.c:28: /usr/include/linux/ioctl.h:4:23: asm/ioctl.h: No such file or directory In file included from /usr/include/linux/fs.h:11, from tools/build.c:28: /usr/include/linux/types.h:4:23: asm/types.h: No such file or directory In file included from /usr/include/linux/types.h:8, from /usr/include/linux/fs.h:11, from tools/build.c:28: /usr/include/linux/posix_types.h:35:29: asm/posix_types.h: No such file or directory In file included from /usr/include/linux/fs.h:11, from tools/build.c:28: /usr/include/linux/types.h:27: error: syntax error before "__le16" /usr/include/linux/types.h:28: error: syntax error before "__be16" /usr/include/linux/types.h:29: error: syntax error before "__le32" /usr/include/linux/types.h:30: error: syntax error before "__be32" /usr/include/linux/types.h:31: error: syntax error before "__le64" /usr/include/linux/types.h:32: error: syntax error before "__be64" /usr/include/linux/types.h:34: error: syntax error before "__sum16" /usr/include/linux/types.h:35: error: syntax error before "__wsum" In file included from tools/build.c:28: /usr/include/linux/fs.h:43: error: syntax error before "__u64" /usr/include/linux/fs.h:45: error: syntax error before "minlen" make: *** [tools/build] Error 1
google搜索得知是由于64位linux的asm目录为:
/usr/include/x86_64-linux-gnu/asm
make找不到文件从而致使编译中断
解决方法(创建连接):
sudo ln -s /usr/include/x86_64-linux-gnu/asm /usr/include/asm
运行
运行编译好的内核,在oslab目录下:
./run
出现错误:
./bochs/bochs-gdb: error while loading shared libraries: libXpm.so.4: cannot open shared object file: No such file or directory
打印动态连接配置:
ldconfig -p | grep libXpm.so.4
libXpm.so.4的连接信息:
libXpm.so.4 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libXpm.so.4
咱们须要的是32位库.搜索库对应的包名称:
apt-file search libXpm.so.4
打印结果:
libxpm4: /usr/lib/x86_64-linux-gnu/libXpm.so.4 libxpm4: /usr/lib/x86_64-linux-gnu/libXpm.so.4.11.0
获得其对应的包名为libxpm4,安装对应的32位库:
sudo apt-get install libxpm4:i386
基本操做及注意事项
汇编级调试在oslab目录下执行命令
./dpg-asm
C语言级调试在oslab目录下,打开第一个终端窗口执行命令
./dbg-c
打开第二个终端窗口执行命令
./rungdb
Ubuntu和Linux0.11之间的文件交换
oslab下的hdc-0.11-new.img是0.11内核启动后的根文件系统镜像文件,至关于在bochs虚拟机里装载的硬盘。在Ubuntu上访问其内容的方法是
sudo ./mount-hdc
以后,hdc目录下就是和0.11内核如出一辙的文件系统了,能够读写任何文件(可能有些文件要用sudo才能访问)。读写完毕,不要忘了卸载这个文件系统:
sudo umount hdc
通过sudo ./mount-hdc这样处理之后,咱们能够在Ubuntu的hdc目录下建立一个xxx.c文件,而后利用Ubuntu上的编辑工具(如gedit等)实现对xxx.c文件的编辑工做,在编辑保存之后。执行sudo umount hdc后,再进入Linux 0.11(即run启动bochs之后)就会看到这个xxx.c,这样就避免了在Linux 0.11上进行编辑xxx.c的麻烦,由于Linux 0.11做为一个很小的操做系统,其上的编辑工具只有vi,使用起来很是不便。
另外在Linux 0.11上产生的文件,能够按这种方式”拿到“Ubuntu下用python程序进行处理,固然这个python程序在Linux 0.11上显然是很差使的,由于Linux 0.11上搭建不了python解释环境。
注意1:不要在0.11内核运行的时候mount镜像文件,不然可能会损坏文件系统。同理,也不要在已经mount的时候运行0.11内核。
注意2:在关闭Bochs以前,须要先在0.11的命令行运行“sync”,确保全部缓存数据都存盘后,再关闭Bochs。