使用 Bochs 進行平臺仿真
Bochs 是較小的 GNU 公共許可證(GNU Public License,GPL)下獲得許可的一種 x86 PC 仿真器和調(diào)試器。該平臺提供對整個 PC 平臺的仿真,包括一個或多個處理器和各種不同的 PC 外圍設(shè)備,比如硬盤、顯示器、CD-ROM 驅(qū)動器以及其他常用外圍設(shè)備。您可以使用 Bochs 來運行針對 PC 平臺的操作系統(tǒng),它還是一個適用于操作系統(tǒng)開發(fā)的理想應(yīng)用程序(因為除了 Bochs 提供的調(diào)試功能外,在來賓機器內(nèi)可以隔離開發(fā)中操作系統(tǒng)的崩潰)。雖然 Bochs 通過仿真完成此操作,但是卻以性能為代價。
讓我們快速瀏覽并了解仿真和目前更常用的虛擬化方法之間的不同。
平臺仿真
Bochs 是一種平臺仿真器,這意味著它其實并不是現(xiàn)代意義上的虛擬化,而是模擬。在虛擬化中,虛擬機監(jiān)控程序和虛擬機(VM)在裸機硬件上執(zhí)行(通常通過硬件指令,虛擬機監(jiān)控程序創(chuàng)建環(huán)境在 VM 之間共享硬件)。因為通過主機處理器直接執(zhí)行指令,所以此過程通常被稱為直接執(zhí)行。此種類型的虛擬化使用來自現(xiàn)代處理器的支持(如 Intel Virtualization Technology for x86 [VT-x] 或 AMD virtualization [AMD-V])。仿真通常在 VM 和底層硬件和操作系統(tǒng)之間提供層以便創(chuàng)建如圖 1 中所示的預期的平臺環(huán)境的幻想。
圖 1. 虛擬化 vs.仿真
仿真還常常解釋來賓 VM 的指令(與虛擬化相比,此處來賓的指令集架構(gòu)必須與主機相同)。這就為仿真建立了有趣的優(yōu)勢,此處來賓 VM 平臺完全不同于主機(例如,在 IBM® PowerPC® 目標上運行 x86 來賓)。
仿真的另外一個有趣的優(yōu)勢就是對環(huán)境的完全控制,即更容易暫停整個機器來檢查其狀態(tài)以及將任何類型的故障引入仿真以測試操作系統(tǒng)的錯誤樹。雖然此功能以性能為代價,但是它才是此類環(huán)境的真正好處。此外,仿真器提供了來賓機器與主機的真正隔離。這樣,仿真器可以提供完全透明的環(huán)境。
仿真性能
在某些情況下仿真可用于性能架構(gòu)。一個示例就是 Transmeta 創(chuàng)建的代碼融合技術(shù)。Transmeta 的處理器是可以仿真 x86 代碼序列的超長指令字(Very Long Instruction Word,VLIW)超級標量架構(gòu)。它通過仿真或動態(tài)編譯代碼系列(類似于 QEMU 功能)來實現(xiàn)這一點。Transmeta 在 1995 年開啟了其大門,然后又在 2007 年底將其關(guān)閉。
其他示例包括 Java 技術(shù),它從 Java 字節(jié)碼到主機的底層架構(gòu)得到解譯。Java 技術(shù)實現(xiàn)了實時(just-in-time,JIT)編譯以便解決一些效率低下工作,類似于 Transmeta 和大量其他的仿真解決方案(包括 QEMU,它是另外一種類似于 Bochs 的平臺仿真解決方案)。但是 Bochs 也實現(xiàn)了高效仿真(在現(xiàn)代處理器上高達每秒鐘 1 億條指令 [MIPS]),同時還是便攜的。對于解譯的 x86 指令執(zhí)行和平臺仿真,Bochs 完全是用 C++ 語言開發(fā)的。#p#
Bochs 實現(xiàn)
現(xiàn)在,讓我們探究 Bochs 的內(nèi)部機理以便了解它如何在純 C++ 實現(xiàn)中實現(xiàn)有用的性能。本文專注于仿真的兩個方面:CPU(指令集架構(gòu) [ISA] 仿真)和設(shè)備。
CPU 仿真
Bochs 在其仿真方法方面很獨特。雖然其他解決方案提供了直接執(zhí)行或 JIT 編譯,但是 Bochs 實現(xiàn)了 CPU ISA 的純仿真(包括在對稱多處理配置中通過多達八個 CPU 支持 x86 和 x86-64 CPU 仿真)。Bochs 提供了真正 CPU 的仿真,甚至達到仿真 CPU 的提取-解碼-執(zhí)行流的水平。在流階段中,Bochs 執(zhí)行權(quán)限檢查,然后提取操作碼。在解碼階段,Bochs 將已提取的 x86 指令解碼為內(nèi)部表示。它還通過存儲原始 x86 系統(tǒng)的 “微操作” 來維護指令緩存(其后可在沒有解碼開銷的情況下提取),進而改進性能。最后,在執(zhí)行階段,Bochs 執(zhí)行一些圍繞特定指令執(zhí)行的操作(包括操作數(shù)的有效地址計算,然后針對特定指令執(zhí)行方法執(zhí)行間接調(diào)用)。在執(zhí)行指令時,可(適當?shù)?更新任何受影響的寄存器和標志。Bochs 在此處提供名為遲緩標志更新 的優(yōu)化以便僅在需要算術(shù)標志時才計算這些標志(而不是在每一步都進行更新)。
在提取-解碼-執(zhí)行流之外,Bochs 還管理著諸如設(shè)備中斷等外部事件和其他必要功能,如字節(jié)交換和其他特權(quán)檢查。除了通用 x86 CPU 以外,Bochs 實現(xiàn)了許多 CPU 功能,如使用 MMX™ 技術(shù)的 Intel Pentium® 處理器;Intel 的流式單指令,Multiple Data Extensions 2(Multiple Data Extensions 2,SSE2);以及 AMD 3DNow! 指令。
Bochs 的內(nèi)部指令緩存為傳統(tǒng) JIT 編譯進行了很好的權(quán)衡。雖然 JIT 編譯為加快執(zhí)行提供了一些優(yōu)勢,但是這是以巨大的內(nèi)存為代價進行的。
設(shè)備仿真
通過基于設(shè)備類型的設(shè)備仿真,Bochs 提供了對 PC 平臺的仿真。例如,雖然鍵盤是主機和來賓機之間共享的物理設(shè)備,但是磁盤是通過仿真共享的,在這里來賓磁盤是主機磁盤文件系統(tǒng)中的文件。
Bochs 提供了一系列有用的仿真硬件,包括內(nèi)存、NE2000 以太網(wǎng)卡、Cirrus Logic 顯卡(PCI 或 ISA)、Intel 440FX PCI 芯片組、BIOS、USB 根集線器、Sound Blaster 聲卡以及磁盤和軟盤控制器。如同 CPU,這些設(shè)備也被仿真,這在整個過程中會引入相當大的開銷。例如,在驅(qū)動程序與硬件進行通信時,它操縱寄存器以便請求一些所需的設(shè)備操作。在仿真平臺中,代表設(shè)備的寄存器和內(nèi)存將被仿真。在來賓操作系統(tǒng)的驅(qū)動程序窺探內(nèi)存和硬件寄存器時,軟件存在于下面來仿真設(shè)備(參見圖 2)。除了仿真界面以外,設(shè)備仿真必須執(zhí)行預期操作,這意味著會有設(shè)備的仿真,且在主機平臺中可能有與物理設(shè)備的通信(如物理網(wǎng)絡(luò)接口卡 [NIC] 或物理磁盤)。
圖 2. 通過仿真進行設(shè)備虛擬化
#p#
使用 Bochs
Bochs 及其實用程序很簡單,用于仿真各種不同的來賓操作系統(tǒng)。本示例演示了來自貝爾實驗室操作系統(tǒng)的 Plan 9 的仿真。
安裝 Bochs
首先,如果您的系統(tǒng)上沒有 Bochs,則必須先安裝 Bochs。對于我的 Ubuntu 系統(tǒng)來說,我使用了 apt 程序包管理器來安裝必要的程序包:
$ sudo apt-get install bochs $ sudo apt-get install bochs-x
此命令安裝 Bochs IA-32/64 PC 仿真器和 Bochs X-11 仿真器。
為 Plan 9 安裝做準備
要在 Bochs 上仿真 Plan 9,對于您的虛擬環(huán)境來說您需要另外兩個東西:包含 Plan 9 安裝映像的 CD-ROM 和作為安裝目標的虛擬硬盤(Virtual Hard Disk,VHD)。
首先,從貝爾實驗室站點獲得 Plan 9 映像,正如下面的命令行所示:
$ wget http://plan9.bell-labs.com/plan9/download/plan9.iso.bz2 $ bunzip2 plan9.iso.bz2
Plan9 映像是可以使用 ISO 9660 格式解譯的 ISO 格式文件(如同 CD-ROM 驅(qū)動器仿真,很快會講到)。
下一步是創(chuàng)建您的 VHD。請記住這將是主機操作系統(tǒng)中的一個文件。Bochs 提供特殊的實用程序來創(chuàng)建這個稱為 bximage 的文件。Bximage 實用程序是交互式的,允許您為如何創(chuàng)建并管理文件而指定一些選項。清單 1 提供會話來創(chuàng)建 VHD。在調(diào)用 bximage 之后,您可以指定您想創(chuàng)建硬盤映像(而不是軟盤映像)。雖然 Bochs 可以支持許多映像類型,但是對于性能來說,則要求平面映像,這是因為運行時動態(tài)增長是沒有必要的。對于 Plan 9 安裝來說,其操作系統(tǒng)需要大量的空間,因此根據(jù)硬盤文件的名稱(c.img)指定 700MB 的磁盤。
清單 1. 使用 bximage 為 Bochs 創(chuàng)建 VHD 映像
$ bximage ======================================================================== 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] What kind of image should I create? Please type flat, sparse or growing. [flat] Enter the hard disk size in megabytes, between 1 and 129023 [10] 400 I will create a 'flat' hard disk image with cyl=1422 heads=16 sectors per track=63 total sectors=1433376 total size=699.89 megabytes What should I name the image? [c.img] Writing: [] Done. I wrote 314302464 bytes to c.img. The following line should appear in your bochsrc: ata0-master: type=disk, path="c.img", mode=flat, cylinders=1422, heads=16, spt=63 $ ls -la c.img -rw-r--r-- 1 mtj mtj 733888512 2010-12-19 14:30 c.img $
#p#
安裝 Plan 9
有了 CD-ROM 映像和硬盤映像,下一步是創(chuàng)建您的 Bochs 配置文件。此文件定義了應(yīng)如何執(zhí)行 Bochs 仿真,同時指定在何處查找環(huán)境的關(guān)鍵方面(ISO 文件、硬盤映像等)。Bochsrc 配置文件如 清單 2 所示。此文件定義一個 x86 平臺,帶有 128MB 的 RAM 、鼠標、默認的擴展圖形陣列顯示器、硬盤(定義為 ata0-master,通過 bximage 創(chuàng)建)、CD-ROM(定義為 ata1-master,指向您已下載的 plan9.iso 文件)、用于 Bochs 輸出的日志文件 (bochsout.txt) 以及 CD-ROM 的默認根設(shè)備。
清單 2. Bochsrc 配置文件
# bochsrc # megs: 128 # mouse: enabled=1 # ata0-master: type=disk, path="c.img", mode=flat, cylinders=609, heads=16, spt=63 ata1-master: type=cdrom, path=./plan9.iso, status=inserted # log: bochsout.txt # boot: cdrom
Bochs 通過配置文件提供大量可表達的選項。這些選項可定義在平臺上可用的選項或表達的選項類型(例如,諸如 SSE 或高級加密標準擴展等的單個 CPU 配置)。
要開始將 Plan 9 安裝到 Bochs,在與您的磁盤映像、ISO 映像和 bochsrc 文件相同的目錄中通過 -q 選項(以便跳過啟動菜單)啟動 Bochs:
$ bochs -q
此命令創(chuàng)建表示仿真平臺的新窗口,如圖 3 所示。如圖所示,仿真器已經(jīng)確認了您的磁盤和 CD-ROM 并已經(jīng)啟動了 CD 來開始安裝 Plan 9 操作系統(tǒng)。
圖 3. 啟動 Bochs(Plan 9 操作系統(tǒng)的安裝)
隨著安裝的繼續(xù)進行,Plan 9 經(jīng)過了各種不同的配置和安裝步驟。圖 4 顯示了磁盤設(shè)置(分區(qū))。
圖 4. 安裝 Plan 9 操作系統(tǒng)
這些示例中使用的視窗系統(tǒng)是 Plan 9 的 rio。Rio 是一種具有一些獨特屬性的有趣視窗系統(tǒng)。例如,在 rio 中的窗口是其自身的私有命名空間并將文件系統(tǒng)界面導出到在操作系統(tǒng)中運行的應(yīng)用程序(允許 rio 在 rio 窗口內(nèi)運行)。Rio 早于 UNIX® 的 X 視窗系統(tǒng)并為隨后的視窗系統(tǒng)提供了技術(shù)基礎(chǔ)。
在漫長的安裝完成時,仿真計算機停止且更新 bochsrc 文件以便從磁盤啟動(boot: disk)。請注意窗口的頂部(參見圖 5)是顯示了處于活動狀態(tài)的元素(CD-ROM、鼠標)的 Bochs 控制,在右側(cè)是一組控件(用于重置、暫?;蜿P(guān)閉仿真計算機)。
圖 5. 在 Bochs 上下文中運行的 Plan 9
運行其他操作系統(tǒng)
仿真的樂趣之一就是能夠以快速而簡單的方式方便地運行其他操作系統(tǒng)。您可以在 Bochs 站點上(參見 參考資料)查找磁盤映像列表,嘗試一些其他的操作系統(tǒng),如 FreeDOS、DLX Linux®(10MB Linux 圖像)、OpenBSD、GNU/Hurd 以及 KNOPPIX。圖 6 顯示了在 Bochs 上啟動的 FreeDOS 內(nèi)核。
圖 6. 在 Bochs 上運行 FreeDOS
FreeDOS 是在 Microsoft 宣稱其不再生產(chǎn) MS-DOS 后創(chuàng)建的項目,并被許多公司在 GPL 下使用。#p#
其他仿真平臺
雖然 Bochs 對于平臺仿真來說是有用的應(yīng)用程序,但是其他解決方案也提供了相似的功能。QEMU 是最流行的仿真器之一,因為它不僅提供與 PC 兼容的平臺仿真而且還提供各種不同的其他處理器架構(gòu)(ARM、PowerPC 等)。
其他專業(yè)平臺包括 SPIM(一個 MIPS 處理器仿真器)和計算機歷史仿真項目,該項目提供許多具有歷史意義的計算系統(tǒng)(Altair、VAX 11/780、IBM 1130 等)的平臺仿真。
前景展望
雖然 Bochs 是用于執(zhí)行舊版操作系統(tǒng)的強大的平臺仿真器,它也是一個用于開發(fā)操作系統(tǒng)的理想平臺。Bochs 提供在原始硬件(包括全功能圖形調(diào)試器)中不易提供的高效平臺仿真和調(diào)試功能。雖然沒有什么可以取代軟件測試的真實硬件,但是 Bochs 可以提供在各種不同的 x86 和非 x86 主機中便于訪問的有用開發(fā)環(huán)境。
【編輯推薦】