当前位置:首页 > 嵌入式培训 > 嵌入式学习 > 讲师博文 > 虚拟化嵌入式Linux

虚拟化嵌入式Linux 时间:2020-05-27      来源:原创

系统虚拟机可用于使基于Linux的应用程序更快,响应速度更快和更安全。这是入门的入门。

Linux正在迅速成为各种嵌入式应用程序中首选的操作系统,从移动电话和网络/电信基础设施应用程序到富媒体的消费电子设备(如便携式媒体播放器和数字视频系统)。

许多嵌入式系统开发人员已经在他们的设计中使用Linux或正在考虑这样做。开发人员认为,为Linux开发应用程序要比为专有操作系统开发要容易,并且使用Linux可以降低成本,因为它是开源的。

但是,Linux在嵌入式领域仍然存在许多问题。

首先,编程环境的本质常常是分叉的。例如,在许多媒体丰富的消费类应用程序中,Linux用于运行与个人计算机上使用的应用程序代码相似(通常相同)的高级应用程序代码。此类代码通常是由通常不是底层嵌入式系统编程专家的应用程序程序员开发的。

但是,此类应用程序具有许多实时功能,需要低且可预测的中断延迟。在移动电话终端的情况下,蜂窝通信子系统具有实时要求。尽管嵌入式Linux确实得到了改进,但小型高效的实时操作系统(RTOS)可以最好地满足这些要求。

第二是安全问题。例如,在移动电话手机中,通信堆栈至关重要。如果它遭到攻击者的破坏,则电话可能会变成干扰器,从而无法在整个单元中进行通信。同样,加密子系统也需要受到严格保护,以免受到损害。

创建一个运行数百万行代码的安全系统并不是微不足道的挑战。不可避免地,该代码包含数以万计的错误,其中许多错误可能会危害系统的安全性。嵌入式Linux实现越来越容易受到攻击,它们的大小足够大(数十万行代码),可以包含多达一千个bug。由于Linux操作系统通常在特权模式下运行,因此一旦受到威胁,便有可能对系统的任何部分进行攻击。

第三是许可证分离问题。Linux是经常部署的高级操作系统。它的优势包括免版税,独立于特定供应商,广泛部署以及强大而充满活力的开发者社区。

关于Linux的一个经常关注的问题是,它是根据GPL许可证发行的,这要求所有派生代码都受同一许可证的约束,因此必须成为开源代码。一些法律论据声称,许可证甚至适用于在运行时作为二进制文件加载到内核中的设备驱动程序。

对于认为设备接口有价值的专有IP的芯片制造商来说,这种限制会带来潜在的问题。开源设备驱动程序将有效地发布那些设备接口,这对于在许多嵌入式系统方案中使用Linux产生了极大的不利影响。

虚拟化可以拯救吗?

正如桌面应用程序开发人员的趋势一样,许多嵌入式系统开发人员正在寻求使用系统虚拟化环境(也称为系统虚拟机)来解决或至少最小化此类问题。

与特定于特定编程语言(例如Java VM)的进程虚拟机环境不同,系统虚拟机对应于实际硬件,并且可以独立于同一计算环境中的其他类似实例执行完整的操作系统。

本文将解释嵌入式系统虚拟机模型,并探讨在何处以及如何使用它们来使基于Linux的应用程序更快,响应速度更快和更安全。

虚拟

化的基础虚拟化 是指提供一种软件环境,程序(包括操作系统)可以在其中运行,就像在裸机上一样,如图1所示。这样的环境称为虚拟机。虚拟机是真实计算机的有效隔离副本。

提供虚拟机环境的软件层称为虚拟机监视器(VMM)或系统管理程序。VMM具有三个基本特征:

1.它为程序提供了与原始计算机基本相同的环境;

2.在这种环境下运行的程序在最坏的情况下显示速度会小幅下降;和

3. VMM完全控制系统资源。

这三个特征都很重要,它们有助于使虚拟化变得非常有用。第一个(相似性)确保在真实计算机上运行的软件将在虚拟机上运行。第二点(效率)从性能的角度确保虚拟化是可行的。

效率功能要求绝大多数指令直接由硬件执行:任何形式的仿真或解释都可以用基础硬件的多个指令代替单个虚拟机指令。

这就要求虚拟硬件与托管VMM的物理硬件几乎相同。可能会有细微的差异,例如物理硬件可能会错过虚拟硬件的某些指令(只要它们不被大量使用),内存管理单元可能不同或设备可能不同。

但是,并非所有指令都可以直接执行。资源控制功能要求所有处理资源的指令必须访问虚拟资源,而不是物理资源。这意味着VMM必须解释此类说明,否则会违反虚拟化。

具体来说,虚拟机必须解释两类指令:(1)对控制敏感的指令会 修改特权计算机的状态,从而干扰虚拟机管理程序对资源的控制;(2)行为敏感指令 访问(读取)特权机器状态。尽管这些指令无法更改资源分配,但它们会显示实际资源的状态,特别是当它们与虚拟资源不同时,从而打破了虚拟化所带来的错觉。

虚拟化

的好处虚拟化对嵌入式开发工程师的主要吸引力在于,它支持在同一硬件平台上同时存在和运行多个操作系统。

虚拟化通过在同一处理器内核上同时运行适当的操作系统来帮助克服分叉的编程环境所带来的挑战,如图2所示。通过将单独的内核与实时和应用软件堆栈结合使用,可以实现相同的效果。与用于分区内存的硬件机制。

在单个处理器内核上运行多个并发操作系统的能力可以减少物料清单,尤其是对于低端设备。对于产品系列(由使用多核的高端设备以及低端的单核设备组成),它还提供了统一的操作系统环境。

虚拟化也可以用来增强安全性。系统虚拟机封装了一个子系统,因此其故障不会干扰其他子系统(请注意,这种封装是出于上述资源控制要求而提供的)。

虚拟化的类型

有两种基本方法可以确保虚拟机中运行的代码不执行任何敏感指令:1)纯虚拟化,这取决于虚拟机无法执行敏感指令;2)半虚拟化,其中从虚拟机中删除敏感指令。

纯虚拟化

传统方法是纯虚拟化,它要求所有敏感指令都具有特权。特权指令可以在处理器的特权状态下执行(通常称为特权模式,内核模式或主管模式),但在非特权模式下(也称为用户模式)执行时会生成异常。如图3所示。异常在虚拟机管理程序的特定地址(异常处理程序)进入特权模式。然后,系统管理程序可以根据需要解释(“虚拟化”)指令以维护虚拟机状态。

直到最近,几乎所有当代架构都无法实现纯虚拟化,因为它们都具有敏感的指令,没有特权。最近,许多主要的处理器制造商(包括台式机领域的Intel和AMD以及嵌入式市场的ARM)增加了虚拟化扩展,这些扩展允许以强制所有敏感指令引起异常的方式配置处理器。

尽管如此,由于多种原因,这种虚拟化方法仍未普遍使用,尤其是在嵌入式应用程序中。一个是例外很昂贵。

在流水线处理器上,异常会耗尽流水线,导致处理延迟,通常每个流水线级一个周期。返回用户模式时通常会发生类似的延迟。此外,异常(和异常返回)是通常由处理器的分支预测单元无法预测的分支,从而导致额外的延迟。

在深度流水线化的高性能处理器中,这些效果通常最多会增加10至20个周期。再加上实际指令仿真所需的工作,我们可以看到虚拟化一条指令要花费数十个周期。一些处理器(特别是x86系列)的异常成本比这要高得多(数百个周期)。这为操作系统的代码创建了大量开销,该代码经常在短时间内执行许多特权指令。

准虚拟化

在这种方法中,可以手动修改源代码,以删除对特权状态的直接访问,而可以通过系统管理程序的显式调用(“ hypercalls”)来替换此类访问。

准虚拟化允许通过单个超级调用替换许多敏感指令,从而减少了非特权模式和特权模式之间(昂贵)的切换次数。

如果正确实施,准虚拟化可能会减少虚拟化开销。剑桥大学的VMWare和Xen部署了准虚拟化的变体已有数年之久,它们都针对企业市场。最近出现了针对嵌入式设计的虚拟化解决方案,例如新南威尔士大学的L4 / Wombat,商业系统Trango,VirtualLogix的VLX以及Open Kernel Labs的OK4。

在不同的环境中,每种方法都有其优点和缺点,但是大多数方法的共同点是,它们将另一层软件和复杂性引入了操作环境。在许多嵌入式应用程序中,代码大小通常需要数百万行代码,因此将其拆分为两个或三个虚拟机对于提高整体系统可靠性和安全性的作用有限。

当前的半虚拟化方法所提供的隔离本质上是粗粒度的,它为每个子系统提供了一台完整的计算机。这意味着每个虚拟机都需要运行其自己的操作系统,这使它们相对较重。

因此,为了减少子系统的粒度而增加虚拟机的数量将产生严重的性能问题并显着增加代码量。反过来,这不仅需要增加内存大小并因此增加功耗,而且还会导致更多的故障点。

使用微内核作为系统管理程序

在嵌入式设计中部署半虚拟化的最合适方法是将其集成到操作系统的结构中。但是正如Linus Torvalds最近评论的那样,将其集成到Linux中是不切实际的,因为没有一种适合所有使用Linux的应用程序的“一刀切”的“一个真正的虚拟化”模型。对于那些没有Linux的设备部署,这也无济于事(因为他们想提供高级操作系统的选择,或者可能是因为它们附带了没有高端操作系统的低端设备)。

随附的RTOS可以更好地实现集成的半虚拟化机制,该RTOS用于处理Linux无法执行的硬实时操作。这种方法不仅需要裸露的虚拟机管理程序:它需要一个可以提供基本操作系统机制的内核,例如高性能的基于消息的微内核,如图4所示。与Linux的传统的单片操作系统结构不同,它具有垂直的层结构,每个抽象层都位于下面,基于微内核的系统具有水平的结构。系统组件在应用程序代码旁边运行,并通过发送消息来调用。

微内核系统的一个显着特性是,就内核而言,“系统服务”和“应用程序”之间没有真正的区别-所有这些都是在用户模式下运行的进程。每个这样的用户级进程都封装在由内核设置的自己的硬件地址空间中。

运行在微内核上的子系统只能通过调用内核机制(尤其是IPC)来影响系统的其他部分(在其自身的地址空间之外)。如果它是通过系统调用映射到其地址空间中的,则它只能直接访问内存(或其他资源)。

该模型非常适合嵌入式系统,在该系统中,由于子系统交互的协作性质,“系统服务”和“应用程序”之间的区别常常变得毫无意义。

微内核提供的中央机制是称为IPC的消息传递通信机制。在水平系统结构中,IPC用于调用所有系统服务,以及在子系统之间提供其他通信。由于需要高带宽,低延迟的通信,微内核通常还提供用于在进程之间设置共享内存区域的机制。

在这种情况下,微内核提供了有效支持虚拟化的正确机制。微内核充当管理程序,可以捕获虚拟化陷阱。与其他虚拟化方法相反,微内核将异常转发到用户模式虚拟机监视器,后者可以执行仿真或发出故障信号。

IPC也是实现低开销虚拟化的推动力:由虚拟机中的来宾应用程序执行的系统调用陷阱会调用微内核的异常处理程序,该异常处理程序会将此事件转换为IPC消息并发送给来宾操作系统。来宾将其作为普通系统调用进行处理。系统调用结果通过另一个IPC消息返回给来宾应用程序,该消息将解除阻塞正在等待的来宾进程。

同样,IPC用于将中断传递到来宾操作系统的中断处理程序。它还用于与设备驱动程序进行通信,以及在系统的任何组件之间(包括虚拟机环境之间)进行通信和同步。

由于同一IPC机制用于许多不同的操作,因此通常对其进行高度优化。这无疑使虚拟化以及其他关键系统操作受益。由于精心设计的IPC机制也非常简单,因此实际上可以在所有方面对其进行优化。

实际应用程序

若要了解这种更细粒度的虚拟化方法如何影响嵌入式系统设计人员的工作,让我们看一看媒体播放器设计,该设计最初是在更传统的半虚拟化环境中托管的,以Linux作为客户操作系统。 。然后,将设计移植为在开放源代码下作为本机应用程序在其自己的地址空间中运行,但是该商业应用程序支持基于消息的OKL4虚拟化就绪的微内核。

然后,媒体播放器可以与Linux系统(仍支持其他应用程序)并排运行,也可以与在最小的受信任计算基础环境中运行的受信任加密服务并行运行。随着时间的流逝,可以从整体环境中提取更多组件,无论是高级操作系统还是运行通信堆栈的RTOS,都可以进入其自己的受保护隔室。

这包括设备驱动程序,网络堆栈,文件系统和其他功能组件。这种方法可以通过引入内部保护边界来显着提高系统的健壮性,这些内部保护边界包含由错误引起的损坏。

上一篇:自己动手嵌入式Linux开发工具

下一篇:C到硬件工具为嵌入式系统中的FPGA添加了软件为中心的路径

热点文章推荐
华清学员就业榜单
高薪学员经验分享
热点新闻推荐
前台专线:010-82525158 企业培训洽谈专线:010-82525379 院校合作洽谈专线:010-82525379 Copyright © 2004-2022 北京华清远见科技集团有限公司 版权所有 ,京ICP备16055225号-5京公海网安备11010802025203号

回到顶部