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