十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
这篇文章主要为大家分析了如何进行StratoVirt代码分析的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“如何进行StratoVirt代码分析”的知识吧。
创新互联建站于2013年开始,先为德保等服务建站,德保等地企业,进行企业商务咨询服务。为德保企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
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代码分析”就介绍到这了,更多相关内容可以搜索创新互联以前的文章,希望能够帮助大家答疑解惑,请多多支持创新互联网站!