就不说介绍bochs的那些废话了,直接开整。

本次使用的开发环境为Ubuntu Kylin 16.04。

1.安装

bochs下载地址

我选择的版本是2.6.8。我并不知道不同版本之间有什么不同之处,但2.6.8版本对我而言就已经够用了。

下载完成后解压,并用下面这条命令安装一些必要的软件。

sudo apt-get install libx11-dev libc6-dev build-essential xorg-dev libgtk2.0-dev libreadline-dev

接着配置参数打开一些功能。

./configure --with-x11 --with-x --enable-debugger --enable-disasm --enable-all-optimizations --enable-readline --enable-long-phy-address --enable-ltdl-install --enable-idle-hack --enable-a20-pin --enable-x86-64 --enable-smp --enable-cpu-level=6 --enable-large-ramfile --enable-repeat-speedups --enable-fast-function-calls  --enable-handlers-chaining  --enable-trace-linking --enable-configurable-msrs --enable-show-ips --enable-cpp --enable-debugger-gui --enable-iodebug --enable-logging --enable-assert-checks --enable-fpu --enable-vmx=2 --enable-svm --enable-3dnow --enable-alignment-check  --enable-monitor-mwait --enable-avx  --enable-evex --enable-x86-debugger --enable-pci --enable-usb --enable-voodoo

接着就可以进行编译了。

make

你大概会遇上这么一个错误:

 make: *** No rule to make target 'misc/bximage.cc', needed by 'misc/bximage.o'.  Stop.

很正常,我也遇到了。在终端中输入以下命令再重新编译即可。

cp misc/bximage.cpp misc/bximage.cc
cp iodev/hdimage/hdimage.cpp iodev/hdimage/hdimage.cc
cp iodev/hdimage/vmware3.cpp iodev/hdimage/vmware3.cc
cp iodev/hdimage/vmware4.cpp iodev/hdimage/vmware4.cc
cp iodev/hdimage/vpc-img.cpp iodev/hdimage/vpc-img.cc
cp iodev/hdimage/vbox.cpp iodev/hdimage/vbox.cc

再然后就是安装了。

sudo make install

安装后要检查是否安装成功。在终端中输入如下命令。

type bochs

打印出bochs的地址就代表安装成功。

2.使用

为了更好使用bochs,创建一个配置文件,我将其命名为bochsrc。其内容如下:

plugin_ctrl: unmapped=1, biosdev=1, speaker=1, extfpuirq=1, parallel=1, serial=1, iodebug=1
config_interface: textconfig
#使用GUI调试
display_library: x, options="gui_debug"
cpu: model=core2_penryn_t9600, count=1, ips=50000000, reset_on_triple_fault=1, ignore_bad_msrs=1, msrs="msrs.def"
cpu: cpuid_limit_winnt=0
cpuid: x86_64=1, mmx=1, sep=1, simd=sse4_2, apic=xapic, aes=1, movbe=1, xsave=1
cpuid: family=6, model=0x1a, stepping=5
romimage: file=$BXSHARE/BIOS-bochs-latest 
vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest
vga: extension=vbe, update_freq=5
keyboard: type=mf, serial_delay=250, paste_delay=100000, user_shortcut=none
mouse: type=ps2, enabled=0, toggle=ctrl+mbutton
pci: enabled=1, chipset=i440fx
clock: sync=none, time0=local, rtc_sync=0
private_colormap: enabled=0

#软盘启动的配置,a.img为软盘名
floppya: type=1_44, 1_44=a.img, status=inserted, write_protected=0

ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata1: enabled=0, ioaddr1=0x170, ioaddr2=0x370, irq=15
ata2: enabled=0, ioaddr1=0x1e8, ioaddr2=0x3e0, irq=11
ata3: enabled=0, ioaddr1=0x168, ioaddr2=0x360, irq=9

# 硬盘启动配置,a.img为硬盘名,根据硬盘大小不同需改变后三个参数的值
#ata0-master: type=disk, mode=flat, path=a.img, cylinders=130, heads=16, spt=63
#ata0-slave: type=none
#ata0-master: type=none
#ata1-slave: type=none

# 软盘启动/硬盘启动
boot: floppy
# boot: disk

floppy_bootsig_check: disabled=0
log: -
logprefix: %t%e%d
panic: action=ask
error: action=report
info: action=report
debug: action=ignore
debugger_log: -
com1: enabled=1, mode=null
com2: enabled=0
com3: enabled=0
com4: enabled=0
parport1: enabled=1, file=none
parport2: enabled=0
speaker: enabled=1, mode=system
magic_break: enabled=0
print_timestamps: enabled=0
port_e9_hack: enabled=0
megs: 2048

为了能够进一步实践bochs的使用,可以创建一个汇编文件,我将其命名为test.s,内容如下:

    org 0x7c00
	
	mov cx, 19
    mov bx, 0x0007
    mov bp, msg
    mov ax, 0x1301
    int 0x10

loop:
	jmp loop
	
msg:
    db 13, 10
    db "This is a test!"
    db 13, 10

这个程序的功能是打印"This is a test!",然后进入死循环。具体细节不做过多介绍。

使用nasm(利用sudo apt install nasm进行安装)将该文件编译成二进制文件。

nasm test.s -o test.bin

利用bximage创建一个软盘镜像。bximage是安装bochs时顺带安装的软件。

 通过如上步骤可以创建一个名为a.img的软盘镜像。注意这里的a.img和bochsrc中软盘启动配置的a.img是相对应的。

下一步将test.bin装入a.img中。

dd if=test.bin of=a.img bs=512 count=1 conv=notrunc

接着执行如下命令就可以进行调试了。命令的具体细节请使用bochs --help进行查看。

bochs -qf bochsrc

我们可以得到如下界面。上面为调试器界面,下面为模拟器界面。

调试器界面左侧是各个寄存器的值,中间为机器码和汇编代码,右侧可以查看内存的内容,下侧是一个输入框,可以输入指令进行调试。

 模拟器由于还未开始运行程序,所以是黑洞洞的。

此时输入b 0x7c00,按下回车,再输入c,按下回车,界面发生改变。

可以看到从0x7c00-0x7c0c的代码与汇编代码一致,其余代码不一致是汇编语言的问题,这里不做过多解释。

此时模拟器正式开始运行。

输入b 0x7c0e,回车,输入c,回车。

可以看到模拟器中第二行打印了"This is a test!"。 

最后简单介绍bochs的一些查用指令。

h|help - 显示调试器命令
	h|help command - 显示命令的简短描述
q|quit|exit - 退出调试器,停止仿真器执行
u|disasm
	u|disasm [/count] <start> <end> - 对给定的线性地址的指令进行反汇编
		count选项是要反汇编的指令的数量
	u|disasm switch-mode - 在Intel和AT&T反汇编器之间交换语法
	u|disasm hex on/off - 控制反汇编偏移和位移格式
	u|disasm size=n - 告诉调试器用于反汇编的指令长度[16|32|64]
c|cont|continue - 继续执行
s|step
	s|step [count] - 在当前处理器执行#count条指令,默认为1条指令
	s|step [cpu] <count> - 在处理器#cpu上执行#count条指令
	s|step all <count> - 在所有处理器上执行#count条指令
p|n|next - 执行指令跨越子程序
pb|pbreak|b|break <addr> - 设置一个物理地址指令断点
d|del|delete <n> - 删除一个断点
blist - 列出所有断点(同info break)

查看内存内容可以通过调试界面菜单View->Linear MemDump...->输入地址,界面右侧就会出现内存内容,以16进制形式出现。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐