GNU开发工具——Bochs模拟器

GNU开发工具——Bochs模拟

一、Bochs简介

1、Bochs简介

Bochs是一款X86硬件平台的开源模拟器。VMware、Virtual PC、VirtualBox等虚拟机软件采用虚拟化技术,部分指令直接交给硬件执行,而Bochs模拟器完全靠软件模拟来实现,从启动到重启,包6 Y 1括PC外设键盘、鼠标、VGA卡、磁盘、网卡等全部由软件来模拟,因此Bochs模拟器非常适合开发操作系统,其自带bochsdbg调试器使得调试操作系统非常容易。

2、Boc1 M [ k 9hs源码安装8 e _ Q ? b c a A

下载2.6.? | w + & ? ; 8版本源码:
https://~ Y C U % : }sourceforge.net/projects/bochs/
编译配置:
configure --enable-debugger --enable-dis! 5 Aasm --enable-debugger-gui
编译:
make -j
安装:
make install

3、Bochs启动方式

Bochs模拟器启动时需要加载配置文件,可以通过-f显D a c示指定配置文件,也可以隐式从当前目录加载配置文件。
W $ i x X 7 / t示加载:
bochs -f bochsrc_file
隐式默认加载配置文件:

bochs -f .bochsrc
bochs -f bochsrc
bochs -f bochsrc.txt

4、Bochs配置

##d D % *##################################################

# Bochs的配置文件
# Configuration file for Bochs
####################################################
#^ Q | B ) - f i q how much memory the emulated ma8 4 a g ? K | hchine will hav| ! W t P 9e
megs: 32
# filenameof ROM images
romimage:file=/usr/local/share/bochs/BIOS-bochs-latest
vgaromimage:file=/usr/local/share/boZ # O & ichs/VGABIOS-lgpl-latest
# wh} L xich disk image will be uU O ; C osed
floppya:1_44=hello.img, status=inserted
# choose the boot disk 确定启动方式
boot: floppy
# where dJ n i V & ] 0 } ^o we send log messages?
log: bochsout.txt
# disable the mouse
mouse: enabled=0
# enable ke- Y .y mapping ,using US layout as default
keyboard:keymap=/uM Q dsr/local/share/bochs/keymaps/x11-pc-us.map

megs: 32,指定内存大小,单位MB
romimage:file=/usr/local/share/bochs/BIOS-bochs-latest,指定系统BIOS文件
vgg , i . / [aromimage:file=/usr/local/share/bochs/VGABIOS-lgpl-latest,指定显卡BIOS文件
floppya: 1_44=hello.img, status=inserted,指定软驱映像
boot: floppy,指定启动B ! ] 4 4 ^ t ^ o方式,如floppy、cdrom、c

二、Bochs调试@ f { L 1 : i

1、Bochs调试器简介

Bochs调试器需要在编译Bochs时支持,Bochs调试器支持设置断点、单步执行指令等其它GDB调试器支持的功能,--enable-debugger选项调试器支持,
--enable-debugger-gui选项调试器GU; % Q - ) I t %I支持。
configure --ena, f - %ble-debugger --ef # q n a o O + 7nable-debugg^ r ! ~ $er-gui

2、执行控制

continue:继续执行,简写c
step [% G ) 8 ^ S 2 ^ Rcount]:执行co^ V _ 1 ! i V /unt条指令,如果不指定参数,默认为1,sF n ! T G + ! O utep可以简写为s。
step [cpu] [count]:在cpu上执行count条指令,count默认值为1,step可以简写为s。
step all [count]:在所有cpu上都执行count条指令,count默认值为1。
Ctrl-C:停止执行,返回到命令行提示符
Ctrl-D:如果在空行上执行,则退出调试器
quit,exit:退出调试器,继续执行。quit可以简写为q。

3、断点

vbreak seg:off:C M :设置虚拟地址指令断点A ! k 9 1 b D M,vbreak可以简写为vb。
lbrep k y 4 -ak addr:在线性地址指令上设置断点,lbre_ ^ 8ak可以N t E简写为lb。
pbreak [*] addr:在物理地址上设E M = C M Q % f置断点,pbreak可以简写为} 4 M % {pb,*符号是兼容GDB命令,为可选参数。
break [*] addr:设置断点,break可以简写为b
info break:显示当前所有断点状态
bpe n:开启断点
bH ] l Q n 8pd n:关闭断点
delete n:删除断点,delete可以简写为del,d

4、数据断点

watch read addr:在物理地址a h c Rddr上@ p ? N M 7插入读观察点
watch write addr:在物理地址addr上插入写观察V B } R j
watch:显示当Q + a 0前内存观察点) ( m p的显示状态
watch stop:当遇到观察点时,停止模拟执行G a 3 8 : l(默认)
watch continue:在遇到观察点时,不要停止模拟执行
unwatch addr:移除指定物理地址上的观察点
unwatch:移除所有的观察点
trace-mem on/off:开启/关闭内存访问追踪

5、内存操作

x /nus [ / ~f addr:在线性地址addr处检查内存X c w P 3 3内容
xp /nuf addr:在物理地址 addr处查看内存内容
n:指z q C (定要显示的内存单元的数量。
u:显示的内存单元的大小,b为单字,h为半字,w为字,R N 5 L + eg为双字。
fx G ^:打印的格式,x为十六进制打印,d为十进制打印,o为八进制打印,t为二进制打印,u为无符号十进制打印。
s g c p } B eetpmem addr datasize val:在内存位置addr处 设置datasize大小内存,值为 val
writemem:从指_ = 8 a定线性地址dump一个字节的内存内容 到一个文件中
crc addr1 addr2:显示物理地址范围. c Q 9 2 F addr1..addr2之间内容的 CRC值

6、查看信息命令

r/reg/regs/registers:查看CPU整数寄存器和内容
fp/fpu:查看FPU寄存器和内容
mmx:查看MMX寄存器和内容
sse/xmm:查看SSE寄存器和内容
ymm:查看所有AVX寄存器和% U h Z . ( Q m内容
sreg:查看段寄存器和内容
dreg:查看调试寄存器和内容
creg:查看控制寄存器和内容
info cpu:查看CPU所有的寄存器以及内容
info eflags:显示解; 0 % 0 O @析的EFLAGS寄存器
info tab:8 k g V显示分页地址7 ; Y C转换
info device:显示指定设备的状态
info break:显示当前所有断点状态

7、CPU寄存器操作

set reg = expr:修改CPU寄存b 9 6 i 8 | W C h器值为expr。当前只有通用寄存器和指令寄存器支持修改。不能够修改标志寄存器,段寄存器,浮点寄存器和SIM4 ~ -D寄存器。
registex Y 4 V Drs:查看CPU寄存器及值,可以简写为regs,reg,r。

8、反汇编操作

disassemble start end:在给定的线性地址范围内反汇编指令,包含start处指令,o M Q 8 K 9 R m不包含end处指令。使用”set $disassemble_size =”告诉调试器设定的段大小。如果只想反a m u S %汇编第一条指令,则可以不给出end,或将end值设置小于start6 * # V i e * H h即可。
disassem^ G x ? t = N ible switch-mode:在Intel和 AT&T两种汇编风格之间切换
disassemble size = nb % Z 2 ) 2 Y 9 +:设定调试器执行反汇编命令时使用的段大小,N | P ^使用0,16,32。值0意思是使用当前的CS段寄存器,默认值是0.
set $aut: ) i / + ho_disassemble = n:如果n=1,每次停止执行时就反汇编当= G w # 2 O前的指令,默认值为0。当前CPU上下文的段大小用于反汇编,所以变量”disassemble size”就被忽略了。
se6 C Z 2 E R ht disassemble on:’set $auto_disassem/ h E z k qble = 1’
s- 6 get disassemble off:’set $auto_disassemble = 0’

9、指令跟踪

trace on:反汇编每一条执行的指令。
trace off:关闭指令跟踪功能

10、指令功能

Bochs指令功能需要: . f i y 1 ^在编译时设置,需要在”instrument/“目录下构建自定义的指令库到单独目录中,在配置中设置想要使用G , 9 /的指令库,用--enable-inE * j # j 8 J Ystrumentation选0 7 %项指定。
-enable-instV R Jrume4 t Jntation="instrument/stubs"

11、其它指令

ptime:打印当前时间
sb delta:在未来执行中插入一个时间断点“delta”指2 2 k X 1 0 /令(“delta”是一个64位的整数,跟着字母”L”,例如1000L
print-stack [num words]:打印num words个栈顶端的16-bit字。num words默认165 - . * j D # ~ +,只在保护模式下栈的段寄存器基址是0的情况下才有效。
modebp:触发CPU模式转换断点
ldsym [global] filenamP u 8e [offset]:从文件filename加载符号。如果添加了全局关键字,在所有的上下文中(即使那个上下文@ l { ` 5 T _没有加载这些符号)符号都可见。Offset(默认值为0) 被添加到每一个符号条目。} F 8符号仅仅不加载当前正在执行的上下文。符号文件由零个或多行的”%x %s”格式的组成。
show - 显示当前的模式
show mode - 当处理器切换模式时显示
show int - 当中断发生时显示
show call - 当调用发生时显示
show ret - 当返回发生时显示
show off - 关闭符号信息
show dbg-all - 开启所有的显示标记
show dbg-none - 关闭所有的显示标记

三、Bochs调试器GUI支持

1、Bochs GUI调试支持

Bochs调试器GUI支持需要在编译时进行设置,在编译时就需要用默认的调试器开关和参数标记--enaA 4 % , T u 9 u 7ble-debugger-gui进行配置。
configure --enable-debugger --enable-disasm --enable-debugger-gui

2、GUI启动配置

Bochs启动运行时,如果需要以GUI方式启动,需要将gui_debug值添加进display_lib! ; R d B = f =rary选项z S {参数中。
display_library: x, opt& G X x ! 8 + ] Yions="gui_debug"
支持GUI的bochsrc.txt配置文件如下:

####################################### . %##############
# Bochsu C & - 6 k ` (的配置文件
#Y v ~ k h H Configuration file form L 3 Z 2 l Y h Bochs% a 8 W j t
#####################################################
# how much memory the emulated machine will haS ~ Ove
megs: 32
# filenameof ROM imagl { ) 0 8 v u P )es
romimage:file=/usr/local/share/bochs/BIOSo C ?-bochs-latest
vgaromimage:file=/usr/local/share/bochs/VGABIOS-lgpl-latest
# which disk image will be used
floppya:1_44=hello.img, status=inserted
# choose the boot disk 确定启动方式
boot: n I {: floppy
# where do we send log messages?
log: bochsout.txt
# disable thF = d [ - he mouse
mouse: enabled=0
# enable key mapping ,using US layo5 x Y K eut as default
keyboard:keymap=/usr/local/share/bochs/keymaps/x11-pc-us.m! , B : l [ap
# GUI suppoF Z Art
display_library: x, options="gui_debug"

Bochs调试器GUI如下:
GNU开发工具——Bochs模拟器