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 網路啟動