bximage bochsbios vgabios bochs bochs-x
建議套件
bochs-sdl bochs-wx libwxgtk2.4 bochs-doc
簡介
一般而言,一講到 PC 模擬器,大家第一個想到的大概就是 VMWare,或是 Virtual PC 吧?
但還有另一個 Open Source 的專案,Bochs,也可以做到類似的功能哦∼
Bochs(發音為 Box)是一個「純粹」的 Software Emulator,所以它可以在很多平台上執行;
也可以成功模擬大部份的 x86 作業系統,
但因為它完全是使用軟體來模擬硬體的,因此它的執行效率就真的不是很好了。
而相較於 VMware 及 Virtual PC,
VMware 和 Virtual PC 則是為了加快模擬器的速度,採用了極多的硬體加速技術。
所以它的模擬效率一級棒,但是只限於在 x86 平台上執行。
其中的 Virtual PC 更侷限於僅能在 MS Widows 的環境下執行。
另外還有一個採用了類似 VMware 的硬體加速技術的Open Source 專案,Plex86。
不過,Plex86 的程式碼己被 Bochs 所採納,所以它的地位已完全被 Bochs 所取代了。
至少,在 Debian 裡已經完全沒有 Plex86 的影子了:
(以下為 Debian 裡的 Plex86 套件之說明)
- 代碼: 選擇全部
The functionality of Plex86 in debian has been superceeded by the Bochs package.
This is a dummy package that depends on bochs to facilitate upgrade,
and can be safely removed.
事前準備
為了要能夠順利執行 Bochs,我們必須先準備它的硬體設備 - 其中最重要、也最難搞定的就是硬碟;
和 VMware 類似的,在 Bochs 裡,是利用 Image File 來模擬硬碟的;
也就是 Bochs 是將一個大大的檔案模擬成一顆硬碟。
我們可以利用 bximage 這個套件所提供的 bximage 工具程式來製作這些 Image File,例:
(請注意它所顯示的 bashrc 之相關設定資訊)
製作一個 Floppy Image File
- 代碼: 選擇全部
========================================================================
bximage
Disk Image Creation Tool for Bochs
$Id: bximage.c,v 1.19 2003/08/01 01:20:00 cbothamy 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.36, 0.72, 1.2, 1.44, or 2.88. [1.44] 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] Boot.img
Writing: [] Done.
I wrote 1474560 bytes to Boot.img.
The following line should appear in your bochsrc:
floppya: 1_44="Boot.img", status=inserted
製作一個 Hard Disk Image File
在這裡是指定 growing 這種格式。這種格式的 Image File 可以有效節省硬碟空間。
- 代碼: 選擇全部
========================================================================
bximage
Disk Image Creation Tool for Bochs
$Id: bximage.c,v 1.19 2003/08/01 01:20:00 cbothamy Exp $
========================================================================
Do you want to create a floppy disk image or a hard disk image?
Please type hd or fd. [hd] hd
What kind of image should I create?
Please type flat, sparse or growing. [flat] growing
Enter the hard disk size in megabytes, between 1 and 32255
[10] 1969
I will create a 'growing' hard disk image with
cyl=4000
heads=16
sectors per track=63
total sectors=4032000
total size=1968.75 megabytes
What should I name the image?
[c.img] Native.img
Writing: [] Done.
I wrote 2064384000 bytes to Native.img.
The following line should appear in your bochsrc:
ata0-master: type=disk, path="Native.img", mode=growing, cylinders=4000, heads=16, spt=63
BIOS
另外,還有開機時所要用到的 BIOS。
這些 BIOS 已包含於 bochsbios 這個套件中,
在安裝了 bochsbios 套件後,這些 BIOS 將會出現在 /usr/share/bochs/ 裡。
其中建議使用的 BIOS 為 BIOS-bochs-latest。
顯示卡 BIOS
而顯示卡也有其專用之 BIOS。
這個 BIOS 已包含於 vgabios 這個套件中,
在安裝了 vgabios 套件後,這些 BIOS 將會出現在 /usr/share/vgabios/ 裡。
其中建議使用使用的 BIOS 為 vgabios.bin。
硬體設備的準備工作就到此為止了。
設定 Bochs
當第一次執行 Bochs 時,它會啟動一個預設的文字設定介面。其實真的有蠻多需要設定的:
記憶體
在此是將其設定為 64 MB。
- 代碼: 選擇全部
Enter memory size (MB): [4] 64
操作介面
Bochs 只有提供了 wxWidgets based 的 GUI 設定介面,
其它則全使用文字介面的設定程式,textconfig,
也就是您現在看到的這個文字介面的設定程式。
- 代碼: 選擇全部
Choose which configuration interface to use: [textconfig]
顯示介面所使用的模組
如果使用 wxWidgets based 的 GUI 設定介面,則在此也要指定使用 wx。
還可以指定 x、sdl 等等。其中建議採用 x 這個模組,其顯示的效能似乎是最好的。
- 代碼: 選擇全部
Choose which library to use for the Bochs display: [x]
滑鼠
滑鼠預設上是關閉的。
如果啟用之後,滑鼠的操控權會全部被 bochs 給拿去,
這時可以按下 <滑鼠中鍵> 來啟用/釋放滑鼠。
- 代碼: 選擇全部
Enable the mouse? [no] yes
軟碟
使用我們剛才所製作出來的 Boot.img,
當然也可以將其指定為實體裝置:
- 代碼: 選擇全部
-------------
Floppy Disk 0
-------------
Enter new filename, or 'none' for no disk: [none] Boot.img
What type of floppy disk? [none] 1.44M
Is the floppy inserted or ejected? [inserted]
硬碟
使用我們剛才所製作出來的 Native.img。
注意它的 mode、cylinders、heads、sectors per track 等等一定要按照 bximage 所產生的報告來填寫:
- 代碼: 選擇全部
------------------------
First HD/CD on channel 0
------------------------
Device is enabled: [no] yes
Enter type of ATA device, disk or cdrom: [disk]
Enter new filename: [] Native.img
Enter mode of ATA device, (flat, concat, etc.): [flat] growing
Enter number of cylinders: [0] 4000
Enter number of heads: [0] 16
Enter number of sectors per track: [0] 63
Enter new model name: [Generic 1234]
Enter bios detection type: [auto]
Enter translation type: [auto]
光碟機
和硬碟類似;在這裡可以指定為實體裝置,或是 ISO 檔案。
- 代碼: 選擇全部
-------------------------
Second HD/CD on channel 1
-------------------------
Device is enabled: [no] yes
Enter type of ATA device, disk or cdrom: [disk] cdrom
Enter new filename: [] /dev/cdrom
Is the device inserted or ejected? [inserted]
Enter new model name: [Generic 1234]
Enter bios detection type: [auto]
IDE 介面
在 Bochs 裡是模擬出了 4 個 IDE 介面,
每一個介面可以接 Master、Slave 等兩個裝置。
如果您要把 HDD、CDROM 設定至第二、第三或第四個 IDE 介面上,
記得要先啟動這些 IDE 介面才能把這些裝置掛上去。
而那些 IRQ 等參數採用預設值即可。
- 代碼: 選擇全部
-------------
ATA channel 1
-------------
Channel is enabled: [no] yes
Enter new ioaddr1: [0x170]
Enter new ioaddr2: [0x370]
Enter new IRQ: [15]
設定啟動裝置
在這裡是設定為 CDROM。
可以設定的值為 floppy、disk 及 cdrom。
- 代碼: 選擇全部
Boot from floppy drive, hard drive or cdrom ? [floppy] cdrom
設定音效卡
在 Bochs 裡是將其模擬為 SoundBlaster 16 ISA 音效卡。
- 代碼: 選擇全部
Enable SB16 emulation? [no] yes
# 設定聲音傳送模式。
# 請設定為 1 或 3,
# 1 為直接傳送至系統之聲音裝置,
# 3 為直接傳送至所指定的輸出。
Wave mode: 0
Enter new value: [0] 1
# 指定所輸出的檔案或裝置。
Wave file:
Enter a new value, or press return for no change.
/dev/dsp
# 以每秒 1,000,000 次為基準,設定每秒要呼叫幾次 DMA。建議值 750,000。
DMA timer: 0
Enter new value: [0] 750000
但它聲音模擬得似乎並不是很好,
且在驅動時也要小心不要和其它的週別發生硬體衝突。
筆者在 bochs 裡是沒有啟動音效卡的。
設定網路卡
若想在 Bochs 裡啟動網路卡有兩種方式。
採用 linux 模組,並指定裝置為 eth0:
第一個方法是採用 linux 模組,並指定裝置為 eth0:
- 代碼: 選擇全部
Enable NE2K NIC emulation: yes
------------------
NE2K Configuration
------------------
Ethernet module = Ethernet module: null
Enter new value: [null] linux
Ethernet device: xl0
Enter a new value, or press return for no change.
eth0
使用這個方法有數個優點。
由於它是透過本機實體的網路介面來傳送封包的,
所以它可以存取到網路上的 DHCP Server,
使用方法也和本機機器無異,
設定上也單純許多。
但這個方式在某些機器上,
Bochs Box 是能夠透過這個網路介面和外部網路連線,
但卻無法和本機機器連線...
此時,只好考慮使用 tuntap 來替代 Linux 模組。(詳下文)
請注意到,若在 Bochs 裡使用這個方法來設定網路卡,
必須還要以 root 之權限執行 Bochs,才能啟用網路介面。
否則,會有權限不足之錯誤訊息產生。
採用 tuntap 模組,並透過一個名為 tun 的網路裝置對外連線:
如果採用 linux 模組卻無法使用,
或是有其它問題,如:可以和外部主機連線,卻無法和本機連線...
則可以試試另一個方法,採用 tuntap 模組,並透過一個名為 tun 的網路裝置對外連線:
- 代碼: 選擇全部
Enable NE2K NIC emulation? [no] yes
# 在 Bochs 的手冊裡規定了在此一定要設定為 fe:fd:00:00:00:01,否則無法正常運作。
MAC Address: fe:fd:de:ad:be:ef
Enter a new value, or press return for no change.
fe:fd:00:00:00:01
Ethernet module = Ethernet module: null
Enter new value: [null] tuntap
Ethernet device: xl0
Enter a new value, or press return for no change.
tun
# Bochs 可以在此設定一個小小的 Script 來設定 tun。
Device configuration script: none
Enter a new value, or press return for no change.
tunconfig
設定完畢後,請進入 /dev 目錄中,執行 MAKEDEV tun 來建立 tun 之裝置檔。
並建立一個 tunconfig 檔案如下:
(請將 192.168.1.254 替換成一個空的 IP 位址。這個位址將由 tun 介面所使用。)
(請將 192.168.1.101 替換成一個空的 IP 位址。這個位址將由 Bochs 裡運行的作業系統使用。)
- 代碼: 選擇全部
#!/bin/bash
/sbin/ifconfig ${1##/*/} 192.168.1.254
route add -host 192.168.1.101 dev tun
這樣子在 bochs 啟動時,就會將 tun 裝置設定為 192.168.1.254 了。
而在 bochs box 裡的作業系統,
則必須使用固定 IP,如:192.168.1.101,
並將 Gateway 設定為上面所設定的 192.168.1.254,才能和外界溝通。
設定完了 tun 介面後,以 sudo 來執行 bochs,就可以正常啟動 Bochs 的網路介面了。
當然囉,由於新增了一個 tun 介面,
像是 iptables 等等設定也要一起而有所變更了。
而如何設定 iptables 就超過了本篇的範圍之外,
在此就略過不加討論了。
這個使用 tuntap 來替代 Linux 模組的方法有些缺點,
如:設定較為繁複、必須使用固定 IP 等等。
但它是在 Linux 模組無法使用時的一個替代方案。
在 Bochs 裡啟動網路卡
而在 Bochs 裡,是將這張網路卡模擬為 NE 2000 的 Non-Plug-And-Play ISA 網路卡。
若想在 GNU/Linux 裡驅動這張 NE 2000,請載入 ne 這個模組。
而在 MS Windows 95 裡,則是要載入 Novell/Anthem 的 NE2000 Compatile 網路卡。
因為它是 Non-Plug-And-Play ISA 網路卡,
所以在安裝作業系統的過程中,
必須在載入驅動程式時指定其 IRQ 及其 IO Address 才能正確啟動 Bochs 的網路卡。
以 Debian Woody 為例:
以 sudo 來執行 Bochs
注意:
以 root 或是 SUID 或 sudo 來執行任何程式都是大風險,
尤其是使用者可以自行設定 bochs 呼叫某一個 Script 來設定網路,
若 bochs 以 SUID/sudo 來執行的話,將可能引起極嚴重之安全問題。
所以若您知道如何可以避開這個限制,請不吝指教!謝謝!
設定 Bochs 以 sudo 來執行的方法:
* 安裝 sudo 套件。
* 以 visudo 來建立 sudo 的設定檔,並設定不用輸入密碼即可執行 Bochs:
(其中的 UserName 和 HostName 請替換成您的系統設定,或設定為 ALL。)
- 代碼: 選擇全部
Cmnd_Alias BOCHS=/usr/bin/bochs
UserName HostName=NOPASSWD: BOCHS
* 編輯 .bashrc,讓 bochs 能預設以 sudo bochs 來執行:
- 代碼: 選擇全部
alias bochs='sudo bochs'
* 執行 bochs,並以 ps aux | grep bochs 來確認 bochs 是否以 root 的身份執行?
設定系統時鐘
(在這裡是將它設定為和系統時鐘同步)
- 代碼: 選擇全部
----------------
Clock parameters
----------------
Enter Synchronisation method: [none] realtime
Enter Initial CMOS time (1:localtime, 2:utc, other:time in seconds): [1]
Bochs 的設定檔
將這些硬體設備設定完成之後,請以 .bochsrc 或 bochsrc 為檔案名稱,
將設定儲存至該目錄下,
那麼下次執行 Bochs 時就會直接以這個設定檔啟動了。
而在 bochs 可以正常執行後,
就可以用 wxWidgets 的 GUI 介面來設定這個設定檔了。
當然囉,使用 vim 來編輯設定檔也是又快又好的方式之一。
Bochs 的使用方式
嗯... Bochs 在執行時就像是一台完全獨立的電腦,唯獨它是「寄生」在您的系統上而已;
在使用上就和操作一台電腦是一模一樣的,所以應該不用再加以說明了...
執行畫面
Debian Woody:
Debian Sarge:
X Window:
Microsoft Windows 95:
目前所遭遇到的困擾
* 可以驅動音效卡,但音質實在太差,可以說只是嗄嗄嗄的雜音。
* 找不到可以在 Bochs 裡使用,For MS Windows 95/98/ME 的 VBE VESA Driver。
* MS Windows 95 在執行時之 CPU Loading 永遠在 100%。
* 在 Linux Kernel 2.6.x 下執行時之 CPU Loading 永遠在 100%。所以建議在 Kernel 2.4.x 下執行 Bochs。
* Debian GNU/Linux Sarge 無法正常關機。但是 Woody 卻又沒有任何問題...
心得
Bochs 在模擬速度並不快,
它只是在模擬 Intel Pentium 75 的機器,
但實際上是否真有到達這個速度還在未定之天。
而在模擬其它週邊上面似乎仍有些問題,所以目前只能說是堪用而已。
但它所佔用的 CPU Loading 又實在太高,如果在一台機器上開兩個 Bochs 會蠻吃力的。
希望 Bochs 有朝一日能取代 VMware 地位,但目前看來是還有一段長遠的路要走呢!
替代方案
GNU/Linux
如果想在 Linux 上再模擬出另一台實驗用的 Linux 機器,
除了 Bochs 之外,您還可以考慮 chroot、Linux User Mode、Xen 等等方式。
DOS
如果是想在 Linux 上執行 DOS 的程式,
可以考慮使用 Dosbox、Dodge。
Win32 程式
如果是想在 Linux 上執行 Win32 的程式,
那麼可以考慮使用 Wine、WineX 或是 Win4Lin。
MS Windows
如果想在 Linux 上再模擬出另一台實驗用的 MS Windows 機器,
在 Free Software 裡也唯有 Bochs 了。
參考資訊
the Bochs IA-32 Emulator Project
Bochs User Manual
Bochs VBE Display Drivers for Windows NT/2000
本文也會同時放至 Debian Wiki 裡。
在 Debian 裡的那一篇排版上比較有條理哦∼
請大家多多支持 Debian Wiki!
順便慶祝一下個人的灌水第 2000 篇。