如何利用虚拟化技术解决物联网开发难题?从了解ACRN开始(上 )

物联网市场的应用场景日益复杂,越来越多的上网设备需要支持更多的硬件资源、操作系统、软件工具及应用程序,现有的解决方案显然无法为数量庞大的物联网设备提供相应的灵活性,这使开发者们面临巨大的设计压力。虚拟化技术是解决这些问题的关键。不过,现有的虚拟化解决方案并不能满足物联网开发的轻量级和灵活性的特殊要求。为了满足当前物联网市场的发展趋势,linux基金会推出了开源项目---acrn,
acrn到底具有哪些强大的功能,它又是怎么实现的?今天我们就从架构到应用对acrn进行详细分析,让开发者们快速上手使用acrn进行产品设计。
acrn是一个专为嵌入式设备设计的hypervisor,包括如下两部分:一套hypervisor的参考软件和架构,通过虚拟机监视器(virtualmachinemanager)可以在同一个物理硬件上安全地同时运行多个操作系统。另外,它还为设备虚拟化模拟定义了一套参考设计框架,称为“acrn设备模型”。
acrnhypervisor是一个type-i的hypervisor,可以直接运行在物理硬件上,适用于各种物联网和嵌入式设备解决方案。acrnhypervisor解决了当前数据中心hypervisor和partitioninghypervisor之间存在的差距。acrnhypervisor设计时把系统分为不同的功能域,并为物联网和嵌入式设备精心挑选的用户操作系统进行共享优化。
汽车应用案例
acrnhypervisor的一个有趣的案例是用于汽车场景。acrnhypervisor可以用于构建软件定义驾驶舱(sdc)或者车载娱乐系统(ive)。作为参考实现,acrn可以为嵌入式hypervisor厂商的解决方案提供一个很好的基础,以及一套i/o设备虚拟化的参考设计。
在这种场景下,汽车sdc系统由仪表盘(ic)系统、车载信息娱乐系统(ivi)和一个或多个后座娱乐系统(rse)组成。为了整体系统安全性考虑,每个系统都作为独立的虚拟机运行。
仪表盘系统(ic)用于显示和驾驶员相关的车辆的驾驶操作信息,如:
•汽车的速度、燃油、行驶里程和其它驾驶信息;
•投影在挡风玻璃上的抬头显示,用以警告缺油或胎压报警;
•显示后视摄像头影像和车身的周边摄像头信息,用于辅助停车;
车载娱乐系统(ivi)的功能包括:
•导航系统、收音机和其它娱乐系统;
•连接到移动设备,可以打电话,播放音乐或者通过语音识别来控制应用程序;
•通过手势识别或触控进行交互;
后座娱乐系统(rse)可以运行:
•娱乐系统;
•虚拟办公;
•连接到前排座椅的ivi系统和移动设备(云连接);
•连接到移动设备,可以打电话,播放音乐或者通过语音识别来控制应用程序;
•通过手势识别或触控进行交互;
acrnhypervisor可以支持linux*和android*虚拟机作为用户操作系统(uos),uos由acrnhypervisor进行管理。开发者和oem厂商可以在acrnhypervisor之上运行自己的虚拟机,以及ic、ivi和rsevm。serviceos是作为vm0运行(在xen*hypervisor中被称为dom0,在kvm*hypervisor中被称为hostos),useros用户操作系统作为vm1运行(也被称为domu)。
注:android*虚拟机的支持将在未来版本发布。
图1显示了一个使用acrnhypervisor的实例框图。
图1:sos和uos运行在acrnhypervisor之上
从acrnhypervisor的架构图中可以看到:
•acrnhypervisor直接位于bootloader之上,因而具备快速启动的能力;
•部分资源进行partitioning,以确保安全关键性应用和非安全关键业务可以共存在同一平台上;
•丰富的i/o设备虚拟化提供在多个vm之间的i/o设备共享,从而提供全面的用户体验;
•通过高效的虚拟化,一个soc可以支持多个操作系统同时运行;
图1中的黄色部分是acrn项目的软件栈。该架构框图中列出的某些功能还没有完全实现,欢迎社区共同参与开发实现。另外,图中的其他模块来自于别的开源项目,这里仅供参考。
例如,serviceos和guestlinux来源于https://clearlinux.org上的clearlinux项目,而未来guestandroid的支持将会来自https://01.org/android-ia项目。
当前acrn所支持的功能列表,请参照发布说明。
许可证
acrnhypervisor和acrndevicemodel软件采用的都是自由许可证的bsd-3-clause,它允许以“源代码和二进制再次发布和使用,无论是否进行了修改”,许可证中也注明了完整版权声明和免责声明。
acrndevicemodel,serviceos,anduseros
为了使acrnhypervisor代码尽可能精悍且高效,用于实现i/o设备共享的devicemodel代码运行在serviceos中而非acrnhypervisor。哪些i/o设备被共享以及其实现细节将在下面的pass-through章节具体介绍。
serviceos在所有虚拟机里,以最高优先权运行,以满足那些对时间响应要求很高的需求和系统服务质量的需求(qos)。具体到serviceos中的任务(task),他们的优先级则有高有低。例如响应useros请求的回调函数,其运行在serviceos的软件(或者mediator)就会继承useros的优先级。另外,在serviceos中还有一些在后台运行的任务也是低优先级。
在上述的车载系统示例中,useros是驾驶控制和车内娱乐的中心枢纽。它能提供收音机和各种娱乐选项、车内空调和通风控制、车辆导航显示等支持。它可以让第三方设备使用usb、蓝牙或者wifi等连接技术与车载系统进行交互,例如:androidauto*或者applecarplay*,还能提供许多其它功能。
启动步骤
在图2中,我们展示了在一个采用英特尔架构平台的nuc上使用uefi验证启动的步骤。
figure2acrnhypervisorbootflow
启动引导顺序执行如下:
1uefi验证和启动acrnhypervisor和serviceos的引导加载程序;
2ufei(或serviceos的引导加载程序)验证并启动serviceos内核;
3serviceos的内核通过dm-verity验证并且加载acrndevicemodel和虚拟引导加载程序;
4虚拟引导加载程序启动用户端的验证启动进程;
acrnhypervisor架构
acrnhypervisor是type1的虚拟机管理程序,能够直接运行在硬件系统上。它是一个混合的vmm架构,采用一个运行在特权级的serviceos来管理和协调i/o设备的使用。它能支持多个用户虚拟机,其中每个虚拟机都可以运行linux或者安卓操作系统作为用户操作系统。
在虚拟机内运行的操作系统是与其它虚拟机内的系统或应用程序相互隔离的,从而缩小了潜在的被攻击可能性,最大限度地减小安全隐患。当然由于系统运行在虚拟机内也可能会给其应用程序的运行带来额外的延迟。
图3显示了acrnhypervisor、车载系统中的instrumentalcluster(ic)vm和servicevm一起协同工作的架构图。serviceos(sos)负责包括平台设备在内的大部分设备的管理,并提供i/o的协调功能。某些pcie设备可以通过vm配置直通给useros使用。ic应用程序和虚拟机特定的应用程序都运行在sos中,例如:acrndevicemodel和acrnvm管理器。
acrnhypervisor内还有acrn虚机管理器,用来收集useros的运行信息,并控制用户虚拟机的开始、停止和暂停,还能暂停或者恢复执行单个虚拟cpu。
图3acrnhypervisor架构图
acrnhypervisor采用了英特尔虚拟化技术(intelvt),其运行在虚拟机扩展模式(vmx)的root模式下,也称为主机模式或vmm模式。其他所有的用户虚拟机包括uos和sos都运行在vmxnon-root模式或guest模式下。(以下为了简略,我们将继续使用术语vmm模式和guest模式)。
vmm模式下有4种权限的ring模式,但acrnhypervisor仅在ring0的特权模式下运行,其余ring1-3并未使用。运行在guest模式下的用户系统(包括sos和uos)也有自己的4个ring模式(ring0-3)。用户系统的内核运行在guest模式下的ring0,而用户系统的应用程序则在guest模式下运行于ring3(ring1和ring2一般不被商业操作系统所使用)。
图4vmx简介
如图4所示,vmm模式和guest模式通过vmexit和vmentry进行切换。当引导加载程序将控制权交给acrnhypervisor时,处理器还未启动vmx模式。acrnhypervisor首先需要通过vmxon指令启用vmx模式。启用vmx后,处理器处于vmm模式,它可以通过vmresume指令进入guest模式(或者通过第一次vmlaunch指令),然后可以通过处理器的vmexit事件回到vmm模式。一般处理器会在响应某些指令和事件时发生vmexit。
在guest模式下,处理器的执行是由一个虚拟机控制结构(vmcs)所控制的。vmcs包含了虚机状态(在vmentry时加载并在vmexit时保存),主机状态(在vmexit时加载),以及虚机的控制执行。acrnhypervisor为每个虚拟cpu创建了一个vmcs数据结构,并使用该vmcs来控制运行在guest模式下处理器的行为。
当虚机执行到一个敏感指令时,就会触发一次定义在vmcs配置中的vmexit事件。当vmexit发生后,系统的控制权就交给了acrnhypervisor。acrnhypervisor会模拟虚机的指令(如果vmexit的原因是由于指令权限问题),然后恢复虚机继续执行它的下一条指令,或者根据vmexit的原因进行相关处理(例如,一个虚机的存储页面需要建立映射关系),然后恢复虚机重新执行该条指令。
需要注意的是用于vmm模式的地址空间和用于guest模式的地址空间是不同的。guest模式和vmm模式下使用不同的内存映射表,因此虚机是无法访问acrnhypervisor的。acrnhypervisor使用ept来映射虚机地址,虚机页表会将虚机的线性地址映射到虚机的物理地址,ept表则将虚机的物理地址映射到机器物理地址或主机物理地址(hpa)。
acrndevicemodelarchitecture
因为系统设备可能需要在不同的虚机之间被共享,虚机内应用程序(和操作系统)要对这些共享设备进行访问就需要借助设备模拟。一般来说,设备模拟有三种架构:
·第一种架构被称为hypervisor中的设备模拟,这是在vmware*工作站产品(一个基于操作系统的hypervisor)中实现的设备模拟方式。在这种方式中,hypervisor负责模拟需要在各个虚机操作系统之间共享的常见设备,其中包括:虚拟磁盘、虚拟网络适配器和其它必要的平台资源。
·第二种架构称为用户空间的设备模拟。顾名思义,不是将设备模拟的实现嵌入到hypervisor中,而是将其放在一个用户空间的应用程序中实现。比如被各种独立的hypervisor所使用的qemu就提供了此类的设备模拟方式。这种架构的优势在于设备模拟的实现不依赖于hypervisor,所以其它hypervisor可以重用改实现。甚至它还可以做任意设备的模拟,而不必担心其功能的实现会影响hypervisor(其在特权模式下运行)。
·第三种架构则是从基于hypervisor的设备模拟改变而来的半虚拟化驱动程序。该架构一开始是在xen项目中引入的,其中hypervisor提供物理设备驱动,每个虚机操作系统则需要安装一个与能与物理驱动配合使用的hypervisor感知的驱动程序。
在以上讨论的设备模拟架构中,共享设备都需要付出代价。因为不管设备模拟是在hypervisor中,还是在每个虚机内的用户空间中,都存在相应的系统开销。不过只要系统设备需要被多个虚机操作系统共享,这种开销就是值得的。反之如果设备不需要被共享,那么就可以使用更有效的方法来访问设备,例如使用“直通”。
看完以上的分析,你是否对acrn有了更深入的了解?也是否有更多问题急需解答?不用着急,我们将在下期中继续讲解各种技术细节,例如acrn设备模块架构、设备passthrough,acrni/omediator,virtio框架结构等一一为你展示。