1. 程式人生 > 實用技巧 >OpenStack設計與實現(三)KVM和QEMU淺析

OpenStack設計與實現(三)KVM和QEMU淺析

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

一、KVM概述

KVM是Kernel-based Virtual Machine的縮寫,即基於linux核心的虛擬機器,是一種的完全虛擬化的解決方案,也就是說普通的作業系統不需經過修改就可以在KVM上執行。它使用linux自身的排程器進行管理,所以相對於xen,其核心原始碼很少。KVM的虛擬化需要硬體的支援(如intel VT技術或者AMD V技術),是基於硬體的完全虛擬化。

準確來說,KVM是Linux的一個模組。可以用modprobe去載入KVM模組。載入了模組後,就可以使用KVM模組建立虛擬機器,實現虛擬記憶體的分配,虛擬CPU暫存器的讀寫以及管理虛擬CPU的執行。但僅有KVM模組是遠遠不夠的,因為使用者無法直接控制核心模組去作事情,所以還必須有一個使用者空間的工具才行。這個使用者空間的工具,開發者選擇了已經成型的開源虛擬化軟體 QEMU,使用它來模擬PC硬體的使用者空間元件,模擬I/O裝置模型以及提供訪問外設的途徑。後邊會詳細的介紹QEMU,這裡先知道它用了QEMU就好了。

KVM基本架構如下圖所示。
20160121083615164.png

其中KVM被加入到標準的Linux核心中,被組織成Linux中標準的字元裝置(/dev/kvm)。Qemu利用KVM提供的LibKvm應用程式介面,通過ioctl系統呼叫建立和執行虛擬機器。KVM Driver使得整個Linux成為一個虛擬機器監控器。並且在原有的Linux兩種執行模式(核心模式和使用者模式)的基礎上,新增加了客戶模式,客戶模式擁有自己的核心模式和使用者模式。在虛擬機器執行下,三種模式的分工如下:

  • 客戶模式:執行非I/O的客戶程式碼,虛擬機器執行在客戶模式下。
  • 核心模式:實現到客戶模式的切換,處理因為I/O或者其它指令引起的從客戶模式的退出,KVM Driver工作在這種模式下。
  • 使用者模式:代表客戶執行I/O指令Qemu執行在這種模式下。

KVM的具體工作流程如下:
使用者模式的qemu利用libkvm通過ioctl進入核心模式,kvm模組未虛擬機器建立虛擬記憶體,虛擬CPU後執行VMLAUCH指令進入客戶模式。載入Guest OS並執行。如果Guest OS 發生外部中斷或者影子頁表缺頁之類的情況,會暫停Guest OS的執行,退出客戶模式出行異常處理,之後重新進入客戶模式,執行客戶程式碼。如果發生I/O事件或者訊號佇列中有訊號到達,就會進入使用者模式處理。

20160121083626010.png

二、 QEMU概述

QEMU(Quick Emulator)是一個獨立的開源虛擬機器軟體,它是通過純軟體來模擬X86平臺處理器的取指、解碼和執行,虛擬客戶機的指令並不在物理平臺上直接執行,它利用其中的微型程式碼生成器模組進行動態翻譯,將需要模擬的客戶機的程式碼架構轉換成主機程式碼架構並最終執行。QEMU虛擬機器是一個純軟體的實現(KVM需要硬體虛擬化技術支援),所以效能低下。但是,其優點是虛擬機器可以與宿主機並不是同一個架構。與KVM不同的是,QEMU的程式碼中有整套的虛擬機器實現,包括處理器虛擬化、記憶體虛擬化,以及KVM使用到的虛擬裝置模擬(比如網絡卡、顯示卡、儲存控制器和硬碟等)


原文連結:https://community.qingcloud.com/topic/320/

轉載於:https://my.oschina.net/yunify/blog/608664