您好,登錄后才能下訂單哦!
這篇文章主要為大家分析了如何進(jìn)行StratoVirt代碼分析的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì)易懂,操作細(xì)節(jié)合理,具有一定參考價(jià)值。如果感興趣的話,不妨跟著跟隨小編一起來(lái)看看,下面跟著小編一起深入學(xué)習(xí)“如何進(jìn)行StratoVirt代碼分析”的知識(shí)吧。
StraoVirt當(dāng)前的主要功能是能夠創(chuàng)建一個(gè)microVM。該虛擬機(jī)提供了一個(gè)沙箱功能,為在其上運(yùn)行的其他應(yīng)用提供了一層安全隔離。彌補(bǔ)了docker在安全性上的不足。
下圖是當(dāng)前StratoVirt的主流程。主要分為以下幾步:
根據(jù)命令行參數(shù)創(chuàng)建虛擬機(jī)配置
根據(jù)虛擬機(jī)配置創(chuàng)建LightMachine對(duì)象
根據(jù)虛擬機(jī)配置,實(shí)例化虛擬機(jī)
具體實(shí)例化虛擬機(jī)包含的各設(shè)備對(duì)象
加載虛擬機(jī)內(nèi)核
生成設(shè)備樹(shù)
啟動(dòng)虛擬機(jī)的vCPU
啟動(dòng)虛擬機(jī)主線程循環(huán)
上面簡(jiǎn)述了虛擬機(jī)創(chuàng)建的5個(gè)步驟,下面就關(guān)鍵步驟進(jìn)行詳細(xì)分析:
LightMachine對(duì)象構(gòu)建
這里簡(jiǎn)單介紹一下Rust語(yǔ)言,Rust是一門系統(tǒng)級(jí)語(yǔ)言,主要特性源自于C和C++,因此同樣可以對(duì)內(nèi)存有很高效的使用。它是強(qiáng)類型的語(yǔ)言,編譯器在編譯的時(shí)候會(huì)明確知道數(shù)據(jù)的具體類型,因此可以就類型的內(nèi)存操作是否合法做明確的判斷。因此其編譯的時(shí)候提供了嚴(yán)格的安全檢查,對(duì)于內(nèi)存使用非法的地方會(huì)導(dǎo)致編譯失敗。從而說(shuō)它是一門相對(duì)安全的系統(tǒng)開(kāi)發(fā)語(yǔ)言。
LightMachine是對(duì)輕量級(jí)虛擬機(jī)對(duì)象的類封裝。new函數(shù)相當(dāng)于類的構(gòu)造函數(shù),不過(guò)要顯示調(diào)用。
第一步是打開(kāi)/dev/kvm的設(shè)備描述符。
第二步是創(chuàng)建一個(gè)空的虛擬機(jī),kvm.create_vm()。這里實(shí)際封裝的是ioctl(fd, KVM_CREATE_VM, param)。調(diào)用kvm的API接口創(chuàng)建了一個(gè)空的虛擬機(jī)。該虛擬機(jī)當(dāng)前是沒(méi)有內(nèi)存和CPU的。
第三步是創(chuàng)建虛擬機(jī)內(nèi)存。虛擬機(jī)內(nèi)存對(duì)象封裝在AddressSpace類中。
AddressSpace的數(shù)據(jù)結(jié)構(gòu)有些復(fù)雜,首先其root對(duì)象會(huì)指向一個(gè)Region,初始創(chuàng)建的這個(gè)Region是region_container類型,用于管理后面添加的“虛擬內(nèi)存條”。
第四步是創(chuàng)建guest虛擬機(jī)使用的物理內(nèi)存。調(diào)用mmap映射一段內(nèi)存空間到虛擬機(jī)的進(jìn)程空間。sys_mem.root().add_subregion用于將映射的真實(shí)內(nèi)存region區(qū)域添加到上一步創(chuàng)建的AddressSpace對(duì)象中,保存在subregions中。
第五步是創(chuàng)建cpu,這里調(diào)用vm_fd.create_vcpu來(lái)創(chuàng)建vcpu對(duì)象。實(shí)際底層封裝的是ioctl(fd, KVM_CREATE_VCPU)來(lái)通知kvm創(chuàng)建vcpu對(duì)象。
第六步是創(chuàng)建了一個(gè)中斷控制設(shè)備。這里調(diào)用的是gic庫(kù)創(chuàng)建了一個(gè)V3的中斷控制器。
至此,虛擬機(jī)對(duì)象基本上已經(jīng)創(chuàng)建完成,包含虛擬機(jī)需要用到的vcpu和memory。
實(shí)例化虛擬機(jī)
該步驟主要是完成的是1. 設(shè)備的實(shí)現(xiàn) 2. 內(nèi)核加載 3. 設(shè)備樹(shù)生成
設(shè)備實(shí)現(xiàn)
會(huì)遍歷該虛擬機(jī)配置了哪些設(shè)備,然后調(diào)用該設(shè)備的具體realize函數(shù)。當(dāng)前只是實(shí)現(xiàn)了一個(gè)mmio設(shè)備。
該設(shè)備的實(shí)現(xiàn)也比較簡(jiǎn)單,在內(nèi)核中增加了命令行參數(shù)。
加載內(nèi)核
加載內(nèi)核主要實(shí)現(xiàn)的就是打開(kāi)內(nèi)核img文件,讀取鏡像文件數(shù)據(jù)到內(nèi)存中,并設(shè)置bootloader執(zhí)行的起始位置。
創(chuàng)建設(shè)備樹(shù)
創(chuàng)建設(shè)備主要依賴的是內(nèi)核C庫(kù)中設(shè)備樹(shù)創(chuàng)建接口。
啟動(dòng)虛擬機(jī)
依次遍歷之前創(chuàng)建的vCPU。然后調(diào)用CPU::start去啟動(dòng)該CPU。start主要做的就是創(chuàng)建了一個(gè)用戶空間線程,然后調(diào)用cpu.set_task將該線程放到CPU上去執(zhí)行。線程中包含一個(gè)loop,其中cpu.kvm_vcpu_exec處理kvm的返回。如VcpuExit::IoIn,這是經(jīng)過(guò)rust庫(kù)kvm-ioctls封裝過(guò)的的退出值。實(shí)際在kvm中定義的退出類型有很多。
在kvm-ioctls中有一個(gè)虛擬機(jī)的示例,代碼在100行以內(nèi),實(shí)現(xiàn)的主要功能就是類似于StratoVirt當(dāng)前的功能。StraoVirt所做的是在其上以面向?qū)ο蟮姆绞椒庋b了大量的類結(jié)構(gòu),以及總線設(shè)備模型,便于之后的設(shè)備模塊可以在總線上添加。當(dāng)前的StratoVirt還只是一個(gè)具備簡(jiǎn)單虛擬機(jī)功能的代碼框架,與qemu之間的差距主要存在于qemu幾乎可以模擬所有的主流設(shè)備。而StratoVirt當(dāng)前缺少的就是這部分的代碼。
關(guān)于“如何進(jìn)行StratoVirt代碼分析”就介紹到這了,更多相關(guān)內(nèi)容可以搜索億速云以前的文章,希望能夠幫助大家答疑解惑,請(qǐng)多多支持億速云網(wǎng)站!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。