首頁 > 軟體

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地址。


IT145.com E-mail:sddin#qq.com