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