1. 程式人生 > >QEMU原始碼剖析(一)

QEMU原始碼剖析(一)

1 qemu概述

    qemu是一種快速的多體系結構模擬器,通過動態翻譯的技術達到了優異的模擬速度。目前,qemu支援兩種操作模式:

  • 全系統模擬模式。在這種模式下,qemu完整的模擬目標平臺,此時,qemu就相當於一臺完整的pc機,例如包括一個或多個處理器以及各種外圍裝置。這種模式可以用來執行不同的作業系統或除錯作業系統的程式碼。
  • 使用者態模擬模式。在這種模式下,qemu能夠執行不同於主機平臺的其他平臺的程式(比如,在x86平臺上執行為arm平臺編譯的程式),其中典型的代表wine windows API emulator。另外,在這種模式下能夠進行方便的交叉編譯和除錯。

    對於全系統模擬模式,qemu目前可以支援的硬體列表如下:

  • x86 or x86_64 體系結構處理器
  • ISA PC (沒有PCI匯流排的PC)
  • PowerPC 處理器
  • 32/64bit的SPARC 處理器
  • 32/64bit的MIPS處理器
  • ARM體系結構的處理器
  • PXA 270、PXA 255
  • OMAP 310、OMAP 2420、OMAP 310

    對於使用者態模擬模式,qemu支援的硬體列表如下:x86 (32 and 64 bit), PowerPC (32 and 64 bit), ARM, MIPS (32 bit only), Sparc (32 and 64 bit), Alpha, ColdFire(m68k), CRISv32 and MicroBlaze CPUs are supported.

1.1 qemu 的本質

     眾所周知,Bochs 是一款可移植的IA-32模擬器,它利用模擬的技術來模擬目標系統,具體來說,將是將目標系統的指令分解,然後模擬分解後的指令以達到同樣的效果。這種方法將每一條目標指令分解成多條主機系統的指令,很明顯會大大降低模擬的速度。

    qemu則是採用動態翻譯的技術,先將目的碼翻譯成一系列等價的被稱為“微操作”(micro-operations)的指令,然後再對這些指令進行拷貝,修改,連線,最後產生一塊原生代碼。這些微操作排列複雜,從簡單的暫存器轉換模擬到整數/浮點數學函式模擬再到load/store操作模擬,其中load/store操作的模擬需要目標作業系統分頁機制的支援。

    qemu對客戶程式碼的翻譯是按塊進行的,並且翻譯後的程式碼被快取起來以便將來重用。在沒有中斷的情況下,翻譯後的程式碼僅僅是被連結到一個全域性的連結串列上,目的是保證整個控制流保持在目的碼中,當非同步的中斷產生時,中斷處理函式就會遍歷串連翻譯後代碼的全域性連結串列來在主機上執行翻譯後的程式碼,這就保證了控制流從目的碼跳轉到qemu程式碼。簡單概括下:指定某個中斷來控制翻譯程式碼的執行,即每當產生這個中斷時才會去執行翻譯後的程式碼,沒有中斷時僅僅只是個翻譯過程而已。這樣做的好處就是,程式碼是是按塊翻譯,按塊執行的,不像Bochs翻譯一條指令,馬上就執行一條指令。

1.2 qemu能夠模擬的硬體

    Bochs和qemu從非常低的層次對硬體進行模擬,對於像匯流排和外圍裝置如顯示卡,網絡卡,磁碟控制器等都有相對應的軟體的表示,但是二者僅對有限的硬體集合進行精確的模擬,比如對中斷控制器,匯流排驅動,磁碟驅動,鍵盤,滑鼠,顯示卡以及網絡卡的模擬。隨著時間的推移,可模擬的硬體集合將會擴充套件到客戶作業系統能夠支援的儘可能多的裝置。Qemu和Bochs都利用執行在模擬機中的BIOSes來初始化硬體的某些部分,這種設計思想使得對裝置的模擬忠於原始的硬體。

    除了模擬之外,裝置驅動利用主機的功能來提供模擬和使用者要求的功能,下面來看幾個例子:

  • 幀緩衝區通過使用者可選擇的介面被暴露出來,對於qemu來說,幀緩衝有SDL window,VNC Server和無圖形介面的輸出三個可供選擇的選項
  • qemu中的網路可以是被禁止的,可以是被橋接到主機的,可以使用虛擬乙太網協議建立的Unix套接字,還可以是被在qemu中被完全模擬的

1.3 可移植性

    qemu採用了模組化的設計思想,模擬器中與目標平臺相關的部分被分離到它們自己的檔案和目錄中。對於核心部分,驅動部分和動態翻譯器來說,所有目標平臺都宣告相同的介面,在整個qemu的111,000行程式碼中,目標平臺相關的元件程式碼大約佔了1/3,特別地,x86目標平臺的大約不超過8000行。與Bochs不同的是,qemu對目標平臺的描述非常的緊湊,因此,可以模擬大量的目標平臺。

    qemu要求公開有關編譯執行的資訊以便動態翻譯器使用,幸運地是,這些資訊中的絕大部分對於偵錯程式,動態聯結器和單獨編譯來說都是非常必要的。另外,qemu完全由C語言編寫,在主機和目標平臺環境之間建立了一個隔離層。值得一提的是動態翻譯器使用了帶GNU擴充套件的C編寫,這種結構化的可移植性,再加上GCC對大量系統的支援,使得qemu在主機系統之間的可移植性大大增加。

參考來源:http://blog.csdn.net/ustc_dylan/article/details/6784876