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的执行情况,以及各个寄存器和内存单元的内容,对于掌握程序的运行情况是很有好处的。

 

posted @ 2019-05-31 09:33  pro_love  阅读(2173)  评论(0编辑  收藏  举报