中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何進行StratoVirt代碼分析

發布時間:2022-01-12 16:39:01 來源:億速云 閱讀:246 作者:柒染 欄目:云計算

這篇文章主要為大家分析了如何進行StratoVirt代碼分析的相關知識點,內容詳細易懂,操作細節合理,具有一定參考價值。如果感興趣的話,不妨跟著跟隨小編一起來看看,下面跟著小編一起深入學習“如何進行StratoVirt代碼分析”的知識吧。

StratoVirt代碼分析

  1. 功能

StraoVirt當前的主要功能是能夠創建一個microVM。該虛擬機提供了一個沙箱功能,為在其上運行的其他應用提供了一層安全隔離。彌補了docker在安全性上的不足。

  1. 代碼解析

下圖是當前StratoVirt的主流程。主要分為以下幾步:

  1. 根據命令行參數創建虛擬機配置

  2. 根據虛擬機配置創建LightMachine對象

  3. 根據虛擬機配置,實例化虛擬機

    1. 具體實例化虛擬機包含的各設備對象

    2. 加載虛擬機內核

    3. 生成設備樹

  4. 啟動虛擬機的vCPU

  5. 啟動虛擬機主線程循環

如何進行StratoVirt代碼分析

上面簡述了虛擬機創建的5個步驟,下面就關鍵步驟進行詳細分析:

LightMachine對象構建

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

LightMachine是對輕量級虛擬機對象的類封裝。new函數相當于類的構造函數,不過要顯示調用。

第一步是打開/dev/kvm的設備描述符。

第二步是創建一個空的虛擬機,kvm.create_vm()。這里實際封裝的是ioctl(fd, KVM_CREATE_VM, param)。調用kvm的API接口創建了一個空的虛擬機。該虛擬機當前是沒有內存和CPU的。

第三步是創建虛擬機內存。虛擬機內存對象封裝在AddressSpace類中。

如何進行StratoVirt代碼分析

AddressSpace的數據結構有些復雜,首先其root對象會指向一個Region,初始創建的這個Region是region_container類型,用于管理后面添加的“虛擬內存條”。

如何進行StratoVirt代碼分析

第四步是創建guest虛擬機使用的物理內存。調用mmap映射一段內存空間到虛擬機的進程空間。sys_mem.root().add_subregion用于將映射的真實內存region區域添加到上一步創建的AddressSpace對象中,保存在subregions中。

如何進行StratoVirt代碼分析

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

如何進行StratoVirt代碼分析

第六步是創建了一個中斷控制設備。這里調用的是gic庫創建了一個V3的中斷控制器。

如何進行StratoVirt代碼分析

如何進行StratoVirt代碼分析

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

實例化虛擬機

該步驟主要是完成的是1. 設備的實現 2. 內核加載 3. 設備樹生成

  1. 設備實現

會遍歷該虛擬機配置了哪些設備,然后調用該設備的具體realize函數。當前只是實現了一個mmio設備。

該設備的實現也比較簡單,在內核中增加了命令行參數。

如何進行StratoVirt代碼分析

  1. 加載內核

加載內核主要實現的就是打開內核img文件,讀取鏡像文件數據到內存中,并設置bootloader執行的起始位置。

如何進行StratoVirt代碼分析

  1. 創建設備樹

創建設備主要依賴的是內核C庫中設備樹創建接口。

如何進行StratoVirt代碼分析

如何進行StratoVirt代碼分析

啟動虛擬機

依次遍歷之前創建的vCPU。然后調用CPU::start去啟動該CPU。start主要做的就是創建了一個用戶空間線程,然后調用cpu.set_task將該線程放到CPU上去執行。線程中包含一個loop,其中cpu.kvm_vcpu_exec處理kvm的返回。如VcpuExit::IoIn,這是經過rust庫kvm-ioctls封裝過的的退出值。實際在kvm中定義的退出類型有很多。

如何進行StratoVirt代碼分析

如何進行StratoVirt代碼分析

如何進行StratoVirt代碼分析

如何進行StratoVirt代碼分析

在kvm-ioctls中有一個虛擬機的示例,代碼在100行以內,實現的主要功能就是類似于StratoVirt當前的功能。StraoVirt所做的是在其上以面向對象的方式封裝了大量的類結構,以及總線設備模型,便于之后的設備模塊可以在總線上添加。當前的StratoVirt還只是一個具備簡單虛擬機功能的代碼框架,與qemu之間的差距主要存在于qemu幾乎可以模擬所有的主流設備。而StratoVirt當前缺少的就是這部分的代碼。

關于“如何進行StratoVirt代碼分析”就介紹到這了,更多相關內容可以搜索億速云以前的文章,希望能夠幫助大家答疑解惑,請多多支持億速云網站!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

永平县| 弥勒县| 信丰县| 北碚区| 蓝田县| 措勤县| 宝兴县| 铜陵市| 鸡泽县| 饶平县| 陵川县| 理塘县| 虹口区| 鲁甸县| 连江县| 宜州市| 青河县| 宜春市| 兴山县| 龙门县| 保靖县| 长沙市| 边坝县| 萨迦县| 蓝田县| 株洲县| 惠东县| 宁远县| 张家港市| 光泽县| 繁昌县| 胶南市| 莲花县| 张家川| 仲巴县| 刚察县| 化州市| 清原| 武穴市| 乌拉特前旗| 清苑县|