实验的基本流程是根据实验要求编写应用程序、修改Linux 0.11的源代码,用gcc编译后,在Bochs的虚拟环境中运行、调试目标代码。python
Bochs是一个免费且开放源代码的IA-32(x86)架构PC机模拟器,注意是PC机模拟器,故他能够模拟硬件配置,同时能够模拟整个pc的I/O设备、内存和BIOS。不光能够运行linux,还能够模拟运行DOS和各类版本的Windows等多种操做系统。linux
特色 :
*很高的可移植性:因此本门课选用它
*运行效率低于虚拟机:由其原理决定,但在本实验不会太明显。
*相比于虚拟机:有着强大的没法比拟的调试操做系统的能力shell
【注】本实验的hit-oslab已经内置了bochs编程
编译器:缓存
是一种计算机程序,它会将用某种编程语言写成的源代码(原始语言),转换成另外一种编程语言(目标语言) 一个现代编译器的主要工做流程以下: 源代码(source code)→ 预处理器(preprocessor)→ 编译器(compiler)→ 汇编程序(assembler)→ 目标代码(object code)→ 连接器(Linker)→ 可执行文件(executables), 最后打包好的文件就能够给电脑去判读运行了。架构
本门课程采用的GCC编译器,GCC是和Linux一块儿成长起来的编译器。Linux最初的版本就是由GCC编译的。如今GCC也是在自由软件领域应用最普遍的编译器。因此,咱们也选择GCC作为本书实验的指定编译器。编程语言
调试器的基本功能
一、控制软件运行
调试器的最基本功能就是将一个飞速运行的程序中断下来,而且使其按照用户的意愿执行。调试器是靠迫使目标程序触发一个精心构造的异常来完成这些工做的。
二、查看软件运行中信息
查看软件的当前信息,这些信息包含但不限于当前线程的寄存器信息,堆栈信息、内存信息、当前EIP附近的反汇编信息等。
三、修改软件执行流程
修改内存信息、反汇编信息、堆栈信息、寄存器信息等等。编辑器
GDB调试器是GCC编译器的兄弟。作为自由软件领域几乎是惟一的调试器,它秉承了*nix类操做系统的一向风格,采用纯命令行操做,有点儿相似dos下的debug。关于它的使用方法请看GDB使用手册。工具
Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的开源GNU/Linux操做系统,Ubuntu 是基于Debian GNU/Linux,支持x8六、amd64(即x64)和ppc架构,由全球化的专业开发团队(Canonical Ltd)打造的spa
主要特色是易用,很是的易用。
hit-oslab实验环境简称oslab,是一个压缩文件(hit-oslab-linux-20110823.tar.gz)。
首先找到压缩文件 并在终端转换至该文件夹 用tar zxvf hit-oslab-linux-20110823.tar.gz
命令解压便可工做
解压的目录如图:
oslab工做在一个宿主操做系统之上,在这个宿主系统之上完成对Linux的开发、编译、修改以后,会在linux-0.11文件夹下生成一个名为Image的文件。(参照上图理解)这个就是编译后的目标文件。
这个文件包含引导和全部内核的二进制代码。若是拿来一张软盘,从他的0磁道0扇区开始,逐字节写入Image的文件,它就能够用这张软盘启动一台真正的计算机!
oslab采用的是bochs模拟器来加载这个Image文件,模拟执行Linux 0.11,这样就省却了从新启动计算机的麻烦!
解压文件后咱们看到bochs目录,此目录就是与bochs相关的执行文件、数据文件和配置文件。使用run命令运行bochs后,会建立两个,一个是虚拟硬盘,一个是虚拟软驱A,在软驱软驱关在的是刚才说的Image文件,而在硬盘上挂载的是hdc-0.11.img。由于是从软驱A启动,因此Linux0.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内包含有:
Bash shell 一些基本的Linux命令、工具,好比cp、rm、mv、tar。 vi编辑器 gcc 1.4编译器,可用来编译标准C程序 as86和ld86 Linux 0.11的源代码,可在0.11下编译,而后覆盖现有的二进制内核
准备活动
把当前目录切换到oslab下,用pwd命令确认,用“ls -l”列目录内容。本实验的全部内容都在本目录或其下级目录内完成。
“编译内核”比“编写内核”要简单得多。首先要进入linux-0.11目录,而后执行:
$ make all
由于“all”是最经常使用的参数,因此能够省略,只用“make”,效果同样。
在多处理器的系统上,能够用-j参数进行并行编译,加快速度。例如双CPU的系统能够:
$ make -j 2
make命令会显示不少不少不少的信息,你能够尽可能去看懂,也能够装做没看见。只要最后几行中没有“error”就说明编译成功。最后生成的目标文件是一个软盘镜像文件——linux-0.11/Image。若是将此镜像文件写到一张1.44MB的软盘上,就能够启动一台真正的计算机。
linux-0.11目录下是所有的源代码,不少实验内容都是要靠修改这些代码来完成。修改后须要从新编译内核,仍是执行命令:
$ make all
make命令会自动跳过未被修改的文件,连接时直接使用上次编译生成的目标文件,从而节约编译时间。但若是从新编译后,你的修改貌似没有生效,能够试试先“make clean”
,再“make all”
。“make clean”
是删除上一次编译生成的全部中间文件和目标文件,确保是在全新的状态下编译整个工程。
在Bochs中运行最新编译好的内核很简单,在oslab目录下执行:
$ ./run
若是出现Bochs的窗口,里面显示linux的引导过程,最后中止在“[/usr/root/]#”,表示运行成功。
汇编级调试须要执行命令:
$ ./dbg-asm
能够用命令help来查看调试系统用的基本命令。更详细的信息请查阅Bochs使用手册。
C语言级调试稍微复杂一些。首先执行以下命令:
$ ./dbg-c
而后再打开一个终端窗口,进入oslab目录后,执行:
$ ./rungdb
新终端窗口中运行的是GDB调试器。关于gdb调试器请查阅GDB使用手册。
Ubuntu和Linux 0.11之间的文件交换
oslab下的hdc-0.11-new.img是0.11内核启动后的根文件系统镜像文件,至关于在bochs虚拟机里装载的硬盘。在Ubuntu上访问其内容的方法是(你们使用sudo时,password是shiyanlou):
1.使用$ sudo ./mount-hdc
,将linux 0.11文件系统挂载到hdc目录下
2.hdc目录就是和linux 0.11内核如出一辙的文件
3.而后就能够直接在hdc目录下操做了, 好比能够在hdc目录下新建一个hello.c
$ 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上产生的文件,如后面实验中产生的process.log文件,能够按这种方式”拿到“Ubuntu下用python程序进行处理,固然这个python程序在Linux 0.11上显然是很差使的,由于Linux 0.11上搭建不了python解释环境。
【注】:不要在0.11内核运行的时候mount镜像文件,不然可能会损坏文件系统。同理,也不要在已经mount的时候运行0.11内核。
【注】:在关闭Bochs以前,须要先在0.11的命令行运行“sync”,确保全部缓存数据都存盘后,再关闭Bochs。