原创 9.1 libvirt與openstack

9.1.1 libvirt的基本概念 在前面的1-7章,我們分析了kvm的虛擬化原理與技術實現;第8章則分析了qemu的虛擬機的管理。在雲環境下: (1)不同的服務可能構建在不同的虛擬機實現上如kvm和xen,vmare等;因而上層就需

原创 4.3 時鐘虛擬化

kvm支持的時鐘有8254,local apic timer,kvmclock等,本節將分析8254和kvmclock 4.3.1 8254時鐘虛擬化 structkvm_pit *kvm_create_pit(struct kvm *

原创 5.1 Qemu IO管理框架

IO虛擬化的核心就是通過模擬寄存器操作來完成設備的相應功能,並通過注入中斷推動guest os上的驅動執行. 因此如何獲取guest os 的設備寄存器操作和注入中斷是設備虛擬化框架的關鍵. 中斷注入在第4章分析過,這裏不再分析. PC

原创 5.4 QEMU block & AIO

5.4.1 Qemu block driver (1) block driver註冊 bdrv_register 用戶驅動註冊,raw-posix.c是raw block driver. block_init(bdrv_file_ini

原创 4.2 APIC 虛擬化

每個邏輯處理器都有自己的local apic,當guest讀取local apic寄存器時將返回物理cpu的值,當guest寫時將寫入物理寄存器。例如可以通過ICR寄存器向其他cpu發送IPI.Local APIC虛擬化有兩種方法:  

原创 6.2 vm host端的virtio

本節通過三個問題來分析vm host端的virtio架構。1.虛擬設備的添加,2.數據傳輸 3.中斷注入。 仍然以virtio_blk爲例,代碼位於qemu中 6.2.1 虛擬設備管理 (1) 註冊虛擬驅動設備 static TypeI

原创 8.3 Qemu啓動參數管理

8.3.1參數初始化流程 其代碼位於vl.c(main.c) a)  判斷是否使用default設置  optind = 1; popt = lookup_opt(argc, argv,&optarg, &optind); switc

原创 9.2 libvirt中對Qemu的控制

本節以libvirt 1.2.8爲基礎,來分析libvirt如何控制qemu虛擬機.   9.2.1 libvirt qemu的架構 int qemuRegister(void) (qemu/qemu_driver.c) {     i

原创 10.1 Qemu的網絡管理

本節通過rtl8139網卡的例子,從虛擬驅動模塊入手,來分析Qemu的網絡虛擬化原理與架構。   10.1.1 rtl8139的虛擬網卡驅動 (1) 虛擬網卡設備的初始化 static Property rtl8139_properti

原创 5.2 磁盤控制器虛擬驅動

             本節通過分析piix磁盤 控制器來看看虛擬化驅動的骨架與實現要點。相關源碼路徑如下:  hw\ide\piix.c; hw\ide\core.c; 5.2.1虛擬驅動初始化  pc_init1 ==> 創建設備p

原创 10.2KVM嵌套虛擬化原理

10.2.1 KVM嵌套虛擬化簡介 KVM使用Intel的vmx來提高虛擬機性能, ,現在如果我們需要多臺具備VMX支持的主機, 但是又沒有太多物理機器可使用, 那應該怎麼辦呢? 如果我們的虛擬機能夠和物理機一樣支持VMX,就能解決這

原创 6.1.Virtio 原理與Guest OS driver

6.1.1 全虛擬化與半虛擬化   讓我們先討論一下兩種類型完全不同的虛擬化模式:完全虛擬化和半虛擬化。在完全虛擬化中,Guest OS運行在位於物理機器上的 hypervisor 之上。Guest OS並不知道它已被虛擬化,並且不需要

原创 7.1 虛擬機直接IO原理與架構

7.1.1 虛擬機直接虛擬化原理與難點   第5與第6章分別講解了qemu/kvm的硬件輔助IO模擬虛擬化與virtio半虛擬化. 模擬I/O設備方式的優點是對硬件平臺依賴性較低、可以方便模擬一些流行的和較老久的設備、不需要宿主機和客

原创 7.2 Qemu/KVM 直接IO框架

7.2.1 qemu pci-assign模塊 虛擬機上的設備是由qemu創建出來的,對於直接io也是如此。 區別在於直接io時,qemu直接調用vm host上的硬件設備完成相應功能;而不需要更多的軟件處理。 static const

原创 5.3Pci虛擬化

          5.3.1 虛擬pci控制器 (1) 初始化 pc_init1 ==> i440fx_init(&i440fx_state,&piix3_devfn, &isa_bus, gsi,.....); ==> i440fx_