KVM 和 QEMU 的區別
我已經閱讀
KVM
了Qemu
一段時間。到目前為止,我對他們的工作有一個清晰的了解。KVM 支持硬體虛擬化,以向客戶作業系統提供接近本機的性能。另一方面,QEmu 模擬目標作業系統。
我很困惑的是這兩個座標在什麼級別。像
- 誰管理 RAM 和/或記憶體的共享?
- 誰調度 I/O 操作?
青木:
QEmu 是一個完整的獨立軟體。你用它來模擬機器,它非常靈活和便攜。它主要由一個特殊的“重新編譯器”工作,它將為給定處理器編寫的二進制程式碼轉換為另一個(例如,在 PPC mac 上執行 MIPS 程式碼,或在 x86 PC 上執行 ARM)。
除了模擬處理器之外,Qemu 還包含一長串外圍模擬器:磁碟、網路、VGA、PCI、USB、串列/並行埠等。
KQemu:
在源和目標都是相同架構的特定情況下(例如 x86 在 x86 上的常見情況),它仍然必須解析程式碼以刪除任何“特權指令”並用上下文切換替換它們。為了使其在 x86 Linux 上盡可能高效,有一個名為 KQemu 的核心模組可以處理這個問題。
作為一個核心模組,KQemu 能夠執行大多數程式碼不變,只替換最低級別的 ring0-only 指令。在這種情況下,使用者空間 Qemu 仍然為模擬機器分配所有 RAM,並載入程式碼。不同之處在於它不是重新編譯程式碼,而是呼叫 KQemu 來掃描/修補/執行它。所有外圍硬體仿真都是在 Qemu 中完成的。
這比普通的 Qemu 快很多,因為大多數程式碼都沒有改變,但仍然需要轉換 ring0 程式碼(VM 核心中的大部分程式碼),因此性能仍然會受到影響。
虛擬機:
KVM 有幾樣東西:首先它是一個 Linux 核心模組——現在包含在主線中——將處理器切換到一個新的“客戶”狀態。來賓狀態有自己的一組環狀態,但特權 ring0 指令回退到管理程式碼。由於它是一種新的處理器執行模式,因此不必以任何方式修改程式碼。
除了處理器狀態切換之外,核心模組還處理模擬的一些低級部分,如 MMU 寄存器(用於處理 VM)和 PCI 模擬硬體的某些部分。
其次,KVM 是 Qemu 執行檔的一個分支。兩個團隊都積極努力將差異降至最低,並且在減少差異方面取得了進展。最終,目標是 Qemu 應該可以在任何地方工作,並且如果 KVM 核心模組可用,則可以自動使用它。但在可預見的未來,Qemu 團隊專注於硬體仿真和可移植性,而 KVM 團隊則專注於核心模組(有時將仿真的一小部分移到那裡,如果它提高了性能),以及與其餘使用者空間程式碼的介面。
kvm-qemu 執行檔像普通的 Qemu 一樣工作:分配 RAM,載入程式碼,而不是重新編譯它,或者呼叫 KQemu,它產生一個執行緒(這很重要)。執行緒呼叫 KVM 核心模組切換到訪客模式並繼續執行 VM 程式碼。在特權指令上,它切換回 KVM 核心模組,如果需要,它會向 Qemu 執行緒發出信號以處理大部分硬體仿真。
這種架構的優點之一是來賓程式碼在 posix 執行緒中模擬,您可以使用普通的 Linux 工具對其進行管理。如果你想要一個 2 或 4 核的 VM,kvm-qemu 會創建 2 或 4 個執行緒,每個執行緒呼叫 KVM 核心模組開始執行。並發(如果您有足夠的真實核心)或調度(如果沒有)由普通的 Linux 調度程序管理,從而保持程式碼小且意外有限。