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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM