分类: LINUX
2012-05-27 14:33:35
Bochs是一个基于LGPL的开源x86虚拟机软件,它能够仿真整个Intel x86计算机的程序,它还支持所有的标准PC外设的驱动模型:键盘,鼠标,VGA显卡/显示器,磁盘,时钟芯片,网卡.Bochs能够仿真整个PC环境,这也导致了它仿真的速度比较慢,相比于其它虚拟机性能要差很多。
而且,现在的Bochs已经实现了一定程度的调试功能,对跑在Bochs里面的代码来说,这就是“硬件调试器”。所以,bochs非常适合调试我们自己的操作系统。Bochs的调试命令风格是按照GDB习惯来设计的,如果你习惯使用gdb,会发现bochs的调试命令很熟悉,很容易上手。
1.下载源码包
到Bochs官网下载最新版本的bochs源码包,我的版本为2.5.1。然后用tar命令解压并cd进入其目录。
tar vxzf bochs-2.5.1.tar.gz
cd bochs-2.5.1
注意:如果你的系统没有安装G++编译器,请安装,否则会在./configure的过程中出错
2. 执行配置,开启调试和反汇编
./configure --enable-debugger --enable-disasm
3:出错处理
我在ubuntu10.04 11.04 和12.04下安装bochs都会出现以下两个错误:
1:ERROR: X windows gui was selected, but X windows libraries were not found.
通过安装xorg-dev包解决:sudo apt-get install xorg-dev
2:Package gtk+-2.0 was not found in the pkg-config search path.Perhaps you should add the directory containing `gtk+-2.0.pc'to the PKG_CONFIG_PATH environment variableNo package 'gtk+-2.0' foundERROR: pkg-config was not found, or unable to access the gtk+-2.0 package.Install pkg-config and the gtk+ development package,or disable the gui debugger, or the wxWidgets display library (whichever is being used).
输入下面命令解决:sudo apt-get install libgtk2.0-dev
4.重新执行配置(如果出错,请执行上述处理)
./configure --enable-debugger --enable-disasm
然后运行make
再sudo make install
5.完成,执行bochs
bochs在启动的时候,会在用户的当前目录下按照顺序将如下文件作为默认的配置文件:
.bochsrc bochsrc bochsrc.txt
因此,我们需要自己写一个配置文件,放在自己的工作目录下,然后在该目录下执行bochs命令,或者你也可以使用-f参数来指定使用哪一个配置文件。
下面是一个简单的Bochs配置文件:
###############################################
# Configuration file for Bochs
###############################################
# 第一步,首先设置Bochs在运行过程中能够使用的内存,本例为32MB。
# 关键字为:megs
megs: 32
# 第二步,设置对应真实机器的BIOS和VGA BIOS.
# 对应两个关键字为:romimage 和 vgaromimage
romimage: file=$BXSHARE/BIOS-bochs-latest
vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest
# 第三步,设置Bochs所使用的磁盘,软盘的关键字为floppy。
# 若只有一个软盘,则使用floppya即可,若有多个,则为floppya,floppyb...
floppya: 1_44=a.img, status=inserted
# 第四步,选择启动盘符。
boot: floppy
# 第五步,设置日志文件的输出。
log: bochsout.txt
# 第六步,开启或关闭某些功能。
# 下面是关闭鼠标,并打开键盘。
mouse: enabled=0
keyboard_mapping: enabled=1, map=$BXSHARE/keymaps/x11-pc-us.map
更详细内容可以使用man bochsrc命令查询,每一个关键字都有详细解释。
c 继续执行,直到遇到断点
s 单步执行,遇到函数进入函数体,count 默认为 1。
n 单步执行,遇到函数则跳过函数体。
q 退出调试,同时关闭虚拟机。
b [addr] 在物理地址上下断点,地址前可以加上一个“*”。
vb [seg:off] 在虚拟地址上下断点。
lb [addr] 在线性地址上下断点。
blist 显示断点状态。
delete [num] 删除断点。mum是断点号,可以用blist命令查询。
info break 显示断点信息。
watch read [addr] 设置读断点。
watch write [addr] 设置写断点。
unwatch read [addr] 清除读断点。
unwatch write [addr] 清除写断点。
watch 显示当前所有读写断点。
unwatch 清除当前所有读写断点。
watch stop|continue 开关选项,设置遇到读写断点时,中断下来还是显示出来但是继续运行。
x /nuf [addr] 显示线性地址的内容
xp /nuf [addr] 显示物理地址的内容
n 显示的单元数
u 每个显示单元的大小,可以是 b BYTE,h WORD,w DWORD,g DWORD64
f 显示格式
setpmem [addr] [size] [val] 设置物理内存某地址的内容,size的值只能是0x1,0x2,0x4
查看堆栈的值:print-stack
查看所有寄存器的值:info cpu
查看通用寄存器的值:r
查看段寄存器的值:sreg
查看控制寄存器的值:creg
查看浮点寄存器的值:fp
设置寄存器的值: set $reg = val
r reg = val 同上。
显示完整的CPU信息:dump_cpu
设置CPU状态:set_cpu
u|disas|disassemble [/num] [start] [end]
反汇编物理地址start到end 之间的代码,如果不指定参数则反汇编当前EIP指向的代码。
num是可选参数,指定处理的代码量。
trace-on:反汇编执行的每一条指令。