如何进行StratoVirt代码分析

94次阅读
没有评论

共计 1868 个字符,预计需要花费 5 分钟才能阅读完成。

这篇文章主要为大家分析了如何进行 StratoVirt 代码分析的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随丸趣 TV 小编一起来看看,下面跟着丸趣 TV 小编一起深入学习“如何进行 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 库中设备树创建接口。

如何进行 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 代码分析”就介绍到这了, 更多相关内容可以搜索丸趣 TV 以前的文章,希望能够帮助大家答疑解惑,请多多支持丸趣 TV 网站!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-04发表,共计1868字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)