QEMU

QEMU（Quick Emulator）是一款免費開源模擬器，由法布里斯・貝拉（Fabrice Bellard）等人編寫。其與 Bochs，PearPC 類似，但擁有高速（配合 KVM）、跨平臺的特性。

QEMU 是一個託管的虛擬機器，它使用動態二進位制轉換技術來模擬處理器，並且提供多種硬體和外設模型，這使它能夠執行多種未修改的客戶機作業系統，能與 KVM 配合以接近本地速度執行虛擬機器（接近真實電腦的速度）。

QEMU 可以執行使用者級的程序模擬，從而可以使為某一架構編譯的程式在另一架構上執行（透過 VMM 的形式實現）。

TOC

系統模組

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
LoongArch

虛擬機器可以連線多種型別的實體主機硬體，包括硬碟，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），或者使用某些網路連線模組時，則需要管理員許可權。

3.1 微型程式碼生成器

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

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

3.2 加速器

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。

硬體平臺模擬

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 以上的裝置上執行。