利用bochs调试内核(主要是在windows下调试)
Bochs具有非常强大的操作系统内核调试功能

14.8.1 运行Bochs调试程序
我们假设Bochs系统已被安装在目录“C:\Program Files\Bochs-2现在在包含内核Image文件的目录下建立一个简单的批处理文件run.bat,其内容如下:

"C:\Program Files\Bochs-2

其中bochsdbg是Bochs系统的调试执行程序此时Bochs的主显示窗口空白,而控制窗口将显示以下类似内容:

C:\Documents and Settings\john1\桌面\Linux-0. ctxt): jmp f000:e05b             ; ea5be000f0
<bochs:1>

此时Bochs调试系统已经准备好开始运行,CPU执行指针已指向ROM BIOS中地址0x000fffff0处的指令处

<bochs:1> help
help - show list of debugger commands
help 'command'- show short command description
-*- Debugger control -*-
   help, q|quit|exit, set, instrument, show, trace-on, trace-off,
   record, playback, load-symbols, slist
-*- Execution control -*-
   c|cont, s|step|stepi, p|n|next, modebp
-*- Breakpoint management -*-
   v|vbreak, lb|lbreak, pb|pbreak|b|break, sb, sba, blist,
   bpe, bpd, d|del|delete
-*- CPU and memory contents -*-
   x, xp, u|disas|disassemble, r|reg|registers, setpmem, crc, info, dump_cpu,
   set_cpu, ptime, print-stack, watch, unwatch, ?|calc
<bochs:2> help 'vbreak'
help vbreak
vbreak seg:off - set a virtual address instruction breakpoint
<bochs:3>

为了让Bochs直接模拟执行到Linux的引导启动程序开始处,我们可以先使用断点命令在0x7c00处设置一个断点,然后让系统连续运行到0x7c00处停下来执行的命令序列如下:

<bochs:3> vbreak 0x0000:0x7c00
<bochs:4> c
(0) Breakpoint 1, 0x7c00 (0x0:0x7c00)
Next at t=4409138
(0) [0x00007c00] 0000:7c00 (unk. ctxt): mov ax, 0x7c0             ; b8c007
<bochs:5>

此时,CPU执行到boot在调试时可以使用Bochs的断点设置命令、反汇编命令、信息显示命令等来辅助我们的调试操作。下面是一些常用命令的示例:

<bochs:8> u /10                                    # 反汇编从当前地址开始的10条指令
eax:0xaa55
ebx:0x0
ecx:0x110001
edx:0x0
ebp:0x0
esi:0x0
edi:0xffe4
esp:0xfffe
eflags:0x282
eip:0x7c00
cs:s=0x0, dl=0xffff, dh=0x9b00, valid=1
ss:s=0x0, dl=0xffff, dh=0x9300, valid=7
ds:s=0x0, dl=0xffff, dh=0x9300, valid=1
es:s=0x0, dl=0xffff, dh=0x9300, valid=1
fs:s=0x0, dl=0xffff, dh=0x9300, valid=1
gs:s=0x0, dl=0xffff, dh=0x9300, valid=1
ldtr:s=0x0, dl=0x0, dh=0x0, valid=0
tr:s=0x0, dl=0x0, dh=0x0, valid=0
gdtr:base=0x0, limit=0x0
idtr:base=0x0, limit=0x3ff
dr0:0x0
dr1:0x0
dr2:0x0
dr3:0x0
dr6:0xffff0ff0
dr7:0x400
tr3:0x0
tr4:0x0
tr5:0x0
tr6:0x0
tr7:0x0
cr0:0x60000010
cr1:0x0
cr2:0x0
cr3:0x0
cr4:0x0
inhibit_mask:0
done
<bochs:12>

由于Linux 0其他命令的使用方法请参考'help'命令。

14利用这个文件,我们可以在Bochs调试系统中快速地定位某个变量或跳转到指定的函数代码处。

...
Global symbols:

 _dup: 0x16e2c
 _nmi: 0x8e08
 _bmap: 0xc364
 _iput: 0xc3b4
 _blk_dev_init: 0x10ed0
 _open: 0x16dbc
 _do_execve: 0xe3d4
 _con_init: 0x15ccc
 _put_super: 0xd394
 _sys_setgid: 0x9b54
 _sys_umask: 0x9f54
 _con_write: 0x14f64
 _show_task: 0x6a54
 _buffer_init: 0xd1ec
 _sys_settimeofday: 0x9f4c
 _sys_getgroups: 0x9edc
...

同样,由于Linux 0.11内核的32位代码是从绝对物理地址0处开始存放的,system.map中全局变量的偏移位置值就是CPU中线性地址位置,因此我们可以直接在感兴趣的变量或函数名位置处设置断点,并让程序连续执行到指定的位置处

<bochs:12> lb 0xd1ec                              # 设置线性地址断点. ctxt): mov edx, dword ptr [ds:0x19958] ; 8b1558990100
<bochs:16>

程序调试是一种技能,需要多练习才能熟能生巧上面介绍的一些基本命令需要组合在一起使用才能灵活地观察到内核代码执行的整体环境情况。

Bochs使用简单教程 
Bochs是一个开源的虚拟机

但是,在其他一个方面它是处于绝对优势的。那就是它具有调试功能!这是一个让人振奋的功能。这个功能在你调试操作系统或者其他一些在裸机上运行的程序时候,会让你有一种在写windows下运行的应用程序的感觉有时候它是我们的救命稻草。没了它,也能活,但是肯定要糟糕的多。好了我们开始切入正题。

bat文件类似的。Bochs没有给我们提供图形界面的配置工具。这就需要我们自己来修改配置文件。

简单的配置就可以让你的操作系统在Bochs里面跑起来不要害怕他,其实很简单。关键是抛弃恐惧。

二、 启动Bochs 
配置文件已经写好了,硬盘文件等也都已经弄好了不过我一般都不这样做,我一般是写一个批处理文件。

很简单,如下所示: 
cd "d:\Bochs-2那么,我们如何进入调试状态呢?下面我们就来讨论这个问题。

三、 调试功能 
新建一个批处理文件,写入一下内容: 
cd "d:\Bochs-2你只有给他一个命令他才会继续。我们输入“c”,然后回车。是不是dos已经可是运行了?

如果没有运行说明你输入的窗口不对,你不会把c输入到那个没有光标的窗口了吧?如果真是那样我真是服了你了下面就是一些常用的调试命令。

我最想告诉大家的是这个指令,因为他可以告诉我们一切.当程序执行到0x7c00处就自动进入到调试状态.后面的这个数指的是内存的线性地址

.不过也没有什么大不了的。你只要稍微注意一下就可以了。

dump_cpu:这个是我最长用的三个指令之一。他的功能是显示现在的寄存器的状态,详细内容类似于: 
eax:0x00000000, ebx:0x00000000, ecx:0x00000000, edx:0x00000683 
ebp:0x00000000, esp:0x00000000, esi:0x00000000, edi:0x00000000 
eip:0x0000fff0, eflags:0x00000002, inhibit_mask:0 
cs:s=0xf000, dl=0x0000ffff, dh=0xff009bff, valid=1 
ss:s=0x0000, dl=0x0000ffff, dh=0x00009300, valid=1 
ds:s=0x0000, dl=0x0000ffff, dh=0x00009300, valid=1 
es:s=0x0000, dl=0x0000ffff, dh=0x00009300, valid=1 
fs:s=0x0000, dl=0x0000ffff, dh=0x00009300, valid=1 
gs:s=0x0000, dl=0x0000ffff, dh=0x00009300, valid=1 
ldtr:s=0x0000, dl=0x00000000, dh=0x00000000, valid=0 
tr:s=0x0000, dl=0x00000000, dh=0x00000000, valid=0 
gdtr:base=0x00000000, limit=0xffff 
idtr:base=0x00000000, limit=0xffff 
dr0:0x00000000, dr1:0x00000000, dr2:0x00000000 
dr3:0x00000000, dr6:0xffff0ff0, dr7:0x00000400 
cr0:0x00000010, cr1:0x00000000, cr2:0x00000000 
cr3:0x00000000, cr4:0x00000000 
u /20 0x7c00 :反汇编内存0x7c00处,反汇编的长度是20

现在,我们已经介绍了6条命令了。够了然后,在去掉这一句,设置一下断点,运行这个程序。是不是在指定位置中断了?

一:配置
bochs.exe是执行模式,不能调试的
---http://blog.chinaunix.net/u/15262/showart_411540.html

 

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-02-17
  • 2021-12-17
  • 2021-09-14
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-10-26
  • 2021-12-02
  • 2022-12-23
  • 2022-12-23
  • 2021-10-04
  • 2021-12-02
相关资源
相似解决方案