实验环境
- VMware Workstation Pro
- ubuntu 20.10 amd64
实验步骤
安装Nasm
sudo apt install nasm
创建引导扇区
首先编写汇编代码。使用命令vim boot.asm
创建 boot.asm 文件
写入以下代码:
org 07c00h
mov ax, cs
mov ds, ax
mov es, ax
call DispStr
jmp $
DispStr:
mov ax, BootMessage
mov bp, ax
mov cx, 16
mov ax, 01301h
mov bx, 000ch
mov dl, 0
int 10h
ret
BootMessage: db "Hello, OS world!"
times 510 - ($-$$) db 0
dw 0xaa55
输入 :wq
保存并退出。再使用命令nasm boot.asm -o boot.bin
生成 boot.bin 文件。
安装Bochs
使用命令sudo apt-get install vgabios bochs bochs-x bximage
使用bximage创建虚拟软盘
输入命令bximage
,显示如下画面:
选择生成 fd(软盘),其他选择可以使用默认值,直接按回车。完成这一步后,当前目录就生成了软盘映像 a.img 。
将引导扇区写入软盘
使用命令dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc
编写Bochs的配置文件
使用命令 vim bochsrc
,将以下内容写入
megs: 32
romimage: file=/usr/share/bochs/BIOS-bochs-latest
vgaromimage: file=/usr/share/vgabios/vgabios.bin
floppya: 1_44=a.img, status=inserted
boot: floppy
log: bochsout.txt
mouse: enabled=0
启动Bochs 虚拟机(举有调试功能)
输入命令bochs -f bochsrc
.进入后,返回终端,输入···c···,则会直接显示出 Hello,OS world。
若想调试,可参考下表
查找和定位代码
行为 | 指令 | 举例 |
---|---|---|
在某物理地址设置断点 | b addr | b 0x7c00 |
显示当前所有断点信息 | info break | info break |
继续执行,直到遇上断点 | c | c |
单步执行(n次) | s n | s 100 |
单步执行(遇到函数跳过) | n | n |
反汇一段内存 | u start end | u 0x30400 |
查看寄存器
行为 | 指令 | 举例 |
---|---|---|
查看所有寄存器 | info cpu | info cpu |
查看通用寄存器 | r | r |
查看段寄存器 | sreg | sreg |
查看控制寄存器 | creg | creg |
查看调试寄存器 | dreg | greg |
查看内存
行为 | 指令 | 举例 |
---|---|---|
查看内存物理地址内容 | xp /nuf addr | xp /40bx 0x9013e |
查看线性地址内容 | x /nuf addr | x /40bx 0x13e |
想要使用更多指令,可以参考8.15 Using Bochs internal debugger,或Bochs调试常用命令