天天看點

KVM,QEMU核心分析

目前正在學習虛拟化軟體KVM相關運作原理、過程,對源碼的分析進行了總結,隻是為了學習交流使用,若有不正确的地方,希望大家提出。

由于有一些代碼結構圖或者是架構圖上傳比較麻煩,是以博文都放在了自己的個人部落格上,麻煩大家移步檢視:

總入口:我的個人blog:http://www.royluo.org

文章清單(可直接點選進入)

1. kvm安裝與啟動過程說明

根據這段時間對Linux KVM的研究,現将KVM的安裝與Virtual OS的啟動進行總結說明。【點選檢視完整文章】

2. kvm安裝與啟動過程說明-Kernel源碼編譯方式

《kvm安裝與啟動過程說明》進行了通用桌面系統的虛拟機安裝。在本文中将介紹自行編譯linux Kernel核心源碼,無桌面OS虛拟機安裝和啟動。為後續核心調試打下基礎。【點選檢視完整文章】

3. KVM硬體輔助虛拟化之 EPT(Extended Page Table)

傳統OS環境中,CPU對記憶體的通路都必須通過MMU将虛拟位址VA轉換為實體位址PA進而得到真正的Physical Memory Access,即:VA->MMU->PA。虛拟運作環境中由于Guest OS所使用的實體位址空間并不是真正的實體記憶體,而是由VMM供其所使用一層虛拟的實體位址空間,為使MMU能夠正确的轉換虛實位址,Guest中的位址空間的轉換和通路都必須借助VMM來實作,這就是記憶體虛拟化的主要任務,即:GVA->MMU Virtualation->HPA。【點選檢視完整文章】

     4. KVM硬體輔助虛拟化之 EPT in Nested Virtualization

在嵌套虛拟環境(Nested Virtualization)下,運作在hypervisor上的Virtual Machine仍可以作為hypervisor去運作其它的Virutal Machine,而KVM也支援了這種強大的特性。而在《KVM硬體輔助虛拟化之 EPT》一文中,我們詳細分析了單層虛拟機并引入硬體輔助虛拟化EPT功能的環境下,Guest OS中的虛拟位址到真實實體位址的通路方法,即在EPT頁表的幫助下,通過二維的頁表機制,最終實作GVA到HPA的轉換。那麼在多層嵌套虛拟機情況下,EPT又是如何發揮作用的呢?【點選檢視完整文章】

5. KVM-Introduce 相信很多的人對虛拟機并不陌生,目前也有很多優秀的虛拟機軟體,例如:VMware, VirtualBox, Xen, KVM等。而本文的主要内容是介紹KVM。【點選檢視完整文章】

6. KVM Run Process之Qemu核心流程 在前文中,介紹了在KVM環境下使用Qemu成功建立并運作了虛拟機,而這一切的背後是什麼樣的運作機制呢?本文主要介紹在整個建立和運作過程中Qemu與KVM裡兩者的核心運作流程。【點選檢視完整文章】

7. KVM Run Process之KVM核心流程 在“KVM Run Process之Qemu核心流程”一文中講到Qemu通過KVM_RUN調用KVM提供的API發起KVM的啟動,從這裡進入到了核心空間運作,本文主要講述核心中KVM關于VM運作的核心調用流程,所使用的核心版本為linux3.15。【點選檢視完整文章】

     8. Qemu之Network Device全虛拟方案:前端網絡流的建立 KVM在I/O虛拟化方面,傳統的方式是使用Qemu純軟體的方式來模拟I/O裝置,其中包括經常使用的網卡裝置。這次我們重點分析Qemu為實作網絡裝置虛拟化的全虛拟化方案。本主題從三個組成方面來完整描述,包括:1. 前端網絡流的建立; 2. 虛拟網卡的建立; 3. 網絡I/O虛拟化 in Guest OS。

本篇主要講述“前端網絡流的建立”。【點選檢視完整文章】

9. Qemu之Network Device全虛拟方案:虛拟網卡的建立

上文針對Qemu在前端網絡流路徑的建立方面做了詳細的描述,資料包從Host的實體網卡經過Host Linux核心中的Bridge, 經過Tap裝置到達了Qemu的使用者态空間。而Qemu是如何把資料包送進Guest中的呢,這裡必然要說到到虛拟網卡的建立。

當指令行傳入nic相關參數時,Qemu就會解析網絡相關的參數後進入虛拟網卡的建立流程。而在上文中提到對于所有-net類型的裝置,都視作一個net client來對待。而在net client的建立之前,需要先建立Qemu内部的hub和對應的port,來關聯每一個net client,而對于每個建立的-net類型的裝置都是可以可以配置其接口的vlan号,進而控制資料包在其中配置的vlan内部進行轉發,進而做到多個虛拟裝置之間的switch。【點選檢視完整文章】

10.  Qemu之Network Device全虛拟方案三: I/O虛拟化 前面兩文主要對前端網絡流的資料路徑和虛拟網卡的建立進行了說明,這些可以看做是Guest OS網絡資料包收發的準備工作,那麼網絡資料包是如何在Guest OS中進進出出的呢,本文就是重點講述Guest OS的資料包的收發路徑,其中涉及到一個重要的虛拟化技術,即I/O虛拟化.【點選檢視完整文章】

11.  Hypercall 在Linux中,大家應該對syscall非常的了解和熟悉,其是使用者态進入核心态的一種途徑或者說是一種方式,完成了兩個模式之間的切換;而在虛拟環境中,有沒有一種類似于syscall這種方式,能夠從no root模式切換到root模式呢?答案是肯定的,KVM提供了Hypercall機制,x86體系架構也有相關的指令支援。【點選檢視完整文章】

12, virtio netdev的建立 Linux目前支援至少了8種虛拟化系統:  

1. Xen

2. KVM

3. VMware's VMI

4. IBM's System p

5. IBM's System z

6. User Mode Linux

7. lguest 

8. IBM's legacy iSeries

而新的系統也在不斷的湧現,各個系統在網絡裝置、塊裝置、console及其它裝置驅動在新特性支援和性能優化方面存在着瓶頸。

為解決這些問題,Rusty Russell開發了virtio機制,其是一個在hypervisor之上的抽象API接口,讓客戶機知道自己運作在虛拟化環境中,進而與hypervisor根據virtio标準協作,進而在Guest中達到更好的性能(特别是I/O性能),關于virtio在其論文中如此定義:【點選檢視完整文章】

13. Guest與virtio netdev的互動方式 Qemu為virtio裝置配置設定了專門的pci裝置ID,device IDs (vendor ID 0x1AF4) from 0x1000 through 0x10FF,而pci子系統中的廠商ID和裝置ID就成為了virtio類型和廠商域的組成,是以PCI驅動是不需要知道virtio裝置類型的真正含義,對于Kernel來說隻是注冊了一個struct virtio_device,并挂載到了virtio bus類型總線上,并由virtio driver來驅動。

virtio裝置對于Linux Kernel中的裝置類型來說是作為pci裝置被使用的,是以具有pci裝置的所有屬性,是以其也具備了PCI配置空間。【點選檢視完整文章】

14. vring的建立

KVM上裝置I/O虛拟化的性能問題長期存在,此時由Rusty Russell開發的virtio引起了開發者們的注意并逐漸被KVM等虛拟化平台接納并作為了其I/O虛拟化最主要的一個通用架構。

Virtio使用virtqueue來實作其I/O機制,每個virtqueue就是一個承載大量資料的queue。vring是virtqueue的具體實作方式。【點選檢視完整文章】

15. virtio-netdev 資料包的發送 在前面幾文中已經大體介紹了virtio的重要組成,包括virtio net裝置的建立,vring的建立,與virtio裝置的互動方式,我們就從網絡資料包的發送角度來看下virtio的具體使用流程。【點選檢視完整文章】

16. Vhost Architecture 在前面的文章中在介紹virtio機制中,可以看到在通常的應用中一般使用QEMU使用者态程式來模拟I/O通路,而Guest中的資料要通過Guest到Host Userspace的第一次拷貝,再經過Host userspace的第二次拷貝,這種多次的資料拷貝和CPU特權級的切換對性能有相當大的影響。為加速virtio裝置的I/O性能,VHOST通過driver的形式在Host Kernel中直接實作了virtio裝置的模拟。通過在Host Kernel中對virtios裝置的模拟運作允許Guest與Host Kernel直接進行資料交換,進而避免了使用者空間的system call與資料拷貝的性能消耗。【點選檢視完整文章】

17. Virtio-blk淺析 和virtio-network一樣,virtio-blk驅動使用Virtio機制為Guest提供了一個高性能的塊裝置I/O的方法。我們這裡看下virtio-blk的實作。【點選檢視完整文章】

待續。。。

繼續閱讀