linux中使用bochs调试helloword引导程序
1.环境工具
ubuntu 18.04.1
nasm
bochs
2.nasm安装:sudo apt-get install nasm
编译bochs依赖包的安装库:sudo apt-get install vgabios xorg-dev bochs-sdl bochs bochs-x bochsbios bochs-doc libgtk2.0-dev
下载bochs源码,http://bochs.sourceforge.net/,下载最新版本bochs-2.4.6.tar.gz
解压源码包,并进入解压目录bochs-2.6.9,执行
./configure --enable-disasm --enable-debugger
make && make install
3.写一个主引导扇区执行代码boot.asm,并用以下命令编译
nasm boot.asm -o boot.bin
org 07c00h ;告诉编译器,程序加载到内存地址07c00h mov ax,cs mov ds,ax mov es,ax call DispStr ;调用显示字符串例程 jmp $ ;无限循环 DispStr: mov ax,BootMessage mov bp,ax ;es:bp = 字符串地址 mov cx,16 ;cx = 字符串长度 mov ax,01301h ; ah = 13h, al = 01h mov bx,000ch ;页号为0(bh = 0) 黑底红字(bl = 0Ch,高亮) mov dl,0 int 10h ;10h号中断 ret BootMessage: db "Hello, OS World!" times 510-($-$$) db 0 ;填充剩下的空间,使生成的二进制代码恰好为512字节 dw 0xaa55 ;MBR结束标志
4.使用dd命令将boot.bin写进软盘映像disk.img的第一个扇区
dd if=boot.bin of=disk.img bs=512 count=1 conv=notrunc
5.创建bochs启动的配置文件bochsrc,内容如下:
romimage: file=/usr/share/bochs/BIOS-bochs-latest
megs: 32
vgaromimage: file=/usr/share/bochs/VGABIOS-lgpl-latest
floppya:1_44=disk.img, status=inserted
boot:floppy
log: bochsout.txt
mouse: enabled=0
6.执行命令bochs -f bochsrc,会暂停在BIOS中,等待调试
这时,就可以设置断点,物理地址0x7c00,使用bochs的各种调试命令来查看运行情况,命令后面会讲到
最后界面会出现红色字符串"Hello, OS World!"
7.bochs的基本命令大概分为以下几类
(1).断点设置命令
vb/vbreak seg:offset
在虚拟地址上设置指令断点,其中seg和offset可以是以0x开始的十六进制数,或十进制,或者是以0开头的八进制数
lb/lbreak addr
在线性地址上设置断点,addr同上
b/break/pb/pbreak addr
在物理地址上设置断点
info break
显示当前所有断点的信息
d/del/delete n
删除一个断点
(2).执行控制命令
c/cont/continue
连续执行
s/step/stepi [count]
执行count条指令,默认为1条,会跟进到函数和中断调用的内容
p/n/next [count]
执行count条指令,默认为1条,但跳过函数和中断调用
Ctrl+C
停止执行,并回到命令行提示符
q/quit/exit
退出调试和执行
(3)内存操作指令
x /nuf addr
检查位于线性地址addr处的内存内容
xp /nuf addr
检查位于物理地址addr处的内存内容
其中参数n,u,f分别表示:
n为显示内存单元的计数值,默认为1
u表示单元大小,默认值为w
b(bytes) 1字节
h(halfwords) 2字节
w(words) 4字节
g(gaintwords) 8字节
f为显示格式,默认值为x
x(hex) 显示为16进制数
d(decimal) 显示为10进制数
u(unsigned) 显示为无符号10进制数
o(octal) 显示为8进制数
t(binary) 显示为2进制数
c(char) 显示为对应的字符
(4)信息显示和CPU寄存器操作命令
r/reg/regs/registers
显示cpu寄存器及其内容
set $reg=val
修改寄存器的内容,除了段寄存器和标志寄存器以外,其它寄存器都可以修改.
creg
所有CR0-CR4寄存器
sreg
CPU全部状态信息,包括各个段选择子(cs,ds等),ldtr,gdtr等
print-stack
打印堆栈情况
info tab
显示页表
(5)反汇编命令
u/disasm/disassemble start end,反汇编给定线性地址范围的指令
u /10反汇编从当前地址开始的10条指令.
bochs的调试功能可以直接看到cup的执行情况,以及各个寄存器和内存单元的内容,对于掌握程序的运行情况是很有好处的。