bochs除錯教程
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,執行完畢。
相關文章
- JVM中jhsdb除錯教程JVM除錯
- Javac 原始碼除錯教程Java原始碼除錯
- Node 除錯工具入門教程除錯
- linux啟動bochsLinux
- Xcode Instruments除錯swift入門教程XCode除錯Swift
- Google Chrome 除錯JS簡單教程GoChrome除錯JS
- Emscripten教程之如何除錯程式碼(六)除錯
- 除錯篇——除錯物件與除錯事件除錯物件事件
- 物聯網學習教程—常見錯誤和程式除錯除錯
- 保姆級教程:VsCode除錯docker中的NodeJS程式VSCode除錯DockerNodeJS
- IOS動態除錯彙總-傻瓜版教程iOS除錯
- IDEA 除錯圖文教程,讓 bug 無處藏身!Idea除錯
- Windows windbg kernel debug 雙機核心除錯 - USB3.0 除錯 USB除錯 除錯線Windows除錯
- [譯] Xcode 和 LLDB 高階除錯教程:第 3 部分XCodeLLDB高階除錯
- 使用spyder3除錯python程式的簡明教程除錯Python
- [譯] Xcode 和 LLDB 高階除錯教程:第 1 部分XCodeLLDB高階除錯
- IsDebuggerPresent的反除錯與反反除錯除錯
- Python 程式碼除錯—使用 pdb 除錯Python除錯
- nginx 錯誤除錯Nginx除錯
- 後端適用,Apifox介面文件設計和除錯教程後端API除錯
- [文件教程]解決SAE下本地除錯相關問題除錯
- 除錯toybox除錯
- Linux除錯Linux除錯
- postman除錯Postman除錯
- gdb除錯除錯
- 前端除錯前端除錯
- python 除錯Python除錯
- LLDB除錯LLDB除錯
- 2020最新蘋果App真機除錯測試詳細教程蘋果APP除錯
- windbg除錯系列教程:sos擴充套件的介紹和使用除錯套件
- 反除錯&反反除錯 -- 利用sysctl檢測偵錯程式是否存在除錯
- .NET高階除錯系列-Windbg除錯入門篇高階除錯
- 【除錯】SystemTap除錯網路卡狀態一例除錯
- [005][x86組合語言]開發環境配置:硬碟主引導扇區程式碼:顯示標號偏移地址 基礎Bochs除錯命令...組合語言開發環境硬碟除錯
- win10 如何除錯串列埠_win10串列埠除錯怎麼除錯Win10除錯串列埠
- vscode使用chrome除錯報錯VSCodeChrome除錯
- SNMP Trap 除錯除錯
- AS斷點除錯斷點除錯
- uniapp wifi除錯APPWiFi除錯