2. INTEGRITY多核架构基础

INTEGRITY作为面向高安全、高实时场景的RTOS,其多核支持并不是简单地把单核内核“复制”到多个核上,而是围绕分区(Partition)—虚拟地址空间—调度器—核间通信这条主线重新组织。理解多核架构,首先要区分两种基本运行模型:对称多处理(SMP)与非对称多处理(AMP),以及它们与INTEGRITY调度器、核间中断(IPI)之间的关系。

一、SMP与AMP:两种多核组织方式

在INTEGRITY中,SMP指多个物理核共享同一个内核实例、同一份全局调度器状态和同一套系统对象(如任务、信号量、分区)。所有核看到的是同一个逻辑系统,任务可以被全局调度器分配到任意一个核上运行,核间通过共享内存和自旋锁保护内核数据结构。SMP的优点是负载均衡自然、编程模型统一;代价是内核临界区需要加锁,核数越多,锁竞争和缓存一致性开销越明显。

AMP则相反:每个核运行独立的操作系统实例(可以是INTEGRITY,也可以是INTEGRITY加裸机程序或另一个RTOS),各自拥有独立的调度器、地址空间和中断向量。核与核之间通过显式的共享内存、消息通道或硬件邮箱通信。AMP的优点是隔离性强、确定性好、单核失效不易扩散;代价是资源不能自动均衡,通信需要显式设计,启动顺序也必须严格编排。

实际工程中,INTEGRITY常采用混合模型:一部分核组成SMP集群运行通用分区,另一部分核以AMP方式运行安全关键或专用I/O分区。选择依据通常包括:是否需要硬实时确定性、核间数据耦合程度、认证范围(是否要求核间故障隔离)、以及SoC是否支持缓存一致性互联。

二、全局调度器与本地调度器

INTEGRITY的调度体系可以理解为两层:全局调度器(Global Scheduler)负责跨核的任务放置与负载均衡,本地调度器(Local Scheduler)负责每个核上就绪队列的实时调度决策。全局调度器并不直接决定“下一个运行谁”,而是决定“任务应该放在哪个核的就绪队列里”;本地调度器则在该核上按优先级、时间片或ARINC 653分区窗口执行。

在SMP模式下,全局调度器维护全局任务表,当某个核空闲或负载超过阈值时,触发任务迁移。迁移的粒度通常是任务(Task)或分区(Partition),迁移过程需要暂停任务、保存上下文、更新全局映射,再在目标核上恢复。在AMP模式下,全局调度器退化为配置期的静态分配表,运行期不再迁移,本地调度器完全自治。

一个关键参数是调度器锁的持有时间。在SMP中,全局调度器访问全局就绪队列时必须持有自旋锁,锁持有时间过长会阻塞其他核。INTEGRITY通过将就绪队列按核分片、减少全局共享结构来降低竞争。对于硬实时任务,通常建议将其绑定到固定核(CPU亲和性),避免迁移带来的缓存失效和调度抖动。

三、核间通信机制

INTEGRITY提供多种核间通信手段,按耦合程度从松到紧排列:

  • 共享内存 + 信号量/自旋锁:适合同一SMP集群内的高吞吐数据交换,需要处理缓存一致性和内存屏障。
  • 消息队列(Message Queue):INTEGRITY的核间消息通道,支持固定长度消息,发送方和接收方可位于不同核甚至不同分区,由内核负责拷贝和通知。
  • 核间中断(IPI):用于事件通知、调度器唤醒、TLB/缓存维护等控制路径,延迟低但数据量小。
  • 共享内存环形缓冲区 + IPI通知:工程中最常见的组合,大数据走共享内存,IPI只传递“有新数据”的信号。

以共享内存环形缓冲区为例,典型实现需要定义:缓冲区基地址、长度、读指针、写指针、以及一个用于保护指针的核间自旋锁或原子操作。发送方写入数据后更新写指针,然后向接收核发送IPI;接收核在IPI处理程序中读取写指针,从缓冲区取走数据并更新读指针。指针更新必须使用内存屏障,防止编译器和CPU重排序导致接收方看到“数据未写完但指针已更新”的错误状态。

四、多核启动流程与核间中断

INTEGRITY多核启动通常分为三个阶段:主核引导、从核释放、系统同步。上电后,主核(Boot Core)首先执行BootROM和INTEGRITY内核初始化,建立全局数据结构、内存池和中断控制器;然后主核通过SoC特定的寄存器(如ARM的CPU Release Address、PowerPC的Spin Table)释放从核。从核从指定入口开始执行,完成本地MMU、缓存、本地调度器初始化后,置位“就绪”标志。主核等待所有从核就绪,再统一打开全局中断,进入多核调度状态。

核间中断是这一过程的“神经系统”。INTEGRITY将IPI用于:唤醒目标核上的调度器、通知任务迁移、触发远程TLB失效、以及传递核间消息到达事件。IPI的发送通常通过中断控制器(GIC、MPIC等)的软件生成寄存器完成,接收核在IPI处理程序中根据中断号或消息寄存器判断事件类型,再分派到对应处理函数。

下面这张图展示了INTEGRITY SMP/AMP混合架构下,主核与从核的启动顺序、全局/本地调度器位置,以及共享内存+IPI的核间通信路径。

INTEGRITY 多核架构:SMP集群 + AMP专用核 主核 Core 0(SMP集群) 全局调度器 任务放置 / 负载均衡 本地调度器 就绪队列 / 优先级 分区 P1 / P2 / P3(共享地址空间) 共享内存环形缓冲区 + 自旋锁 从核 Core 1(AMP专用核) 独立内核实例 独立地址空间 本地调度器 自治 / 不迁移 安全关键分区 / 专用I/O分区 共享内存环形缓冲区 + 原子指针 数据流 IPI通知 多核启动流程 ① 主核BootROM 内核初始化 ② 释放从核 CPU Release ③ 从核本地初始化 MMU / 缓存 / 调度器 ④ 就绪同步 全局中断使能 核间中断(IPI)路径 发送核:写GIC寄存器 中断控制器分发 接收核:IPI处理程序 分派

五、工程配置要点与判断依据

在INTEGRITY工程中配置多核,通常需要关注以下参数与判断点:

配置项典型取值/示例判断依据
核运行模式SMP / AMP / 混合硬实时任务是否要求核间故障隔离;数据耦合是否紧密
任务亲和性绑定Core 0或Core 1避免迁移抖动;缓存局部性要求高时绑定
共享内存大小示例:64 KB环形缓冲区按峰值消息速率×最大延迟估算
IPI中断号示例:GIC SPI 10需与SoC中断分配表一致,避免冲突
内存屏障DMB / ISB(ARM)指针更新与数据写入之间必须插入屏障
调试提示:多核启动失败时,优先检查从核释放地址是否正确、从核入口是否已映射、以及主核是否在从核就绪前误开了全局中断。核间通信丢包时,先确认IPI是否被屏蔽,再检查环形缓冲区的读写指针是否因缺少内存屏障而出现“数据未到、指针先到”的现象。

总结来看,INTEGRITY多核架构的核心不是“核越多越好”,而是根据确定性、隔离性和吞吐需求,在SMP与AMP之间做出合理取舍,并用全局/本地调度器、共享内存和IPI把多个核组织成一个可预测、可验证的整体。理解启动顺序和核间中断路径,是后续进行多核分区配置和实时性调优的基础。