bochs除錯教程

1000copy發表於2017-02-14

bochs可以除錯os,這個功能不一般,所以在學習過程中做一個簡單的記錄。

涉及到的工具有: 1. bochs 偵錯程式和pc模擬器 2. nasm 彙編器,彙編原始碼為機器碼 3. dd 寫入img檔案

假設一個bootsect,它可以列印hello到顯示器,我們以此為案例學習bochs除錯。程式碼是這樣的(1.asm):

    mov ah, 0x0e ; tty mode
    mov al, 'H'
    int 0x10
    mov al, 'e'
    int 0x10
    mov al, 'l'
    int 0x10
    int 0x10 ; 'l' is still on al, remember?
    mov al, 'o'
    int 0x10

    jmp $ ; jump to current address = infinite loop

    ; padding and magic number
    times 510 - ($-$$) db 0
    dw 0xaa55 

首先編譯程式碼: nasm -f bin -o 1.bin 1.asm 然後寫入映像檔案: dd if=1.bin of=1.img bs=512 count=1 conv=notrunc 配置bochs檔案(bochsrc.bxrc):

    # 第一步,首先設定Bochs在執行過程中能夠使用的記憶體,本例為32MB。
    # 關鍵字為:megs
    megs: 32
    # 第二步,設定對應真實機器的BIOS和VGA BIOS.
    # 對應兩個關鍵字為:romimage 和 vgaromimage
    romimage: file=$BXSHARE/BIOS-bochs-latest
    vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest  
    # 第三步,設定Bochs所使用的磁碟,軟盤的關鍵字為floppy。
    # 若只有一個軟盤,則使用floppya即可,若有多個,則為floppya,floppyb...
    floppya: 1_44=1.img, status=inserted
    # 第四步,選擇啟動碟符。
    boot: floppy
    # 第五步,設定日誌檔案的輸出。
    log: bochsout.txt
    # 第六步,開啟或關閉某些功能。
    # 下面是關閉滑鼠,並開啟鍵盤。
    mouse: enabled=0

特別留意,設定floppya的時候,填寫img檔名稱,這裡是1.img。

然後啟動bochs.exe,可以看到模擬器螢幕上顯示:

  hello

此時環境設定完畢。現在需要除錯的話,啟動的不是bochs,而是bochsdbg.exe。啟動後,隨機進入等待狀態,可是嘗試單步執行,使用s命令。然而看到的都是不懂的指令,也和我們的程式碼無關,因為剛剛進來的時候執行的程式碼是bios指令。我們的指令被載入在0x7c00處,可以通過b指令設定斷點,使用c指令執行到斷點:

b 0x7c00
c

系統回應:

    (0) [0x000000007c00] 0000:7c00 (unk. ctxt): mov ah, 0x0e              ; b40e   

確實是我們的第一個指令。使用u指令反彙編到: u 0x7c00 0x7c16 響應:
00007c00: ( ): mov ah, 0x0e ; b40e 00007c02: ( ): mov al, 0x48 ; b048 00007c04: ( ): int 0x10 ; cd10 00007c06: ( ): mov al, 0x65 ; b065 00007c08: ( ): int 0x10 ; cd10 00007c0a: ( ): mov al, 0x6c ; b06c 00007c0c: ( ): int 0x10 ; cd10 00007c0e: ( ): int 0x10 ; cd10 00007c10: ( ): mov al, 0x6f ; b06f 00007c12: ( ): int 0x10 ; cd10 00007c14: ( ): jmp .-2 ; ebfe

再次設定斷點,並執行到此處:

b 0x7c10
c

回應: 顯示為hell。

在c,執行完畢。

相關文章