2021-05-12 14:32:11
Ubuntu上使用Bochs
2020-06-16 17:30:42
Bochs是一個不錯的模擬器,僅以此文記錄Ubuntu上一些使用方法。
安裝bochs
這個問題看似很簡單,但是實際上用的時候你會發現一個問題。在ubuntu上你要這麼裝:
apt-get install bochs
apt-get install bochs-x
如果不裝第二個,執行的時候會報一個錯。
>>PANIC<< dlopen failed for module ‘x’: file not found
執行最簡單的一個MBR
bochs的執行很簡單,執行如下命令即可。
bochs -f bochsrc
關鍵資訊就在這個bochsrc的組態檔中了。這裡貼出一個最簡單,只執行一個MBR的組態檔。
###############################################################
# Configuration file for Bochs
###############################################################
# how much memory the emulated machine will have
megs: 32
# filename of ROM images
romimage: file=/usr/share/bochs/BIOS-bochs-latest
vgaromimage: file=/usr/share/vgabios/vgabios.bin
# what disk images will be used
floppya: 1_44=a.img, status=inserted
# choose the boot disk.
boot: floppy
# where do we send log messages?
# log: bochsout.txt
# disable the mouse
mouse: enabled=0
# enable key mapping, using US layout as default.
#keyboard_mapping: enabled=1, map=/usr/share/bochs/keymaps/x11-pc-us.map
其中我關心的是啟動選項和啟動盤的選擇。
完整例子的檔案
我把我使用的相關檔案給出,方便有興趣的同學使用。
boot.asm – MBR程式碼
org 07c00h ; 告訴編譯器程式載入到7c00處
mov ax, cs
mov ds, ax
mov es, ax
call DispStr ; 呼叫顯示字串例程
jmp $ ; 無限迴圈 $代表當前地址
DispStr:
mov ax, BootMessage
mov bp, ax ; ES:BP = 串地址
mov cx, msgLen ; CX = 串長度
mov ax, 01301h ; AH = 13, AL = 01h
mov bx, 000ch ; 頁號為0(BH = 0) 黑底紅字(BL = 0Ch,高亮)
mov dl, 0 ; 將DL中的ASCII碼顯示到螢幕,將' '送到DL中,並顯示
int 10h ; 10h 號中斷
ret ; 返回到呼叫處
BootMessage: db "Hello, OS world!"
msgLen: equ $ - BootMessage
times 510-($-$$) db 0 ; 填充剩下的空間,使生成的二進位制程式碼恰好為512位元組
dw 0xaa55 ; 結束標誌
makefile – 製作帶有MBR的軟碟
all: a.img
a.img: boot.asm
nasm boot.asm -o boot.bin
dd if=boot.bin of=a.img
dd if=/dev/zero of=a.img seek=1 bs=512 count=2879
clean:
rm -f a.img boot.bin
bochsrc – 執行bochs的組態檔
見上文
vm_start.sh – 啟動MBR
bochs -f bochsrc
有了這些,大家就可以執行起來了。雖然這個非常簡單,但能跑起來感覺還是很棒的。
嘗試偵錯MBR
使用bochs的關鍵原因就是因為bochs有偵錯功能。 那就先來拿這個MBR來做一個簡單的實驗。
bochs -f bochsrc
啟動後,在linux環境上,就會停在那裡。
在 0x7c00 處設定斷點
pb 0x7c00
continue
設定完斷點就讓他繼續執行吧。
c
反組合 0x7c00 0x7c1e
這個例子太簡單,我們就簡單看一下0x7c00記憶體上的程式碼是不是我們寫入的程式碼。
可以看到,這個就是我們寫入boot.asm的程式碼。
檢視暫存器
再看一下現在cs段和rip:
sreg
r
確認了下一條指令是要執行 0x0000: 0x7c00地址。
相關文章