利用bochs调试引导程序和Linux内核


    今天使用bochs2.4.5调试《Linux内核完全注释》上的一个简单的启动代码例子,bochs是一个模拟Intelx86指令系统很好的软件系统,可以从网上免费下载,下文就如何进行调试做说明。

      先来看到的是《Linux内核完全注释》中的一个例子:在Ubuntu10.04中编写代码后保存为boot.s文件

  1. .globl begtext,begdata,begbss,endtext,enddata,endbss    !全局标识符,供ld86链接使用   
  2.    .text  !正文段   
  3.    begtext:   
  4.    .data  !数据段   
  5.    begdata:   
  6.    .bss   !未初始化数据段   
  7.    begbss:   
  8.    .text     
  9.   
  10.   BOOTSEG = 0x07c0   !BIOS加载bootsect代码的原始段地址   
  11.   
  12. entry start   
  13.    start:   
  14.         jmpi go,BOOTSEG    !段间跳转至0x07c0:go处,该跳转语句会把cs寄存器加载为0x07c0(原为0)    
  15.    go:  mov ax,cs   
  16.         mov ds,ax   
  17.         mov es,ax   
  18.         mov [msg1+17],ah       
  19.         mov cx,#20         !共显示20个字符,包括回车换行   
  20.          mov dx,#0x1010     !字符将显示在屏幕第17行,第17列   
  21.          mov bx,#0x000c     !字符显示为红色   
  22.          mov bp,#msg1       !执向要显示的字符串           
  23.          mov ax,#0x1301     !写字符串并移动光标到串结尾处   
  24.          int 0x10    !BIOS屏幕显示中断int 0x10。寄存器cx中是字符串长度值,dx中是显示位置值,bx中显示使用的字符属性,es:bp指向字符串   
  25.         loop0:  jmp loop0   
  26. msg1:  .ascii "Loading system......"    !调用BIOS中断显示的信息。共20个ASCII码字符   
  27.         .byte 13,10                      !回车换行   
  28. .org 510                                 !表示以后语句从地址510(0x1FE)开始存放   
  29.        .word 0xAA55                     !引导扇区有效标志,供BIOS加载引导扇区使用。必须处于引导扇区最后2字节处   
  30. .text   
  31. endtext:   
  32. .data   
  33. enddata:   
  34. .bss   
  35. endbss:   

   该段代码需要使用as86汇编编译器编译,在Ubuntu10.04中没有,需要先apt-get install bin86进行安装,安装结束后使用

         as86 -0 -a -o boot.o boot.s   //编译

         ld86  -0 -s -o boot boot.o     //链接,去掉符号信息

         dd    bs=32 if=boot of=cun skip=1 //删除BOOT程序前的32B,这部分是MINIX头结构,并将文件名改为cun(这是偶的名字

<-_->)

   拷贝到Windows下bochs2.4.5的安装目录下,下面使用bochs2.4.5中的Disk Image Creation Tool创建一个空的虚拟软盘IMG,这一步根据提示一问一答的进行应该没有任何问题,最后在安装目录下生成一个cun.img文件,这就是我们制作的虚拟软盘映象文件。

   接着就是配置bochsrc-simpel.txt文件,这个是配置文件的例子,需要对此进行配置以满足我们自己的要求,主要要修改的选项有一下几个:

   megs: 16   //由于我的boot程序小,内存申请16M足够了

   floppya: 1_44="cun.img", status=inserted //我的启动代码的名字

   ata0-master: type=disk, path="cun.img", mode=flat,cylinders=227, heads=16, spt=63 //一些启动的属性,如启动时启动的路径,是以安装目录为根路径的,最后三个参数是根据Disk Image Creation Tool产生IMG文件时候给出的数字

   然后将bochsrc-simpel.txt的后缀名改为.bxrc,这时这个TXT文档也变成可执行程序图标。

   最后一步是使用Floppy Writer软件将我们编译好的引导程序Cun注入到虚拟软盘cun.img中,这个软件可以再网上免费下载,使用简单,不详述。

   双击bochsrc-simpel.bxrc,屏幕上显示红色的"Loading System...",大功告成,可以继续Linux内核探索之旅。

相关内容