如果你准备写一个操作系统或者只是体验一下linux的开机流程,写一个简单的bootloader,你可能会需要一个软件–Bochs, Bochs是一个开源软件,是你唯一可选择的调试器.开源意味着你不需要花钱购买就可以使用它. 它用软件来模拟处理器取指令和执行指令的过程,以及整个计算机硬件.当它开始运行时,就直接模拟计算机的启动过程.正是因为如此,它才有可能做一些调试工作.很重要的一点,它本身就是一个虚拟机,类似于Virtualbox.因此,它也很容易就让你单步跟踪硬盘的控制权,查看寄存器的内容和状态.
Bochs的安装
官网下载安装包解压即可,主要是配置文件,我的内核研究者的好盆友huloves发给了我一份配置文件
# 若只有一个软盘,则使用 floppya即可,若有多个,则为floppya,floppyb...
#floppya: 1_44=a.img, status=inserted
# 选择启动盘符
#boot: floopy #默认从软盘启动,现在很少有软盘了
boot: disk
# 设置日志文件的输出
log: bochs.out
# 开启或关闭某些功能
# 关闭鼠标,并打开键盘,键盘的路径不一定是这个,比如我的是/usr/share/bochs/keymaps/x11-pc-us.map
mouse: enabled=0
keyboard:keymap=/usr/local/share/bochs/keymaps/x11-pc-us.map
# 硬盘设置,你需要使用bximage创建一个硬盘,然后它会返回ata0-master所需要的信息,path你需要改成你的绝对路径
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata0-master: type=disk, path="/home/huloves/bochs-2.6.11/hd60M.img", mode=flat, cylinders=121, heads=16, spt=63
ata0-slave: type=disk, path="/home/huloves/bochs-2.6.11/hd80M.img", mode=flat, cylinders=162, heads = 16, spt = 63
######################### 配置文件结束 ###########################
创建硬盘结束,你需要将你的启动引导Bootloader写入你创建的硬盘中, if = 启动引导文件 of= 你刚创建的磁盘
dd if=boot.bin of=a.img bs=512count=1 conv=notrunc
你需要找的bochsrc所在位置,然后在命令行bochs -f 配置文件所在位置
,例如我的是这样的bochs -f /etc/bochs-init/bochsrc
启动bochs虚拟机
就像一台真正的计算机一样,Bochs的"处理器"加电后,要开始取指令执行指令.但,与真正的处理器不同的是,Bochs在执行它启动之后的第一条指令之后,会停下来,等待你的调试命令.
1指的是物理内存地址
2指的是逻辑地址,即段寄存器CS和指令指针寄存器IP的内容,是以16进制显示的,等效于0xf000:0xfff0
3指的是下一条要执行的指令的汇编代码
3以注释的形式指的是指令的机器码部分
现代处理器在加电后,所有的高端的地址线都被强制为高电平,直到遇到并执行了第一个段间转移指令,段间转移指令是在两个代码段之间实施控制转移,也就是同时改变段寄存器CS和指令指针寄存器IP的jmp指令,就像jmp 0xf000:0xfff0
就是一个典型的例子.因此,当该指令执行后,处理器的物理地址就仅取决于CS和IP了.
接下来,介绍一些Bochs的调试指令
-
s(step): 执行下一条命令
-
b(break): 断点调试命令
-
c(continue): 处理器不间断的持续执行命令,如果设置了断点,在断点出停下来
-
r(register): 显示通用寄存器的内容
-
sreg(segment register): 显示段寄存器的内容
-
xp(eXamine memory): 显示指定物理内存地质处的内容
-
n:跳过同一次指令的多次重复执行
-
u: 跳过条件转移指令构造的特殊循环体
-
info eflags:查看标志寄存器的状态位,大写为1,小写为0
-
xp: 查询从某个地址开始的N个字节的内存
xp /Nbx 物理地址
,例如:显示实模式下的中断向量表’xp /1024bx 0’