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的執行情況,以及各個寄存器和內存單元的內容,對於掌握程序的運行情況是很有好處的。