kvm是乙個核心模組,它實現了乙個/dev/kvm的字元裝置來與使用者進行互動,通過呼叫一系列ioctl函式可以實現qemu和kvm之間的切換。
1、qemu發起kvm_create_vm的ioctl建立虛擬機器
qemu從vl.c/main開始,通過configure_accelerator根據當前current_machine呼叫對應的accel_init_machine,如果是kvm則具體是kvm_init。當要建立虛擬機器,kvm_init函式中會s->fd = qemu_open("/dev/kvm", o_rdwr);開啟/dev/kvm裝置,獲取虛擬機器控制代碼fd,在該fd上ret =kvm_ioctl(s,kvm_create_vm, type); s->vmfd = ret;此ioctl函式在kvm中的實現為kvm_main.c中kvm_dev_ioctl函式。當傳入的引數為kvm_create_vm時,該函式會建立乙個vm,並且返回乙個vm_fd,通過該vm_fd可以操作虛擬機器。
2、qemu中建立虛擬機器的vcpu和qemu執行緒關係,並切換到kvm中
在vl.c/main的最開始會module_call_init(module_init_machine)本質就是把pc_init1賦值給了mc->init。在kvm_init建立完虛擬機器後,會返回到main中,呼叫machine_class->init(current_machine);即會呼叫之前註冊的pc_init1,該函式中有兩個重要的pc_cpus_init和pc_memory_init,即cpu和記憶體的初始化,在pc_cpus_init-》pc_new_cpu-》(1)cpu_x86_create主要就是把cpux86state填充了一下,涉及到cpuid和其他的feature。(2)object_property_set_bool-》object_property_set_qobject-》object_property_set-》property_set_bool-》device_set_realized-》dc->realize此即為x86_cpu_common_class_init設定了處理函式dc->realize =x86_cpu_realizefn;
執行x86_cpu_realizefn呼叫qemu_init_vcpu-》qemu_kvm_start_vcpu-》qemu_thread_create該函式建立vcpu對應的qemu執行緒,執行緒函式是qemu_kvm_cpu_thread_fn,該執行緒函式中:
(1)kvm_init_vcpu(1.1)通過ret =kvm_vm_ioctl(s,kvm_create_vcpu, (void *)kvm_arch_vcpu_id(cpu));建立虛擬機器的vcpu。對應到kvm的kvm_main.c中kvm_vm_ioctl函式,當傳入的引數為vm_create_vcpu時,與kvm_create_vm過程類似,它建立乙個vcpu並且返回可以操作該vcpu的vcpu_fd;(1.2)mmap_size = kvm_ioctl(s, kvm_get_vcpu_mmap_size, 0);cpu->kvm_run= mmap(null, mmap_size, prot_read | prot_write, map_shared, cpu->kvm_fd, 0);獲取kvm_run對應的記憶體對映(1.3)kvm_arch_init_vcpu則填充對應的kvm_arch內容。
(2)在kvm_init_vcpu返回後會先設定開關qemu_cond_signal(&qemu_cpu_cond);開啟這個開關(貌似再經過pc_memory_init設定好記憶體後,pc_init1完成,即可執行)才會while迴圈kvm_cpu_exec,該函式會run_ret =kvm_vcpu_ioctl(cpu,kvm_run, 0);切換到kvm中執行。對應到kvm的:kvm_main.c中kvm_vcpu_ioctl函式,若傳入的引數為kvm_run,它最終會呼叫vcpu_enter_guest函式進入guest vm。
關於開關:
qemu-kvm執行緒工作過程:
1)啟動乙個子執行緒,建立初始化vcpu,主線程等待
2)子執行緒建立初始化vcpu完畢,子執行緒等待,並等候通知主線程執行
3)主線程繼續初始化虛擬機器工作,初始化完成,通知子執行緒繼續執行
4)子執行緒繼續啟動虛擬機器kvm_run,主線程執行select互動處理
3、主線程main_loop
thread1:主線程,這個執行緒loop迴圈,迴圈操作select.實際就是檢視有無讀寫檔案描述符,有的話進行讀寫操作
thread2:子執行緒,非同步進行i/o操作,主要針對磁碟映像操作(block drive)
thread3:子執行緒,vcpu執行緒, kvm_run啟動和執行虛擬機器
參考:oenhen虛擬機器建立和執行
qemu編譯 建立虛擬機器
首先安裝編譯qemu依賴包 apt get install gcc libsdl1.2 dev zlib1g dev libasound2 dev linux kernel headers pkg config libgnutls dev libpci dev tar jxvf qemu 1.4.2...
QEMU和KVM的關係
首先kvm kernel virtual machine 是linux的乙個核心驅動模組,它能夠讓linux主機成為乙個hypervisor 虛擬機器監控器 在支援vmx virtual machine extension 功能的x86處理器中,linux在原有的使用者模式和核心模式中新增加了客戶模...
編譯qemu和libvirt使支援SDL
qemu kvm 1.5.3 60.el7.src.rpm libvirt 1.1.1 29.el7.src.rpm 要安裝rpmbuild這個包 編譯安裝qemu 首先 安裝原始碼 rpm ivh qemu kvm 0.12.1.2 2.415.el6.src.rpm,要編譯的原始碼和需要的spe...