文章目录
- 1. Abstract
- 2. Introduction
- 3. Architecture
- 4. Jailhouse Multicopter Platform
- 5. Requirements on Partitioning Hardware
- 5.1 Memory-Mapped I/O
- 5.2 Indivisible Hardware Resources
- 5.3 Erroneous Hardware Behaviour
- 6. Conclusion
本论文集涵盖了 2018 年 11 月 29 日在德国齐陶和 2019 年 4 月 4 日在意大利米兰举行的第一届和第二届欧洲数字化转型进展会议 (EADTC)。EADTC 是一个国际性和跨学科会议,涵盖欧洲工业和社会数字化转型背景下的研究与开发,重点关注半导体行业,代表欧洲研究项目“集成开发 4.0 (iDev40)”的成果。A Novel Software Architecture for Mixed Criticality Systems(2020) 是论文集中的一篇文章。
1. Abstract
多核 CPU 的出现形成了将安全关键系统和非关键系统结合在单一硬件平台的趋势,本文提出了一种新的基于 Linux 的混合关键系统架构,能够将关键和非关键部分整合到单个硬件平台上,CPU 虚拟化扩展支持通过直接分配资源实现严格的静态分区,能够启动额外的操作系统并行运行,Hypervisor 的核心是 Jailhouse,能够确保创建的域可以服务于不同关键性的工作负载,并且不会对域内的工作造成干扰,同时保留了 Linux 在非关键部分运行时的丰富功能,安全性和实时关键应用程序在关键域中运行。本文提出的架构较为简单,这是可靠性和认证工作的先决条件。
2. Introduction
安全关键系统的软件需要严格的认证,非关键部分不得干扰关键部分,软件的可靠性至关重要,而以代码行 (LoC) 衡量的软件大小是认证工作的考量因素。让 Linux 这样包含数百万行代码的内核通过安全认证是一项挑战性的任务,但是又不能为了通过安全认证而抛弃 Linux 的功能,本文提供了一种新颖的架构方法 —— Jailhouse,能够同时满足关键部分的安全性、实时性和非关键部分的功能丰富性这两个目标。
Jailhouse 通过向系统和 I/O 总线插入虚拟屏障,将对称多处理 (SMP) 系统转换为非对称多处理 (AMP) 系统。从硬件的角度来看,系统总线仍然是共享的,而软件只允许访问其范围内的资源。Jailhouse 需要由启动的 Linux 引导(参见图),控制系统配置文件中描述的所有硬件资源,将它们重新分配回 Linux 并将 Linux 提升到虚拟机 (VM) 的状态。Jailhouse 的管理程序核心充当虚拟机监视器 (VMM)。Jailhouse 不适合虚拟机管理程序的一般分类,它可以看作是 Type-1 和 Type-2 虚拟机管理程序的混合:它是一个裸机虚拟机管理程序,能够在没有底层系统的硬件平台上直接运行,但需要 Linux 在全局控制整个系统之前初始化硬件。
与其他实时分区方法不同,例如基于 Hypervisor 的 XtratuM 分区嵌入式架构或 PikeOS 微内核的 PikeOS Evolution。Jailhouse 只支持直接硬件访问,Jailhouse 没有使用复杂且耗时的(半)虚拟化技术模拟设备驱动程序,而是仅出于隔离目的使用虚拟化扩展,既不提供调度程序也不提供虚拟 CPU。它是一个信号箱,用于将硬件设备直接路由到隔离域,称为“单元”,仅对硬件平台必不可少且无法在硬件中进行分区的资源进行虚拟化。
为了创建新的隔离域,Jailhouse 从 Linux(也称为根单元)中删除硬件资源,并将它们重新分配给隔离域,称为非根单元。虚拟化扩展 ARM 架构参考手册安全虚拟机架构参考手册英特尔虚拟化技术保证严格隔离:任何访问违规,例如禁止访问某些内存区域,唤醒(陷阱正式要求可虚拟化的第三代架构)管理程序,将导致管理程序停止执行,Guest 执行的某些指令会导致陷阱并且必须由 Jailhouse 管理程序处理。
由于 Jailhouse 会重新映射和重新分配资源,因此在理想条件下设置和启动所有单元后,管理程序将不会激活,以下情况需要管理程序干预:
• 单元管理(例如,创建、启动、停止或销毁单元)
• 访问冲突(内存、I/O 端口)
• 拦截非硬件可虚拟化资源(例如,ARM 通用中断控制器的一部分)
• 捕获某些 CPU 指令(例如 x86 cpuid)
在常见的裸机管理程序上,中断由管理程序分派并重新注入 Guest。在 Intel x86 上,我们利用中断重映射支持,直接将硬件中断映射到域(单元)而不是由管理程序重新分发:中断直接到达分配的域(单元),这导致较低的中断到达时间和中断延迟,这对于具有硬实时要求的设备是有利的。
通过这种方式,经过安全认证的操作系统或裸机应用程序可以在与 Linux 并行的单个多核系统上运行,Jailhouse 的极简方法导致核心部分只需几千行代码,这简化了任何认证过程。
3. Architecture
要激活管理程序(参见图),在将虚拟机管理程序二进制文件加载到此内存区域内的目标位置后,每个 CPU 都会输入虚拟机管理程序启动代码并初始化 VMM。
初始化管理程序后,可以创建非根单元。非根单元至少由一个 CPU 和一定数量的内存组成,这些内存可以由根单元预加载辅助操作系统。Linux 关闭选定的 CPU 并调用 Hypervisor 通过提供单元配置来创建新单元。VMM 通过从根单元中删除资源并将它们重新分配给新创建的域来创建这个新的隔离域。其他资源,如 PCI 设备、内存映射设备或 I/O 端口,可以专门分配给一个单元。单元启动后,它可以拒绝任何进一步修改其状态的尝试。这确保了对关键域的无意修改。
一般来说,Jailhouse 允许 Guest 与根单元共享物理页面,除了启用单元间通信之外,该机制还允许共享内存映射的 I/O 页面。 如果需要,这允许我们从多个域内访问硬件资源,然而,这种并发访问不是由 Jailhouse 仲裁的,需要由 Guest 适当地解决。
图显示了三个单元的可能分区系统布局:Linux 根单元、一个附加的 Linux 非根单元和一个裸机实时操作系统。单元之间的通信是通过两个单元之间共享的内存区域以及信号接口来实现的,这确保了最小的代码占用空间。 Jailhouse 不模拟任何驱动程序功能,但设备驱动程序可以,例如,使用这些方法在两个单元之间建立虚拟的高性能以太网连接,根据硬件支持,信令是通过消息信号中断 (MSI-X) 或传统中断基于虚拟 PCI 设备实现的,在没有 PCI 支持的系统上,Jailhouse 模拟一个通用且简单的 PCI 主机控制器。
Jailhouse 目前支持 64 位 x86(Intel 和 AMD)、ARMv7 和 ARMv8 架构。几个操作系统已经成功移植为 Jailhouse Guest 运行。Linux 可以在所有受支持的架构上充当 Guest,根文件系统在内存中作为初始 ramdisk 提供,让我们注意到,我们以有限的努力成功地将 RTEMS 实时操作系统移植到了 ARM 架构,此外,已经存在一个 FreeRTOS 端口。
4. Jailhouse Multicopter Platform
为了证明 Jailhouse 对工业用例的适用性,本文实现了一个功能齐全的多旋翼平台用于演示。我们之所以选择这个平台,是因为它的要求类似于出现的工业设备,例如,在半导体制造中或需要执行机器和人类之间的协作任务时:飞行堆栈,系统的高度可靠和安全关键部分,负责平衡和导航飞机。传感器值必须以高数据速率进行采样、处理并最终用于控制转子。控制回路由不同的飞行模式控制,例如手动模式、稳定模式或位置保持等自动模式。对于安全可靠的任务,控制回路必须做出确定性响应。系统崩溃可能会导致真正的崩溃并带来严重后果。
这显然需要一个具有实时能力的操作系统。我们将整个关键飞行堆栈移植到 Jailhouse cell 中,而非关键任务仍然受益于 Linux 生态系统,并且不会以不可接受的方式干扰飞行堆栈,剩余的单元可以服务于任何非关键的有效载荷,例如与地面站的通信或摄像机跟踪。
在关键域中,执行第二个定制的极简 Linux 操作系统,该操作系统具有 RT_Patch 实时内核扩展的 PREEMPT_RT Internals。作为飞行堆栈,我们选择了 Ardupilot 项目,不需要修改(除了板支持和缺少硬件驱动程序),这强调了现有的应用程序可以毫不费力地部署在 Jailhouse 中。
为了控制多旋翼平台,多个传感器和执行器连接到不同的板间总线和外围设备:陀螺仪、罗盘、GPS、RC 控制接收器和电机控制形成控制电路,这需要从关键单元访问 SPI、I2C、UART 和 GPIO 硬件设备,分区系统的简化架构概述如图所示。
作为硬件平台,我们选择了带有虚拟化扩展的四核 CortexA15 ARMv7 CPU 的 NVIDIA Jetson TK15,TK1 连接到 Emlid Navio26 传感器护罩。系统分为两部分:两个核心分配给非关键部分,另外两个分配给关键部分。
我们从根单元中删除控制平台所需的资源,并将它们重新分配给关键域。飞行堆栈始终控制机器,即使非关键单元行为不端。非关键单元的崩溃不会导致关键设备崩溃。该架构的运行充分证明了 Jailhouse 适用于实施在很大程度上基于现有组件的实时安全关键系统。
5. Requirements on Partitioning Hardware
尽管我们的方法在现实世界中具有实用性,但我们发现了由硬件设计造成的不足,虽然这些不足都可以在软件中解决,但这些问题应该由硬件制造商在未来解决,以便为混合关键性系统提供最佳的基础组件。
5.1 Memory-Mapped I/O
通常通过读取或写入专用物理内存地址来访问外围设备,这些地址由特定设备的寄存器支持,几乎所有现代架构的典型页面大小都是 4 KiB 或更大,代表了可以分配给单元的最精细的内存粒度,无需管理程序介入。
虽然 32 位或更多位的物理地址提供了足够的空间来将不同的设备放置在不同的页面上,但硬件制造商经常将多个设备放置在一个页面上,甚至是不同类型的设备。
这对于硬件分区是有问题的,因为只有整个内存页面可以分配给一个单元,而不需要在内存访问时进行捕获和分派,Jailhouse 实现了分页,这是一种管理程序允许将内存区域映射到小于页面大小的客户机的技术,当为某个内存区域启用子页面时,Jailhouse 将捕获对该页面的任何访问,并允许访问或由于访问冲突而使单元崩溃。这会导致明显的和不希望的性能损失。
5.2 Indivisible Hardware Resources
将不同的设备放在不同的物理内存页面上并不总是足以进行硬件分区:单个设备的功能可能需要在两个单元中。多个单元中所需的典型设备是 DMA 控制器、系统时钟和复位控制器或 GPIO 设备。Jailhouse 支持物理内存页面的共享,但它既不适度访问也不了解底层硬件访问协议:Jailhouse 不会确保参数不被其他单元覆盖。
大多数设备在没有 DMA 传输的情况下提供完整的功能,在实时环境中,I/O 响应时间比 I/O 吞吐量更重要,DMA 控制器应该专门分配给单个单元,或者尽可能不使用,来自不同单元的共享 DMA 访问需要可分区的 DMA 控制器。
GPIO 设备也应该专门分配给单个单元,只要它们不可分区,就必须由管理程序分派访问。
一种基于软件的解决方案是对所有设备进行初始化,然后禁止对时钟和复位控制器的任何进一步访问。虽然这个解决方案实际上是直截了当的,但许多现有驱动程序假设时钟和复位控制器始终存在,并且在运行时(取消)断言复位。其他设备驱动程序,如 SPI、UART 或 I2C 驱动程序需要在运行时更改它们的速度或波特率,这也需要它们访问时钟和重置控制器。
只要所有设备的时钟和复位寄存器都绑定到一个公共时钟和复位控制器设备,就不可能在没有半虚拟化或在管理程序中分派的情况下对它们进行分区。这种解决方案对于实际目的是有效的,因为与设备的常规访问相比,时钟和复位控制器通常很少被访问。缺点是时钟和复位控制器的多样性及其不同的协议。
即使允许共享访问时钟和复位控制器,现有时钟驱动程序代码通常不准备在分区硬件上运行:可用资源通常在驱动程序代码中硬编码,并且时钟驱动程序通常在启动期间重置或禁用所有现有系统时钟。
5.3 Erroneous Hardware Behaviour
在我们的演示平台实施过程中,我们观察到使用非门控时钟访问设备的寄存器会导致整个系统立即冻结。这种不当行为发生在直到 tegra186 的所有基于 Tegra 的平台中,并且是由硬件设计中的缺陷引起的。这个问题可以在软件中解决,方法是在受影响的内存区域的时钟被解锁时捕获,以保证系统其余部分的稳定性。
6. Conclusion
分区管理程序技术很有前景,可用于混合关键性场景。通过使用标准操作系统,我们最大限度地减少了移植现有遗留有效负载应用程序所需的工作量,极简的虚拟机管理程序核心简化了认证工作。
我们成功地展示了硬件分区的可用性,然而,硬件制造商需要根据硬件可以分区的需求来改变设计方面,任何基于软件的变通方法都会导致更可预防的管理程序代码和更多的管理程序逻辑。
这种需求要求软件工程师和硬件制造商加强对硬件-软件协同设计的关注,特别是在构建混合关键性系统时,这将在许多制造领域变得越来越重要。