溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何進(jìn)行StratoVirt代碼分析

發(fā)布時(shí)間:2022-01-12 16:39:01 來(lái)源:億速云 閱讀:246 作者:柒染 欄目:云計(jì)算

這篇文章主要為大家分析了如何進(jìn)行StratoVirt代碼分析的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì)易懂,操作細(xì)節(jié)合理,具有一定參考價(jià)值。如果感興趣的話,不妨跟著跟隨小編一起來(lái)看看,下面跟著小編一起深入學(xué)習(xí)“如何進(jìn)行StratoVirt代碼分析”的知識(shí)吧。

StratoVirt代碼分析

  1. 功能

StraoVirt當(dāng)前的主要功能是能夠創(chuàng)建一個(gè)microVM。該虛擬機(jī)提供了一個(gè)沙箱功能,為在其上運(yùn)行的其他應(yīng)用提供了一層安全隔離。彌補(bǔ)了docker在安全性上的不足。

  1. 代碼解析

下圖是當(dāng)前StratoVirt的主流程。主要分為以下幾步:

  1. 根據(jù)命令行參數(shù)創(chuàng)建虛擬機(jī)配置

  2. 根據(jù)虛擬機(jī)配置創(chuàng)建LightMachine對(duì)象

  3. 根據(jù)虛擬機(jī)配置,實(shí)例化虛擬機(jī)

    1. 具體實(shí)例化虛擬機(jī)包含的各設(shè)備對(duì)象

    2. 加載虛擬機(jī)內(nèi)核

    3. 生成設(shè)備樹(shù)

  4. 啟動(dòng)虛擬機(jī)的vCPU

  5. 啟動(dòng)虛擬機(jī)主線程循環(huán)

如何進(jìn)行StratoVirt代碼分析

上面簡(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類中。

如何進(jìn)行StratoVirt代碼分析

AddressSpace的數(shù)據(jù)結(jié)構(gòu)有些復(fù)雜,首先其root對(duì)象會(huì)指向一個(gè)Region,初始創(chuàng)建的這個(gè)Region是region_container類型,用于管理后面添加的“虛擬內(nèi)存條”。

如何進(jìn)行StratoVirt代碼分析

第四步是創(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中。

如何進(jìn)行StratoVirt代碼分析

第五步是創(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ì)象。

如何進(jìn)行StratoVirt代碼分析

第六步是創(chuàng)建了一個(gè)中斷控制設(shè)備。這里調(diào)用的是gic庫(kù)創(chuàng)建了一個(gè)V3的中斷控制器。

如何進(jìn)行StratoVirt代碼分析

如何進(jìn)行StratoVirt代碼分析

至此,虛擬機(jī)對(duì)象基本上已經(jīng)創(chuàng)建完成,包含虛擬機(jī)需要用到的vcpu和memory。

實(shí)例化虛擬機(jī)

該步驟主要是完成的是1. 設(shè)備的實(shí)現(xiàn) 2. 內(nèi)核加載 3. 設(shè)備樹(shù)生成

  1. 設(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ù)。

如何進(jìn)行StratoVirt代碼分析

  1. 加載內(nèi)核

加載內(nèi)核主要實(shí)現(xiàn)的就是打開(kāi)內(nèi)核img文件,讀取鏡像文件數(shù)據(jù)到內(nèi)存中,并設(shè)置bootloader執(zhí)行的起始位置。

如何進(jìn)行StratoVirt代碼分析

  1. 創(chuàng)建設(shè)備樹(shù)

創(chuàng)建設(shè)備主要依賴的是內(nèi)核C庫(kù)中設(shè)備樹(shù)創(chuàng)建接口。

如何進(jìn)行StratoVirt代碼分析

如何進(jìn)行StratoVirt代碼分析

啟動(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中定義的退出類型有很多。

如何進(jìn)行StratoVirt代碼分析

如何進(jìn)行StratoVirt代碼分析

如何進(jìn)行StratoVirt代碼分析

如何進(jìn)行StratoVirt代碼分析

在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)站!

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI