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），或者使用某些網路連接模組時，則需要管理員權限。

**微型代碼生成器**
微型代碼生成器（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 2.0在iPadOS 14上的屏幕截圖
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的主頁date=20100528112917 - QEMU on Windowsdate=20110408201136  - 已編譯的二進制可執行文件- qemu-0.12.4 Binaries (x86 & x64） - 同上- Drivers for QEMU devicesdate=20100405081344  - 驅動程序- Qemu Manager - 初學者易用- 用Eee PC 901同時運行四個OS！（Windows XP、Linux加集體回憶DOS / Windows 3.x及Windows 95）- 實作QEMU虛擬機PXE網路開機