久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

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

188次閱讀
沒有評論

共計(jì) 1868 個(gè)字符,預(yù)計(jì)需要花費(fèi) 5 分鐘才能閱讀完成。

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

StratoVirt 代碼分析功能

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 對象

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

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

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

生成設(shè)備樹

啟動虛擬機(jī)的 vCPU

啟動虛擬機(jī)主線程循環(huán)

上面簡述了虛擬機(jī)創(chuàng)建的 5 個(gè)步驟,下面就關(guān)鍵步驟進(jìn)行詳細(xì)分析:

LightMachine 對象構(gòu)建

這里簡單介紹一下 Rust 語言,Rust 是一門系統(tǒng)級語言,主要特性源自于 C 和 C ++,因此同樣可以對內(nèi)存有很高效的使用。它是強(qiáng)類型的語言,編譯器在編譯的時(shí)候會明確知道數(shù)據(jù)的具體類型,因此可以就類型的內(nèi)存操作是否合法做明確的判斷。因此其編譯的時(shí)候提供了嚴(yán)格的安全檢查,對于內(nèi)存使用非法的地方會導(dǎo)致編譯失敗。從而說它是一門相對安全的系統(tǒng)開發(fā)語言。

LightMachine 是對輕量級虛擬機(jī)對象的類封裝。new 函數(shù)相當(dāng)于類的構(gòu)造函數(shù),不過要顯示調(diào)用。

第一步是打開 /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)前是沒有內(nèi)存和 CPU 的。

第三步是創(chuàng)建虛擬機(jī)內(nèi)存。虛擬機(jī)內(nèi)存對象封裝在 AddressSpace 類中。

AddressSpace 的數(shù)據(jù)結(jié)構(gòu)有些復(fù)雜,首先其 root 對象會指向一個(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 對象中,保存在 subregions 中。

第五步是創(chuàng)建 cpu,這里調(diào)用 vm_fd.create_vcpu 來創(chuàng)建 vcpu 對象。實(shí)際底層封裝的是 ioctl(fd, KVM_CREATE_VCPU) 來通知 kvm 創(chuàng)建 vcpu 對象。

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

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

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

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

設(shè)備實(shí)現(xiàn)

會遍歷該虛擬機(jī)配置了哪些設(shè)備,然后調(diào)用該設(shè)備的具體 realize 函數(shù)。當(dāng)前只是實(shí)現(xiàn)了一個(gè) mmio 設(shè)備。

該設(shè)備的實(shí)現(xiàn)也比較簡單,在內(nèi)核中增加了命令行參數(shù)。

加載內(nèi)核

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

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

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

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

啟動虛擬機(jī)

依次遍歷之前創(chuàng)建的 vCPU。然后調(diào)用 CPU::start 去啟動該 CPU。start 主要做的就是創(chuàng)建了一個(gè)用戶空間線程,然后調(diào)用 cpu.set_task 將該線程放到 CPU 上去執(zhí)行。線程中包含一個(gè) loop,其中 cpu.kvm_vcpu_exec 處理 kvm 的返回。如 VcpuExit::IoIn, 這是經(jīng)過 rust 庫 kvm-ioctls 封裝過的的退出值。實(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è)具備簡單虛擬機(jī)功能的代碼框架,與 qemu 之間的差距主要存在于 qemu 幾乎可以模擬所有的主流設(shè)備。而 StratoVirt 當(dāng)前缺少的就是這部分的代碼。

關(guān)于“如何進(jìn)行 StratoVirt 代碼分析”就介紹到這了, 更多相關(guān)內(nèi)容可以搜索丸趣 TV 以前的文章,希望能夠幫助大家答疑解惑,請多多支持丸趣 TV 網(wǎng)站!

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-08-04發(fā)表,共計(jì)1868字。
轉(zhuǎn)載說明:除特殊說明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 佳木斯市| 苏尼特左旗| 筠连县| 子长县| 闽清县| 宜川县| 阜宁县| 嘉定区| 临泉县| 伊宁市| 通许县| 郁南县| 大埔县| 南涧| 海南省| 常州市| 南通市| 花垣县| 久治县| 资溪县| 怀来县| 象州县| 马边| 新野县| 伊春市| 阆中市| 进贤县| 江山市| 阿拉善盟| 南陵县| 新野县| 宁都县| 北碚区| 合阳县| 张家界市| 南平市| 巴东县| 当涂县| 广元市| 丹凤县| 临漳县|