课程基本流程实验基本流程是根据实验要求编写应用程序,修改Linux0.11源代码,编译用gcc,在Bochs的虚拟环境中运行,调试目标代码。实验的基本工具和介绍(部分谷歌)X86模拟器Bochs:Bochs是一款免费开源的IA-32(x86)架构PC模拟器,注意是PC模拟器,所以可以模拟硬件配置,在同时,它可以模拟整个pc的I/O设备、内存和BIOS。不仅可以运行linux,还可以模拟运行各种操作系统,如DOS和各种版本的Windows。特点:*可移植性高:所以本课程选择它*运行效率低于虚拟机:这是它的原理决定的,但在本实验中不会太明显。*与虚拟机相比:具有强大无可比拟的操作系统调试能力【注】本实验的hit-oslab内置bochsGCC编译器编译器:是使用某种编程语言编写的计算机程序源码代码(原始语言),转换成另一种编程语言(目标语言)现代编译器的主要工作流程如下:源代码(sourcecode)→预处理器(preprocessor)→编译器(compiler)→汇编器→目标代码→链接器→可执行文件,最后打包后的文件可以被计算机解释运行。本课程使用的GCC编译器是伴随Linux一起成长起来的编译器。Linux的原始版本是由GCC编译的。现在GCC也是自由软件领域使用最广泛的编译器。因此,我们也选择GCC作为本书实验的指定编译器。DBdebugger调试器的基本功能1.控制软件运行调试器最基本的功能是中断一个快速运行的程序,使其按用户的意愿执行。调试器通过强制目标程序触发精心设计的异常来做到这一点。2.查看软件运行信息查看软件当前信息,包括但不限于当前线程的注册信息、栈信息、内存信息、当前EIP附近的反汇编信息等3.修改软件执行过程修改内存信息、反汇编信息、堆栈信息、寄存器信息等。GDB调试器是GCC编译器的兄弟。作为自由软件领域几乎独一无二的调试器,它沿袭了*nix-like操作系统的一贯风格,采用纯命令行操作,有点类似于dos下的调试。有关如何使用它的信息,请参阅GDB手册。Ubuntu(GNU/Linux)Ubuntu(优帮拓、优班图、Ubuntu)是一个开源的以桌面应用为主的GNU/Linux操作系统。Ubuntu基于DebianGNU/Linux,支持x86、amd64(即x64)和ppc架构,由全球专业开发团队(CanonicalLtd)打造,主要特点是易用性,非常好用。实验室工作模式hit-oslab实验环境简称oslab,是一个压缩文件(hit-oslab-linux-20110823.tar.gz)。首先找到压缩文件,将其转换到终端中的文件夹中。使用tarzxvfhit-oslab-linux-20110823.tar.gz命令解压即可运行。解压目录如图:oslab的工作原理oslab工作在一个宿主操作系统上,在这个宿主系统上完成Linux的开发、编译、修改后,会在linux-0.11文件夹下生成一个名为Image的文件。(参考上图理解)这是编译好的目标文件。该文件包含引导程序和所有内核二进制文件。如果拿一张软盘,从它的0磁道0扇区开始,逐字节写入Image文件,就可以用这张软盘来启动一台真正的电脑了!oslab使用bochs模拟器加载Image文件,模拟Linux0.11的执行,省去了重启电脑的麻烦!解压文件后我们看到bochs目录,里面是bochs相关的执行文件、数据文件和配置文件。使用run命令运行bochs后,会创建两个,一个是虚拟硬盘,一个是虚拟软驱A,刚才说的镜像文件在软驱上,挂载hdc-0.11.img在硬盘上。因为是从A软驱启动,所以会自动加载Linux0.11,Linux0.11会驱动硬盘并挂载硬盘上的文件系统,即挂载hdc-0.11.img中镜像的文件系统到0.11系统的根目录——“/”。在0.11下访问文件系统时,访问的是hdc-0.11.img文件中的虚拟文件系统。hdc-0.11.img文件的格式是Minix文件系统的镜像。所有版本的linux都支持这种格式的文件系统,所以在宿主机linux上可以直接通过mount命令访问这个文件中的文件,达到宿主机系统和运行在bochs中的linux0.11交换文件的效果。目前还没有(或尚未找到)在Windows下直接访问Minix文件系统的方法,所以我们需要使用fdb.img,它是一张1.44M软盘的镜像文件,里面是FAT12文件系统。你可以在0.11中通过将它安装在bochs的软驱B上来访问它。并且通过filedisk或WinImage,你可以在Windows下访问它的内部文件。hdc-0.11.img包含:Bashshell一些基本的Linux命令和工具,如cp、rm、mv、tar。vieditorgcc1.4编译器,可用于编译标准C程序as86和ld86Linux0.11的源代码,可在0.11下编译,然后覆盖现有的二进制内核,用pwd命令确认,用“ls-l”列出目录内容。本次实验的所有内容均在该目录或其下级目录中完成。编译内核“Compilingthekernel”比“writingthekernel”简单得多。先进入linux-0.11目录,然后执行:$makeall由于“all”是最常用的参数,所以可以省略,只有“make”有同样的效果。在多处理器系统上,可以使用-j参数进行并行编译,以加快速度。比如双CPU系统可以:$make-j2make命令会显示很多信息,你可以试着看懂,也可以假装没看到。只要最后几行没有“错误”,就说明编译成功了。最终生成的目标文件是一个软盘镜像文件——linux-0.11/Image。如果把这个镜像文件写到一张1.44MB的软盘上,就可以启动一台真正的计算机了。所有的源代码都在linux-0.11目录下,很多实验都是通过修改这些代码完成的。修改后需要重新编译内核,或者执行命令:$makeallmake命令会自动跳过未修改的文件,链接时直接使用上次编译生成的目标文件,从而节省编译时间。但是如果你的修改在重新编译后似乎没有生效,你可以先尝试“makeclean”,然后再“makeall”。“makeclean”就是把之前编译生成的所有中间文件和目标文件全部删除,从而保证整个工程是在一个全新的状态下编译的。运行和调试在Bochs中运行最新编译好的内核非常简单。在oslab目录下执行:$./run如果出现Bochs窗口,则显示linux的启动过程,最后停在“[/usr/root/]#”处,说明运行成功。内核调试分为两种模式:汇编级调试和C语言级调试。汇编级调试需要执行命令:$./dbg-asm可以使用命令help查看系统调试的基本命令。更多详细信息,请参阅Bochs手册。C级调试稍微复杂一些。首先执行以下命令:$./dbg-c然后打开一个终端窗口,进入oslab目录,执行:$./rungdbGDB调试器在新的终端窗口运行。gdb调试器请参考GDB手册。Ubuntu与Linux0.11的文件交换oslab下的hdc-0.11-new.img是0.11内核启动后根文件系统的镜像文件,相当于bochs虚拟机加载的硬盘。在Ubuntu上访问其内容的方法是(使用sudo时,密码是shiyanlou):1、使用$sudo./mount-hdc将linux0.11文件系统挂载到hdc目录下2、hdc目录同理如linux0.11和内核3.一样的文件。然后就可以直接在hdc目录下操作了。比如可以在hdc目录下新建一个hello.c$sudoumounthdc。创建一个xxx.c文件,然后使用Ubuntu上的编辑工具(如gedit等)编辑xxx.c文件,编辑好后保存。执行sudoumounthdc后,再进入Linux0.11(即run启动bochs后),就会看到这个xxx.c(如下图),这样就免去了Linux0.11上编辑xxx.c的麻烦,因为Linux0.11作为一个小型操作系统,只有vi编辑工具,使用起来很不方便。另外,在Linux0.11上生成的文件,比如下面实验中生成的process.log文件,都可以通过这种方式“获取”,在Ubuntu下用python程序进行处理。当然,这个python程序在Linux0.11上显然不好用。是的,因为不能在Linux0.11上搭建python解释环境。【注意】:不要在0.11内核运行时挂载镜像文件,否则可能会损坏文件系统。同样,不要运行已安装的0.11内核。【注意】:在关闭Bochs之前,需要在0.11命令行运行“sync”,确保缓存的数据全部保存,然后关闭Bochs。
