bochs安裝以及使用

最近在看一個操作系統的實現,想在linux上安裝一個bochs,不過這個開源的東西真不好用,尤其咱又是linux菜鳥,今天終於有所突破了,好高興,所以記錄下來。

 1.首先去bochs的官網
http://bochs.sourceforge.net/
下載最新的程序,我直接下的是bochs-2.4.tar.gz 或者2.5的版本。
tar zxvf bochs-2.4.tar.gz
./configure
如果要調試功能的話,可查看configure文件做相應調整
--enable-debugger                 compile in support for Bochs internal debugger
--enable-disasm                   compile in support for disassembler
--enable-debugger-gui             compile in support for Bochs internal debugger GUI  這個選項是必須有的,否則編譯的時候報錯找不到pthread

--with-sdl                        use SDL libraries
網上說要加最後一個暫時沒有明白其意。
make

sudo make install 安裝到默認的目錄

BOCHS運行需要bochsrc文件l. 可查看這些文件。

# how much memory the emulated machine will have
megs: 32
# filename of ROM images
romimage:file=$BXSHARE/BIOS-bochs-latest
#注意上面這一行,2.3.5以後的後面不能加,address=0xf0000  否則會出現
#Message: ROM: System BIOS must end at 0xfffff 錯誤的  這個後面會解釋
#romimage: file=mybios.bin, address=0xfff80000 # 512k at memory top
vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest

# what disk images will be used
floppya: 1_44=hello.img, status=inserted
#ata0-master: type=disk, mode=flat, path="30M.sample"
# hard disk
#ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
#ata1: enabled=1, ioaddr1=0x170, ioaddr2=0x370, irq=15
#ata2: enabled=0, ioaddr1=0x1e8, ioaddr2=0x3e0, irq=11
#ata3: enabled=0, ioaddr1=0x168, ioaddr2=0x360, irq=9
boot: floppy
#boot: disk
megs: 32 是說內存是32M
floppya: 1_44=a.img, status=inserted 指定了軟盤映像文件
boot: floppy 從軟盤啓動。
http://bochs.sourceforge.net/下載nasm
我下的是nasm-2.08.tar.gz
tar zxvf nasm-2.05.01.tar.gz
cd nasm-2.05.01
./configure
==============================================================
bximage
Disk Image Creation Tool for Bochs
$Id: bximage.c,v 1.34 2009/04/14 09:45:22 sshwarts Exp $
========================================================================

Do you want to create a floppy disk image or a hard disk image?
Please type hd or fd. [hd] fd

Choose the size of floppy disk image to create, in megabytes.
Please type 0.16, 0.18, 0.32, 0.36, 0.72, 1.2, 1.44, 1.68, 1.72, or 2.88.
[1.44]
I will create a floppy image with
cyl=80
heads=2
sectors per track=18
total sectors=2880
total bytes=1474560

What should I name the image?
[a.img] hello.img

Writing: [] Done.

I wrote 1474560 bytes to hello.img.

The following line should appear in your bochsrc:
floppya: image="hello.img", status=inserted
把bin寫入img中
dd if=/nasm-2.05.01/helloworld/hello.bin of=hello.img bs=512 count=1 conv=notrunc
讀入了 0+1 個塊
輸出了 0+1 個塊
bochs -q -f .bochsrc 運行我們的OS
出現如下錯誤
Bochs is exiting with the following message:
[BIOS ] No bootable device.
查看生成的hello.bin大小
ls -al hello.bin
-rw-r--r--    1 root     900            22  5月 20 11:45 hello.bin
大小爲22byte
我們要把它們弄成512byte的
在hello.asm最後添加
times 510-($-$$) db 0 ; 填充剩下的空間,使生成的二進制代碼恰好爲512字節
dw        0xaa55      ;這個是結束標誌符
再用nasm編譯生成hello.bin
再寫入到hello.img便可以了。
然後執行
bochs -q -f .bochsrc
便可以看到紅色的H字樣了
ps:
若出現Message: ROM: System BIOS must end at 0xfffff 錯誤的原因如下:
In previous versions of Bochs the BIOS size was 64k and you always had to
specify the start address at 0xf0000. Starting with release 2.2.5 Bochs
supports BIOS images up to 512k and it's no longer necessary to specify the
start address if the BIOS ends at memory top
就是不要再指定address了。
當然要顯示Hello world可用以下這個
org 07c00h
mov        ax, cs;數據傳送指令,將代碼段寄存器cs的內容賦給通用寄存器ax
mov        ds, ax;使數據段與代碼段在同一個段
mov        es, ax;使附加段與代碼段在同一個段
call        DispStr
jmp        $ ;$表示當前地址,無限循環
DispStr:
mov        ax, BootMessage
mov        bp, ax ;es:bp=串地址
mov        cx, 15 ;串長度
mov        ax, 01301h  ;ah=13h, al=01h 視頻中斷13h號功能:寫字符串;AL=01H,表示寫完字符串後,更新光標位置
mov        bx, 000ch   ;頁號爲0(bh=0) 黑底紅字(bl=0ch,高亮)
mov        dl, 0 ;DH、DL=寫串的光標位置,DH=行號,DL=列號
int        10h
ret
BootMessage:        db "Hello,World OS!"
times 510-($-$$) db 0 ; 填充剩下的空間,使生成的二進制代碼恰好爲512字節
dw        0xaa55
times 510-($-$$) db 0
This reads: Times 510-(Start of this Instruction - Start of program) with 0's
$ stands for start of the instruction
$$ stands for start of the program
dw 0xAA55
For some reason the signature has to be written this way round!
This fills the last to bytes of the boot loader with 55AA (this is a hex number)
Without this signature the BIOS won't recognise this as a bootable disk!
2.調試
Bochs是開發操作系統的極品模擬器的另外一個原因是它帶有調試功能。這也是本文的另一個需要重點講解的地方。Bochsdbg這個程序是調試模式。在調試模式中,我不會象前面的那樣直接雙擊配置文件就進入調試模式的法子。我用的是笨法子。在Bochs目錄裏面把配置文件配好,注意,關於光驅,軟驅,硬盤的路徑一定要指定正確。然後雙擊Bochsdbg.exe, 進入圖2顯示界面

選擇2後,選擇配置文件的路徑和配置文件的文件名,然後選擇5就開始運行了。事實上,由於Bochs2.1.1默認的配置文件名是bochsrc.txt,在Bochs目錄中,如果你的配置文件的文件名就是這,直接運行Bochsdbg就出現上面的畫面,再直接回車就可以了。當然,此種方法也可以運行Bochs,不是調試模式的。
當然,你也可以學dlxlinux的方法,把run.bat文件種的bochs改成bochsdbg就可以。方法類似。
下面則進入如何調試了。敲入help,可以列出各個命令的用法。下面主要調試命令的用法。
下面分類進行討論。
控制執行類:
c                           繼續執行
stepi [count]                  執行count條指令,默認count爲1
step [count]                 執行count條指令,默認count爲1
s     [count]               執行count條指令,默認count爲1
Ctrl-C                      停止執行, 並返回命令行
quit                        退出調試
q                           退出調試

斷點類:
       注意:這裏面的’seg’和’addr’所用的數的格式和c語言中的一致,例如
              十六進制:0xcdef0123
              八進制  :01234567
              十進制  :12345678

vbreak seg:off              設置指令的虛擬地址的斷點位置。
vb    seg:off

lbreak addr                 設置指令的線性地址的斷點位置。
lb    addr

pbreak addr             設置指令的物理地址的斷點位置。
pb      addr            (’*’這個選項是爲GDB兼容設置的)
break addr
b       addr

info break                  顯示現在所有的斷點的狀態
delete n                    刪除第n個斷點
del   n                    同上
d    n                     同上

操作內存類:
x /nuf addr     查看線性地址的內存
xp /nuf addr      查看物理地址的內存
     n              顯示多少個字節的內存
     u              單位長度; one o單位f
                      b 字節
                      h 半字(2 字節)
                      w 字 (4 字節)
                      g 雙字 (8 字節)
                        注意:這些並不是Intel中的術語,但是它們和GDB的是一致的。
       F                                 打印格式:
                                          x   打印十六進制
                                          d   打印十進制
                                          u   打印無符號十進制
                                          o   打印八進制
                                          t      打印二進制
n, f, 和u都是可選參數。U和f默認的是你最後一次用的值,如果沒有用過的話,就是w(word)和x(hex)。N默認的是1。addr也是可選參數。如果你沒有知道他的話,它將是下一條地址。

setpmem addr datasize val     設置物理內存某地址的內容。Addr是內存地址,datasize地址長度,val所想設置的值。
crc addr1 addr2           顯示物理內存addr1到addr2之間的CRC

Info 命令
info program      程序的執行狀態
info registers      顯示寄存器內容
info break        顯示斷點狀態

操作CPU寄存器set $reg = val    改變CPU寄存器的值爲val。寄存器可以爲eax,ecx,edx,ebx,esp,ebp,esi,edi。                  不能爲eflages,cs,ss,ds,es,fs,gs。info registers    見Info部分dump_cpu          顯示完整的CPU信息。set_cpu           設置CPU的狀態        “dump_cpu”和“set_cpu”的格式:    "eax:0x%x/n"    "ebx:0x%x/n"    "ecx:0x%x/n"    "edx:0x%x/n"    "ebp:0x%x/n"    "esi:0x%x/n"    "edi:0x%x/n"    "esp:0x%x/n"    "eflags:0x%x/n"    "eip:0x%x/n"    "cs:s=0x%x, dl=0x%x, dh=0x%x, valid=%u/n"    "ss:s=0x%x, dl=0x%x, dh=0x%x, valid=%u/n"    "ds:s=0x%x, dl=0x%x, dh=0x%x, valid=%u/n"    "es:s=0x%x, dl=0x%x, dh=0x%x, valid=%u/n"    "fs:s=0x%x, dl=0x%x, dh=0x%x, valid=%u/n"    "gs:s=0x%x, dl=0x%x, dh=0x%x, valid=%u/n"    "ldtr:s=0x%x, dl=0x%x, dh=0x%x, valid=%u/n"    "tr:s=0x%x, dl=0x%x, dh=0x%x, valid=%u/n"    "gdtr:base=0x%x, limit=0x%x/n"    "idtr:base=0x%x, limit=0x%x/n"    "dr0:0x%x/n"    "dr1:0x%x/n"    "dr2:0x%x/n"    "dr3:0x%x/n"    "dr4:0x%x/n"    "dr5:0x%x/n"    "dr6:0x%x/n"    "dr7:0x%x/n"    "tr3:0x%x/n"    "tr4:0x%x/n"    "tr5:0x%x/n"    "tr6:0x%x/n"    "tr7:0x%x/n"    "cr0:0x%x/n"    "cr1:0x%x/n"    "cr2:0x%x/n"    "cr3:0x%x/n"    "cr4:0x%x/n"    "inhibit_int:%u/n"    "done/n"

反彙編命令:disassemble start end 反彙編的地址範圍
set $disassemble_size = n 告訴調試器,反彙編段的屬性(16位或32位,默認32位)。

相信到這裏,大家也基本會用BOCHS這個模擬器了。本文的重點主要在前面的Bochs的使用方面。後面的調試部分,僅僅列個表,大家用的時候,參考下每個命令的用法,也就差不多會調試了。關於更具體的,大家可以參考bochs的文檔,裏面有更詳細的介紹。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章