kvm管理介面
qemu和
kvm關係很深,甚至可以認為雙方本來是乙個軟體,
qemu
是應用層的控制部分,而
kvm是核心執行部分。軟體復用能達到如此天衣無縫的地步,是一件很神奇的事情,也說明
kvm設計時候的思路之巧。
所以分析kvm
,必須首先從
qemu
的**分析入手。為了避免繁瑣,引入太多知識點,而混雜不清。所以把
qemu
的**做簡化處理。
**清單2-1 qemu啟動**
s->fd = qemu_open("/dev/kvm", o_rdwr);
ret = kvm_ioctl(s, kvm_get_api_version, 0);
s->vmfd = kvm_ioctl(s, kvm_create_vm, 0);
...............................
ret = kvm_vm_ioctl(s, kvm_create_vcpu, env->cpu_index);
.............................
env->kvm_fd = ret;
run_ret = kvm_vcpu_ioctl(env, kvm_run, 0);
可以看到,kvm
提供了乙個裝置
/dev/kvm
,對kvm
的控制要通過這個裝置提供的
io_ctl
介面實現。這是
linux
核心提供服務的最通用方式,不再贅述。
而kvm
提供了三種概念,分別通過不同的
io_ctl
介面來控制。
q kvm:代表
kvm模組本身,用來管理
kvm版本資訊,建立乙個vm。
q vm:代表乙個虛擬機器。通過vm的
io_ctl
介面,可以為虛擬機器建立
vcpu
,設定記憶體區間,建立中斷控制晶元,分配中斷等等。
q vcpu:代表乙個
vcpu
。通過vcpu
的io_ctl
介面,可以啟動或者暫停
vcpu
,設定vcpu
的暫存器,為
vcpu
注入中斷等等。
qemu的使用方式,首先是開啟/dev/kvm
裝置,通過kvm_create_vm建立乙個虛擬機器物件,然後通過kvm_create_vcpu為虛擬機器建立vcpu物件,最後通過kvm_run設定vcpu執行起來。因為是簡化的**,中斷晶元的模擬,記憶體的模擬,暫存器的設定等等都已經省略了。
kvm實現
作為vmm,kvm分為兩部分,分別是執行於kernel模式的kvm核心模組和執行於user模式的qemu模組。這裡的kernel模式和user模式,實際上指的是vmx根模式下的特權級0和特權級3。另外,kvm將虛擬機器所在的執行模式稱為guest模式。所謂guest模式,實際上指的是vmx的非根模式。
利用vt-x技術的支援,kvm中的每個虛擬機器可具有多個虛擬處理器vcpu,每個vcpu對應乙個qemu執行緒,vcpu的建立、初始化、執行以及退出處理都在qemu執行緒上下文中進行,需要kernel、user和guest三種模式相互配合,其工作模型如圖2.1所示。qemu執行緒與kvm核心模組間以ioctl的方式進行互動,而kvm核心模組與客戶軟體之間通過vm exit和vm entry操作進行切換。
qemu執行緒以ioctl的方式指示kvm核心模組進行vcpu的建立和初始化等操作,主要指vmm建立vcpu執行所需的各種資料結構並初始化。其中很重要的乙個資料結構就是vmcs,其初始化配置見附2。
初始化工作完成之後,qemu執行緒以ioctl的方式向kvm核心模組發出執行vcpu的指示,後者執行vm entry操作,將處理器由kernel模式切換到guest模式,中止宿主機軟體,轉而執行客戶軟體。注意,宿主機軟體被中止時,正處於qemu執行緒上下文,且正在執行ioctl系統呼叫的kernel模式處理程式。客戶軟體在執行過程中,如發生異常或外部中斷等事件,或執行i/o操作,可能導致vm exit,將處理器狀態由guest模式切換回kernel模式。kvm核心模組檢查發生vm exit的原因,如果vm exit由於i/o操作導致,則執行系統呼叫返回操作,將i/o操作交給處於user模式的qemu執行緒來處理,qemu執行緒在處理完i/o操作後再次執行ioctl,指示kvm切換處理器到guest模式,恢復客戶軟體的執行;如果vm exit由於其它原因導致,則由kvm核心模組負責處理,並在處理後切換處理器到guest模式,恢復客戶機的執行。
guest虛擬位址 -> guest實體地址 -> host實體地址
mmu1 mmu2
其中mmu1可以由軟體模擬(shadow paging中的vtlb)或者硬體實現(intel ept、amd npt)。mmu2由硬體提供。系統的io虛擬化技術,通常是vmm捕捉guest的io請求,通過軟體模擬的傳統裝置將其請求傳遞給物理裝置。一些新的支援虛擬化技術的裝置,通過硬體技術(如intel vt-d),可以將其直接分配給guest作業系統,避免軟體開銷。
hashmap實現機制
int uint key.gethashcode 0x8ffffff 具體多少忘記了,總之就是把它弄成正數 int index uint map.length 把value放到那個 index位置。下次訪問時再通過 key的hashcode 0x8fffff 再 map.length 就知道valu...
MFC CArchive實現機制
mfc 提供carchive類實現資料的緩衝區讀寫,同時定義了類物件的儲存與讀取方案。以下對carchvie 的內部實現作分析。1.概述 2.內部資料 3.基本資料讀寫 4.緩衝區的更新 5.指定長度資料段落的讀寫 6.字串的讀寫 7.cobject派生物件的讀寫 一.概述 carchive使用了緩...
const實現機制
c語言以及c 語言中的const究竟表示什麼?其具體的實現機制又是如何實現的呢?本文將對這兩個問題進行一些分析,簡單解釋const的含義以及實現機制。簡單的說const在c語言中表示唯讀的變數,而在c 語言中表示常量。關於const在c與c 語言中的使用以及更多的區別,以後有時間另開一貼說明。那麼c...