QEMU

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

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

QEMU可以執行使用者級的進程仿真，從而可以使為某一架構編譯的程序在另一架構上運行（通過 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
- 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），或者使用某些網路連接模組時，則需要管理員權限。

### 微型代碼生成器

微型代碼生成器（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 以上的設備上運行。

## 外部連結

- 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網路開機

## 基本資料

- 開發者：Fabrice Bellard
- 作業系統：Windows，Linux，Mac OS X，FreeBSD
- 類型：模擬器
- 許可協議：多種授權