1. INTEGRITY多核安全关键应用开发导论

安全关键系统(Safety-Critical System)是指一旦发生失效,可能直接导致人员伤亡、重大财产损失或环境灾难的计算系统。航空电传飞控、汽车线控制动、轨道交通信号联锁、医疗输液泵、工业安全仪表系统(SIS)都属于这一范畴。这类系统的核心工程目标不是"功能尽可能多",而是"在规定的安全完整性等级(SIL/ASIL/DAL)下,把风险控制在可接受水平"。因此,开发过程必须回答三个问题:系统可能以什么方式失效?这些失效被检测和控制的概率有多高?一旦控制失效,系统能否进入一个确定的安全状态?

围绕这三个问题,业界形成了以 IEC 61508 为顶层、向下派生到 ISO 26262(汽车)、DO-178C(航空)、IEC 62304(医疗)等领域的标准体系。它们共同要求:需求可追溯、设计可验证、失效可诊断、行为可预测。其中"行为可预测"对底层软件提出了最苛刻的要求——操作系统必须提供时间与空间上的确定性隔离,否则上层再完善的安全机制也无法保证在最坏情况下的响应时间。

多核处理器带来的新挑战

为满足算力需求,现代安全关键平台普遍从单核迁移到多核 SoC,例如汽车域控制器常见的 4~8 核 ARM Cortex-A/R 混合架构,航空 IMA 平台的多核 PowerPC 或 ARM。多核在提升吞吐量的同时,引入了单核时代不存在的失效模式:

  • 共享资源争用:多核共享 L2/L3 缓存、内存控制器、DMA 与片上总线。一个核上的高负载任务会通过缓存污染和总线抢占,使另一个核上任务的执行时间产生数倍抖动,破坏 WCET(最坏执行时间)分析的可信度。
  • 核间干扰不可控:若没有硬件或软件层面的资源分区,核 A 的突发流量会直接改变核 B 的时序行为,导致"通过单核验证、在多核上失效"的典型问题。
  • 核间通信的确定性:多核任务需要同步与数据交换,若通信机制本身不确定(如无界队列、自旋锁竞争),则隔离形同虚设。
  • 启动与故障传播:一个核的异常若未被隔离,可能通过共享内存或中断控制器扩散到其他核,使局部故障演变为系统级故障。

因此,多核安全关键开发的关键不是"把任务分到多个核上跑",而是为每个核建立可证明的时间与空间分区,并让核间交互也具备确定性。这正是 INTEGRITY RTOS 的设计出发点。

INTEGRITY RTOS 的定位与核心价值

INTEGRITY 是 Green Hills Software 面向高安全等级场景的实时操作系统,已获得 DO-178C DAL A、IEC 61508 SIL 3、ISO 26262 ASIL D 等认证证据。它并非通用 Linux 的裁剪版,而是从内核设计之初就以"分离(Separation)"为第一原则构建的微内核式 RTOS。其核心机制可归纳为以下几点:

  • 空间分区:每个任务或任务组运行在独立的地址空间中,由 MMU/MPU 强制隔离,越界访问被硬件捕获而非静默破坏。
  • 时间分区:基于静态调度表的时间片轮转,每个分区在预分配的窗口内运行,窗口耗尽即被抢占,保证任一分区的最坏响应时间可静态计算。
  • 确定性核间通信:通过受保护的核间消息通道与共享内存区进行数据交换,通道容量与访问时序均在设计期确定。
  • 安全内核与可选 POSIX/ARINC 653 接口:应用既可运行在原生 INTEGRITY API 上,也可通过 ARINC 653 分区接口或 POSIX 层接入,便于复用既有代码。
  • MULTI IDE 与安全调试:配套工具链支持静态分析、时序分析与认证证据生成,使"设计—实现—验证"闭环可追溯。

下图给出 INTEGRITY 多核安全关键应用的总体结构:硬件层之上是安全内核,内核之上按核划分时间/空间分区,分区之间通过受控的核间通道交互,应用与中间件运行在各自分区内。

INTEGRITY 多核安全关键应用总体结构 多核 SoC 硬件层 Core0 / Core1 / Core2 / Core3 · MMU/MPU · 共享 L2 · 中断控制器 · 片上总线 INTEGRITY 安全内核(微内核 · 分离内核) 空间隔离 · 时间分区调度 · 核间消息通道 · 安全启动 · 故障隔离 Core0 · 分区 A 飞控律计算任务 周期 5 ms · 优先级 10 独立地址空间 ARINC 653 分区接口 POSIX 兼容层 Core1 · 分区 B 传感器融合任务 周期 10 ms · 优先级 8 独立地址空间 核间消息通道 共享内存区(受保护) Core2 · 分区 C 健康监控与诊断 周期 20 ms · 优先级 5 独立地址空间 故障记录与上报 安全状态切换 核间通道 核间通道 安全关键分区 数据融合分区 监控分区 受控核间交互

从图中可以看到,INTEGRITY 把"多核"问题转化为"多个独立分区 + 一个受控内核"的问题:每个核上的分区拥有自己的地址空间与时间窗口,核间交互必须经过内核提供的受保护通道。这样,核 A 的负载波动不会直接改变核 B 的时序,核 A 的越界访问也不会破坏核 B 的数据。对于安全关键应用而言,这种"可证明的隔离"比单纯的性能提升更有价值。

从概念到工程:一个最小示例

假设一个四核域控制器需要实现"飞控律计算 + 传感器融合 + 健康监控"三类任务。在 INTEGRITY 上,典型做法是:为飞控律分配 Core0 上的分区 A,周期 5 ms、优先级 10;为传感器融合分配 Core1 上的分区 B,周期 10 ms、优先级 8;为健康监控分配 Core2 上的分区 C,周期 20 ms、优先级 5。分区 A 与 B 之间通过核间消息通道交换融合后的传感器数据,分区 C 通过共享内存读取各分区的健康状态字。

配置阶段需要明确每个分区的地址空间大小、时间窗口长度、消息通道容量与访问权限。例如分区 A 的时间窗口设为 2 ms,分区 B 设为 3 ms,分区 C 设为 1 ms,剩余时间留给内核与空闲任务。这样,即使分区 B 因传感器数据量突增而运行到窗口末尾,也不会侵占分区 A 的 2 ms 窗口,飞控律的响应时间仍然可静态计算。运行阶段,若分区 A 发生越界访问,MMU 触发异常,内核捕获后由分区 C 记录故障并触发安全状态切换,而分区 B 不受影响。

判断隔离是否真正生效,不能只看"任务能跑起来",而要看三件事:一是每个分区的最坏执行时间是否落在其时间窗口内;二是核间消息通道在满负载下是否仍满足确定性的延迟上界;三是故障注入后,故障是否被限制在发生分区内,其他分区是否继续按调度表运行。