QEMU

**QEMU**（quick emulator）是一款由法布里斯・貝拉（Fabrice Bellard）等人編寫的通用且免費的可執行硬體虛擬化的（hardware virtualization）開源仿真器（Emulator）。

其與 Bochs，PearPC 類似，但擁有高速（配合 KVM），跨平台的特性。

QEMU 是一個代管的虛擬機，它通過動態的二進位轉換，類比 CPU，並且提供一組裝置模型，使它能夠執行多種未修改的客戶機 OS，可以通過與 KVM 一起使用進而接近本地速度執行虛擬機器（接近真實電腦的速度）。

QEMU 還可以為 user-level 的行程執行 CPU 仿真，進而允許了為一種架構編譯的程式在另外一種架構上面執行（藉由 VMM 的形式）。

## 系統模組

QEMU 有多種模式

* User mode：又稱作「使用者模式」，在這種模式下，QEMU 執行針對不同指令編譯的單個 Linux 或 Darwin/macOS 程式。系統呼叫與 32/64 位元介面適應。在這種模式下，我們可以實現交叉編譯（cross-compilation）與交叉偵錯（cross- debugging）。
* System mode：「系統模式」，在這種模式下，QEMU 類比一個完整的電腦系統，包括外圍裝置。它可以用於在一台電腦上提供多台虛擬電腦的虛擬主機。 QEMU 可以實現許多客戶機 OS 的引導，比如 x86，MIPS，32-bit ARMv7，PowerPC 等等。
* KVM Hosting：QEMU 在這時處理 KVM 鏡像的設定與遷移，並參加硬體的仿真，但是客戶端的執行則由 KVM 完成。
* Xen Hosting：在這種代管下，客戶端的執行幾乎完全在 Xen 中完成，並且對 QEMU 封鎖。QEMU 只提供硬體仿真的支援。

## 架構

QEMU 的架構由純軟體實現，並在 Guest 與 Host 中間，來處理 Guest 的硬體請求，並由其轉譯給真正的硬體。

然而因為 QEMU 是純軟體實現的，所有的指令都要經過 QEMU，使得效能很差，而配合 KVM 則可以解決這一問題。

QEMU 虛擬化的思路是：提取 Guest 代碼，翻譯為 **TCG** 中間代碼，而後翻譯為 **Host** 代碼。相當於實現了一個「中間人」的角色。

## 特性

QEMU 可以在執行所有程式的情況下儲存和恢復虛擬機器的狀態。**客戶作業系統**（Guest Operating System）不需要修補就可以在 QEMU 中執行。

QEMU 支援仿真各種體系結構，包括：

* IA-32（x86）個人電腦
* x86-64 個人電腦
* MIPS64 Release 6 和更早的版本
* Sun 的 SPARC sun4m
* Sun 的 SPARC sun4u
* ARM 開發板（Integrator / CP 和 Versatile / PB）
* SH4 SHIX 板
* PowerPC（PReP 和 Power Macintosh）
* ETRAX CRIS
* MicroBlaze
* RISC-V

虛擬機器可以連接多種類型的實體主機硬體，包括硬碟，CD-ROM，網卡，音效卡和 USB 裝置。USB 裝置可以是完全類比的，也可以使用主機的 USB 裝置（但這需要管理員權限，而且並非所有裝置皆適用）。

**虛擬磁碟映像**可以以特殊格式（qcow 或 qcow2）儲存，只占用虛擬機器作業系統實際使用的磁碟空間。此時類比的 120 GB 硬碟可能僅占用主機硬碟幾百 MB 的空間。QCOW2 格式還允許建立覆蓋映像，以記錄與另一個（未修改的）基本映像檔案的區別。如此便可能將類比磁碟的內容恢復到較早狀態。例如，基本映像檔案可以儲存已知可順利運作的全新安裝系統，但操作時使用覆蓋映像。萬一訪客系統故障（如因病毒攻擊，意外的系統破壞等），使用者可以刪除覆蓋映像，使用較早的類比磁碟映像版本就行了。

 
QEMU 可以通過網路位址轉換類比共享主機系統連接的網卡（不同型號），從而有效地允許 **guest 虛擬機器**使用與**主機**相同的網路。虛擬網卡還可以連接到其他 QEMU 實例的網卡或本地 TAP 介面。通過使用主機 OS 的橋接功能，將 QEMU 使用的 TUN / TAP 介面與主機 OS 上的非虛擬乙太網路介面橋接，也可以實現網路連接。

QEMU 整合了多種服務以允許主機和訪客系統進行通信；例如，整合的 SMB 伺服器和網路埠重新導向（以允許傳入連接到虛擬機器）。它也可以在沒有引導程式的情況下引導 Linux 核心。

QEMU 不依賴主機系統上的圖形輸出方法。相反，它可以允許通過整合的 VNC 伺服器存取客戶作業系統的螢幕。它還可以使用類比的串行線，而不使用任何螢幕和適用的作業系統。

類比多個 CPU 進行對稱多處理（Symmetrical Multi-Processing）也是可能的。

QEMU 不需要管理員權限執行，但在使用了某些提高速度的核心模組（如 KQEMU），或者使用某些網路連接模組時，則需要管理員權限。

### 微型碼產生器

微型碼產生器（TCG）旨在消除依賴特定版本的 GCC 或編譯器的缺點，並將編譯合併到 QEMU 的執行時任務中。因此，整個翻譯階段由兩部分組成：目的碼塊（TB）以 TCG 指令（一種機器無關的中間符號）重寫 ，隨後 TCG 為宿主機架構執行編譯。可選的最佳化在這兩步之間傳遞。

TCG 需要專用的代碼來支援每個體系結構。它還要求重寫目標指令集翻譯過程以利用 TCG 指令，而不是以前使用的 dyngen 指令。

### 加速器

KQEMU 是一個 Linux 核心模組，由 Fabrice Bellard 撰寫，它明顯加快了在具有相同 CPU 架構的平台上類比 x86 或 x86-64 程式的速度。這可以通過直接在主機 CPU 上執行使用者模式代碼（以及可選的某些核心代碼）以及僅對核心模式和真實模式代碼使用處理器與外設類比來實現。即使宿主機 CPU 不支援硬體輔助虛擬化，KQEMU 也可以從多個客戶作業系統執行代碼。QEMU 支援大容量記憶體，這使得它們與 KQEMU 不相容。較新的 QEMU 版本已完全取消對 KQEMU 的支援。

由於缺乏對 KQEMU 和 QVM86 的支援，基於核心的虛擬機器（KVM）已經基本成為基於 Linux 的硬體輔助虛擬化解決方案，與 QEMU 一起使用。

英特爾的硬體加速執行管理器（HAXM）是 KVM 在 Windows 和 MacOS 上基於 x86 的硬體輔助虛擬化的開源替代品。2013 年，英特爾使用 QEMU 來進行 Android 開發。

## 硬體輔助仿真

MIPS 相容的龍芯 3 處理器增加了 200 條新指令來幫助 QEMU 翻譯 x86 指令，這些新指令降低了在 MIPS 管線中執行 x86 / CISC 風格指令的開銷。由於中國科學院對 QEMU 進行了進一步改進，龍芯 3 在 9 個基準測試中，執行 x86 二進位檔案的同時，執行本機二進位檔案的平均效能達到 70％。 

## 並列仿真

使用 QEMU 的虛擬化解決方案能夠並列執行多個虛擬 CPU。 對於使用者模式仿真，QEMU 將仿真執行緒對映到宿主執行緒。 對於全系統仿真，QEMU 能夠為每個虛擬 CPU 執行一個主機執行緒。 前提是客戶端已經更新到可以支援並列系統仿真，目前可以支援的 CPU 是 ARM 和 Alpha。否則 QEMU 將使用單個執行緒以迴圈方式類比執行每個虛擬 CPU。

## 與其他虛擬機器的整合

**VirtualBox**

VirtualBox，發布於 2007 年 1 月，使用了一些 QEMU 的虛擬硬體裝置，並且有內建的基於 QEMUdede 動態再編譯器。與 KQEMU 一樣，VirtualBox 通過 VMM（虛擬機器管理器）在宿主機上本地執行幾乎所有客戶代碼，並將再編譯僅僅用作回退機制 —— 例如，當客戶代碼以實位址模式執行時。
另外，VirtualBox 使用內建的反組譯程式進行了大量的代碼分析和修補，以儘量減少再編譯。除某些功能外，VirtualBox 是免費且開源的（在 GPL 許可下）。

**Xen-HVM**

Xen 是虛擬機器監視器，可以使用 Intel VT-x 或 AMD-V 硬體 x86 虛擬化擴充以及 ARM Cortex-A7 和 Cortex-A15 虛擬化擴充在 HVM（硬體虛擬機器）模式下執行。
這意味著，面對 domU 以使用真實的裝置驅動程式進行交談的是一組真實的虛擬硬體，而不是半虛擬化裝置。

QEMU 包含幾個組件：CPU 仿真器，仿真裝置，通用裝置，機器描述符，使用者介面和除錯器。 QEMU 中的仿真器件和通用器件組成了虛擬 I/O 的器件模型。它們包括 PIIX3 IDE，Cirrus Logic 或純 VGA 類比影片，RTL8139 或 E1000 網路仿真以及 ACPI 支援。Xen 提供 APIC 支援。

Xen-HVM 具有基於 QEMU 專案的裝置仿真功能，可為虛擬機器提供虛擬 I/O。硬體通過執行在 dom0 後端的「QEMU 裝置模型」守護行程來類比。與其他 QEMU 執行模式（動態轉換或 KVM）不同，虛擬 CPU 完全由管理程式管理，管理程式負責在 QEMU 類比記憶體對映 I/O 存取時停止虛擬 CPU。

**KVM**

KVM（基於核心的虛擬機器）是 FreeBSD 和 Linux 的核心模組，它允許使用者空間程式存取各種處理器的虛擬化硬體特性，這個特點使得 QEMU 可以為 x86，PowerPC 和 S/390 客戶提供虛擬化。當目標體系結構與主機相同時，QEMU 可以使用 KVM 特有的功能，比如加速功能。

**Win4Lin Pro Desktop**

在 2005 年初，Win4Lin 推出了 Win4Lin Pro Desktop，它基於 QEMU 和 KQEMU 的已調諧版本，並且代管了 Windows 的 NT 版本。 在 2006 年 6 月，
Win4Lin 發布了基於相同代碼庫的 Win4Lin 虛擬桌面伺服器。 Win4Lin 虛擬桌面伺服器為來自 Linux 伺服器的精簡客戶機提供 Microsoft Windows 對談服務。

2006 年 9 月，Win4Lin 宣布將公司名稱更改為 Virtual Bridges，並發布了 Win4BSD Pro Desktop，該產品的一個埠用於 FreeBSD 和 PC-BSD。在 2007 年 5 月發布了 Win4Solaris Pro Desktop 和 Win4Solaris 虛擬桌面伺服器後，提供了 Solaris 支援。

**SerialICE**

SerialICE 是一款基於 QEMU 的韌體除錯工具，可在 QEMU 內部執行系統韌體，同時通過與主機系統的串行連接存取真實硬體。這可以用作硬體 ICE 的廉價替代品。

**WinUAE**

WinUAE Amiga 仿真器在 3.0.0 版本中引入了對使用 QEMU PPC 核心的 CyberStorm PPC 和 Blizzard 603e 開發板的支援。

## 硬體平台類比

QEMU 可類比多種硬體裝置

鍵盤 
SCSI 控制器（AMD PCscsi 和 Tekram DC-390 控制器中的 LSI MegaRAID SAS 1078，LSI53C895A，NCR53C9x） 
串行介面 
音效卡（Sound Blaster 16，ES1370 PCI，Gravis Ultrasound，AC97 和 Intel HD Audio） 
看門狗定時器（Intel 6300 ESB PCI 或 iB700 ISA） 
USB 1.x/ 2.x/ 3.x 控制器（UHCI，EHCI，xHCI） 
USB 裝置：音訊，藍牙配接器，HID（鍵盤 / 滑鼠 / 平板電腦），MTP，串行介面，CAC 智慧卡讀卡機，儲存（僅批次傳輸和 USB 連接 SCSI），Wacom 數位板

**arm**

QEMU 使用 NEON 擴充類比 ARMv7 指令集。它類比整合系統 / CP 板，多功能底板，RealView 仿真底板，基於 XScale 的 PDA，Palm Tungsten | E PDA，諾基亞 N800 和諾基亞 N810 網際網路平板電腦等完整系統.QEMU 還為 Android SDK 提供支援，該模擬器屬於 Android SDK 。三星選擇了 QEMU 來幫助開發仿真 'Wave' 裝置。

基於 Xilinx Cortex A9 的 Zynq SoC 採用以下元素進行建模仿真：

Zynq-7000 ARM Cortex-A9 CPU Zynq-7000 ARM Cortex-A9 MPCore 三重計時器 DDR 記憶體控制器 DMA 控制器（PL330） 靜態記憶體控制器（NAND / NOR 快閃記憶體） SD / SDIO 外設控制器（SDHCI） Zynq 千兆乙太網路控制器 USB 控制器（僅限 EHCI - 主機支援） Zynq UART 控制器 SPI 和 QSPI 控制器 I2C 控制器

## 衍生版本

UTM 虛擬機器（UTM Virtual Machine）是一款基於 QEMU 的虛擬機器，支援 iOS、iPadOS、macOS 作業系統。基於 QEMU 的 UTM 虛擬機器，可支援類比 30 多個架構，例如 x86\_64，ARM64，以及 RISC-V 等。

目前 UTM 支援在系統版本 iPadOS 13 以上、iOS 11 以上、macOS Big Sur 以上的裝置上執行。

## 參見

* 系統虛擬機器比較
* VirtualBox

## 參考文獻

## 外部連結

* QEMU 的主頁（頁面存檔備份，存於網際網路檔案館）
* QEMU on Windows（頁面存檔備份，存於網際網路檔案館） - 已編譯的二進位可執行檔
* qemu-0.12.4 Binaries (x86 & x64） - 同上
* Drivers for QEMU devices（頁面存檔備份，存於網際網路檔案館） - 驅動程式
* Qemu Manager - 初學者易用
* 用 Eee PC 901 同時運行四個 OS！（Windows XP、Linux 加集體回憶 DOS / Windows 3.x 及 Windows 95）
* 實作 QEMU 虛擬機 PXE 網路啟動