https://lwn.net/Articles/774217/ 12.13.2018
Linux内核通常认为不适合安全关键系统,从未被设计提供实时响应功能。安全关键系统通常通过部署混合运行不同操作系统的独立计算机来解决,能够支持混合任务,一些对于安全至关重要,另一些不是。独立计算机上运行不同操作系统的工作目前主要集中在汽车系统上。在汽车系统上,具有非关键任务(用户交互和显示多媒体)和关键任务(自动驾驶和发动机控制),这些任务可以(并且经常)由运行不同操作系统的独立计算机来处理。
过去,将关键任务和非关键任务在同一系统上实现的有RTLinux、RTAI、Xenomai等双内核方法。如今,PREEMPT-RT补丁受到了广泛关注,即使有人说它仅仅具备”软实时“。
所有这些系统的问题是在安全关键的设计中是否具有认证,这对于像Linux这样大的内核来说很难(不是不可能)。此外,法律法规无论如何都可以阻止该系统的使用,比如,欧洲汽车法规不允许将这种共享系统用于非关键任务和发动机控制。
除了双内核方案和PREEMPT补丁方案之外,另一种手段也是可行的途径之一——资源分区,可以在单个平台上创建任务之间的硬分区,现代处理器在大多数常见架构下都支持该途径。如果其中一个系统可以成功分区,则可以将Linux用于非关键代码,经过认证的操作系统可以用于安全关键代码。这是由欧盟资助的大力神项目(https://hercules2020.eu/)的重点。对于系统的安全关键方面,Hercules选择了Erika Enterprise(https://en.wikipedia.org/wiki/ERIKA_Enterprise),这是一个在GPLv2+下获得许可的RTOS,它专为汽车电子控制单元设计,并通过了多项相关认证。Erika现在用于一些汽车产品(?),它支持一系列CPU,并且可以在各种Hypervisor下运行。
在Hypervisor方面,它选择了Jailhouse(Jailhouse是为了安全关键型而设计的,并考虑到了认证),它在GPLv2下也可用。该项目的目标是在其支持的任何架构上不超过10,000行代码。该计划是使用Jailhouse在Linux旁边的多核平台上运行实时、安全关键任务。它应该能够在两者之间提供强大而干净的隔离,同时以裸机级别执行。
Jailhoue有一个root cell概念,root cell虽然可以控制整个系统,但不能完全控制运行它的硬件。root cell运行Linux,其它cell可以运行任何支持Jailhouse的内核,Jailhouse无法运行未经修改的内核。Jailhouse没有内置调度程序,系统中的每个core都交由系统使用,没有硬件过度使用,也没有硬件仿真。内存在cells间划分,留存部分予Jailhouse。
支持Jailhouse的Linux系统有一个特殊的设备(/dev/jailhouse),用于配置root cell,并加载系统至其它cell中,使用配置文件来完整描述硬件及其分区,该文件可以在X86上自动生成,但对于ARM系统必须手动编写。
cell间相互隔离,但它们仍有相互通信的需求。Jailhouse为此提供了一个虚拟PCI设备,该设备没有多播功能(这是一个缺点),Hercules开发人员添加了自己的通信库,提供阻塞和非阻塞调用以及动态消息大小。需要解决的最大问题之一是避免cell之间的干扰,即使使用硬件分区也有可能发生这种情况。内存带宽紧张、cache空间的访问干扰都会是问题。缓存空间的争用解决方法之一就是使用cache着色,每个cell使用cache的不同部分。另一种方法,使用系统的性能计数器来监控内存带宽和cache空间的使用情况,如果需要,可以限制任务以将它们保持在一定范围内。还有一种方法,进程的协同调度,以避免相互竞争内存。
Hercules只是一个美好的愿景,因为没有经过认证的CPU来运行这种经过安全关键任务认证的系统,如果没有经过认证的CPU,则无法对整个系统进行认证。