利用Bochs调试Linux 0.11启动过程图解

让梦想从这里起飞 2011-06-09

摘要:现在hack linux kernel的人很多,而调试工具很少,Bochs的最大的好处就是它的调试功能,它能仿真IA-32的全部指令,所有这些都是用C++写成的,并且开源。

名词:Bochs

Bochs是Kevin Lawton 用C++语言开发的一个仿真软件系统。主要用来仿真x86的系统软件。和VMware,Virtual PC 仿真软件相比,速度很慢,但Bochs的最大好处是它的单步调试功能。

下面我们主要来讲述如何用bochs的单步调试功能对linux的启动过程进行调试,从而了解linux是如何启动的。

在讲述之前,首先我搭配了一个Bochs环境:

1) Bochs的执行文件

2) Linux映像文件

我选用了linux 早期的内核版本进行调试,0.11版,主要原因是0.11版网上有很多已经编译制作好的内核映像文件,而其0.11版的引导启动程序结构和最版内核基本上是一样的。

当机器启动的时候,i386系统中BIOS做最初的引导工作。就是把可启动设备的第一个分区的第一个扇区加载到实模式地址0x7c00上,然后将控制转交给它。所以我们可以在地址0x7c00处设置断点,然后让系统执行到这个地方

命令:vbreak 0x0000:0x7c00 或则(b 0x00007c00),设置断点。

C,继续执行,遇到断点,停止

如图:

利用Bochs调试Linux 0.11启动过程图解

这个时候mov ax,0x7c0指令正好是linux启动程序bootsect.S的第一个有效指令(在bootsect.S中为

start:

mov    ax,#BOOTSEG)。说明BIOS在执行到0x7c00的时候,把控制权转移到了linux启动程序了。Linux 启动程序包括三个文件。他们分别是:

Bootsect.S ,setup.S,head.s,他们都是由汇编写成的,这三个程序按一定的顺序执行各自不同的功能能来完成整个从引导到启动的整个过程。

启动顺序是:BIOS--Bootsect.S--setup.S--head.s---main.c

Bootsect.S代码是磁盘引导块程序。它的主要功能是:

1)把自己移到内存绝对地址0x90000的开始处,并跳到那里执行,也就是地址0x9000:0x0000处

2)用13号BIOS中断来读磁盘的从第2个扇区开始的连续4个扇区内的内容,这部分内容就是setup程序模块,然后把这个内容放到bootsect紧接的后面。也就是地址0x90200.为什么是0x90200呢?后面要说道。

3)把system模块读到内存0x10000地方。这个system模块大小必须小于0x90000-0x10000=0x80000 也就是512k字节。

关于setup.S和head.s两个文件的功能和作用等调试到的时候在介绍。

继续往下调试,我们用反汇编从现在开始的10条指令。

指令介绍:u /10 ,u是反汇编指令,这个指令意思反汇编当前开始的10条指令并打印出来。注意这并不是程序执行的指令。

如图:

利用Bochs调试Linux 0.11启动过程图解

相关推荐