kvm源代碼分析


vmx是x86硬件虛擬化層,從代碼看,qemu用戶態是一層,kernel中KVM通用代碼是一層,類似kvm_x86_ops是一層,針對各個不同的硬件架構,而vcpu_vmx則是具體架構的虛擬化方案一層。
 
在執行vm entry時候將vmm狀態保存到vmcs的host area,並加載對應vm的vmcs guest area信息到CPU中,vm exit時候則反之,vmcs具體結構分配由硬件實現,程序員只需要通過VMWRITE和VMREAD指令去訪問
 
在kvm_main.c文件中
創建VM,涉及函數kvm_dev_ioctl_create_vm
該函數中的kvm_create_vm主要有兩個函數kvm_arch_init_vm和hardware_enable_all用於初始化虛擬機和對硬件配置的檢測(個人理解)
kvm_arch_init_vm:初始化KVM_arch,更新kvmclock
 
結構體kvm_x86_ops定義在kvm_host.h頭文件中,在頭文件中定義了關於x86體系結構的kvm相關接口,結構體kvm_x86_ops的成員是一些函數指針變量,這些指針變量在svm.c中被賦值
 
debugfs是一種用於內核調試的虛擬文件系統,通過其與用戶空間交換數據
 
由於GPA不能直接用於MMU尋址,需要將其轉換為HVA,在kvm中利用kvm_memory_slot數據結構記錄每一個地址區間(Guest中的物理地址區間)中GPA與HVA的映射關系

 

kvm內核模塊是作為一個設備驅動程序安裝的,名稱為/dev/kvm,要使用kvm,需要先用open打開/dev/kvm設備 ,得到kvm設備文件描述符fd,然后利用此fd調用ioctl向設備驅動發送命令,kvm驅動解析此種請求的函數是kvm_dev_ioctl(kvm_main.c),如KVM_CREATE_VM。其次是具體的VM。通過KVM_CREATE_VM創建了一個VM后,用戶程序需要發送一些命令給VM,如KVM_CREATE_VCPU。這些命令當然也是要通過ioctl來發送,所以VM也需要對應一個文件描述符才行。用戶程序中用ioctl發送KVM_CREATE_VM得到的返回值就是新創建VM對應的fd,之后利用此fd發送命令給此VM。kvm驅動解析此種請求的函數是kvm_vm_ioctl。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM