跨平台虛擬機 - QEMU

簡介

QEMU 是一個執行速度相當快的虛擬機,原因是 QEMU 採用了動態轉譯的技術,這讓 QEMU 比同為開放原始碼的 Bochs 快上許多,其速度與 VMWare、Virtual PC、Virtual Box 等軟體相差不多。

QEMU 的最大好處是支援各種處理器平台,像是 x86、ARM、MIPS、Power PC 等,因此經常被嵌入式系統的開發者用來做雛形測試。

QEMU 的官方網站為 http://wiki.qemu.org,但是當您進入該網站想下載 QEMU 時會感到相當困擾,因為下載頁 Download 當中只有原始碼,這點相當令人困惑。

還好,您只要點選 Links 連結,連到 http://wiki.qemu.org/Links 當中,您就可以看到 QEMU on windows 等網頁,這些網頁中有 MS. Windows 版的 QEMU 可以下載,這是因為 QEMU 的開發者只注意 Linux 上的開發,MS. Windows 版本是由其他人 porting 上去的,QEMU 0.9.1 以後的版本是由 TAKEDA Toshiya 所 porting 的,您可以連到 http://homepage3.nifty.com/takeda-toshiya/qemu/index.html 網址中取得這個版本。(經筆者下載,發現這個版本壓縮檔無法解開,不知是何問題?)

還好,http://lassauge.free.fr/qemu/ 也有提供 QEMU ON WINDOWS 的版本,您可以使用該版本的程式在 MS. Windows 下執行。

如果您用的是 Ubuntu Linux 作業系統,那麼安裝 QEMU 將會很方便,您可以參考下列網址進行安裝。

http://wiki.ubuntu-tw.org/index.php?title=Howto_Install_QEMU_With_Accelerator

設計原理

QEMU 是一種相當快速的虛擬機,比起使用 bytecode 解譯的方式要快上許多,這是怎麼做到的呢?

QEMU 的設計原理乃是將目的檔中的機器碼反組譯成 C 語言指令,然後再利用 gcc 將這個 C 語言程式編譯為機器語言,然後直接在目標平台上執行,因此不需要撰寫目的檔的解譯程式,這是一種設計虛擬機的獨特技巧,請參考下列文章。

http://usenix.com/events/usenix05/tech/freenix/full_papers/bellard/bellard.pdf

但是,即使讀完了這篇文章,我仍然無法完全理解其中的設計原理,如何將機器碼反組譯成 C 語言呢?有一天,當我被問到這個問題,重新仔細思考之後,似乎一切都豁然開朗了。

假如我們用 CPU0 的指令為例,如果有一個 CPU0 組合語言如下所示。

    LD    R1, [300]
    LDI    R2, 100
    CMP    R1, 0
    JEQ    END
    ADD    R3, R1, R2
    ST    R3, [200]
END :     RET

那麼,我們可以將其反向轉譯為如下的 C 語言程式。

    R1 = K300;
    R2 = 100;
    if (R1 == 0)
      goto END;
    R3 = R1 + R2;
    R3 = K200;
END :     return

R1:    RESW 1
R2:    RESW 1
K200:     RESW 1
K300:     RESW 1

如此,編譯後的 C 語言的程式,其行為就會和 CPU0 程式的行為一致,如此就完成了整個虛擬機器的設計,而且不需要使用解譯的方式,而是使用編譯的方式完成了虛擬機器的設計,這種模式會比解譯的方式快上許多。

在這種架構下,所有的暫存器存取都會被翻譯成記憶體的存取,這樣雖然會讓編譯後的存取速度較為緩慢一些,但是由於編譯器本身又會安排目標機器的暫存器的使用方式,因此又會再度增快速度。

這種方式真是一種相當聰明且簡單的設計方式啊!

參考文獻

  1. 官方網站:QEMU wiki
  2. QEMU - 維基百科
  3. QEMU ON WINDOWS
  4. degian wiki QEMU
  5. Qemu Manager Download (下載點)
  6. 如何用 Qemu Manager 在 Windows 之下安裝 Ubuntu?
  7. 圖形化操作介面的Qemu Manager on windows
  8. Linux虛擬機器-QEMU初體驗- 軟體使用- 愛做夢的蘆薈
  9. qemu 筆記
  10. 使用QEMU 进行跨平台开发
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License