硬汉嵌入式论坛

 找回密码
 立即注册
搜索
查看: 49|回复: 0
收起左侧

[ThreadX全家桶] Eclipse ThreadX ZoneX:面向混合关键性系统的 Armv8-R 确定性分区 Hypervisor

[复制链接]

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
124071
QQ
发表于 8 小时前 | 显示全部楼层 |阅读模式

项目地址:https://github.com/eclipse-threadx/zonex

ZoneX 是 Eclipse ThreadX 套件新增加的一个组件,定位是面向混合关键性(mixed-criticality)嵌入式系统的确定性分区 hypervisor,运行在 Armv8-R 架构的 EL2(Hyp 模式)上。它的设计思路很直接:给每个分区静态声明一块内存和一个时间片,分区一旦越过其中任何一条边界,就作为需要上报的故障处理,而不是作为可以恢复的状态去尝试挽救。项目目前处于 Phase 0,作者在 README 里明确写了这不是量产软件、离量产还很远,它只是一个演示器,用途是确认一小批机制能在真实的 Armv8-R 硅片上工作,并测出这些机制的代价。

当前版本已经做到时间分区。两个 ThreadX 内核分别运行在 EL1,各自被限制在自己的 stage-2 窗口里,按 manifest 定义的静态主框架(major frame)分时复用一个逻辑核:分区 A 占每十个 tick 中的七个,分区 B 占三个,每个分区的时钟只在自己的窗口内推进,别人的窗口一概不计。这套演示同时跑在 Armv8-R AEM FVP 模型和 NXP S32Z280-594EVB 开发板上。

技术要点:

1、定位:Eclipse ThreadX 套件组件,面向混合关键性系统的确定性分区 hypervisor
2、运行层级:Armv8-R(AArch32)EL2,各分区 guest 运行在 EL1
3、内存分区:EL2 stage-2 区域式 MPU(PMSAv8-R)描述符;Armv8-R 两级转换都没有页表
4、时间分区:由 hypervisor 定时器驱动,静态主框架取自 manifest
5、当前演示形态:两个 ThreadX 分区共用一个逻辑核,A 占 7/10 tick,B 占 3/10
6、已验证目标:Armv8-R AEM FVP 模型、NXP S32Z280-594EVB 开发板
7、区域预算:Cortex-R52 的 HMPUIR 合法取值为 0、16、20、24;S32Z280 为 20 个,FVP 报 32 个(该值对 Cortex-R52 非法)
8、分区切换开销:S32Z280 上约 6,000 周期(min/mean/max 为 5,662 / 5,703 / 5,982,应读作 ±4%),其中 guest 自身的 EL1 MPU 占 3,407 周期
9、构建:CMake + Ninja,无 IDE 依赖,代码基线 C17
10、状态与许可:MIT;2026-08-27 建仓,最新提交 2026-09-09;Phase 0 演示器,非量产软件

隔离性现在是被断言验证过的,而不是靠演示说明。一次回归会连续扫过 14 个隔离用例(两个方向各 7 个,每个用例各自指向一个地址),同时在不可信分区被依次驱动成五种行为的过程中持续测量关键分区的窗口周期,这五种行为分别是:空闲、计算、屏蔽自身中断后计算、猛打控制台、每轮循环都触发越界。板卡上 A 的窗口周期是 8MHz 计数器的 800,000 counts,在六百个主框架上,邻居空闲时周期只偏移 22 counts,邻居计算时 20,邻居屏蔽 IRQ 和 FIQ 计算时 24,邻居累计触发十万三千次越界时 185。六天前的一次独立运行在离散范围内给出一致结果(21、21、22、304),所以这是可复现的测量,不是单次运气。

真正能穿透到邻居的只有一处,而且是 hypervisor 自己造成的。同一个运行里,不可信分区猛打控制台的那一段,把 A 的周期推移了 17,951 counts。原因在控制台路径上:guest 每写一个字符就是一次 hypercall,EL2 在 PSTATE.F 置位的状态下应答,于是那个用来结束窗口的 FIQ 必须等这次 hypercall 做完。几乎每次 hypercall 只写 guest 要的那一个字节,但开启一个新行的那一次会写 22 个字节(延迟关闭欠下的换行、标识分区的 tag、guest 自己的字符),耗掉 106,116 个核心周期,约 2.2 ms,约 17,640 counts,期间边界中断一直处于被挂起状态。作者把这条明确归为 ZoneX 自身的缺陷而不是分区机制的上限,并且说明它有界、可推导、可复现。修复方向是让控制台变成 hypervisor 不必等待线缆就能交出字节的中断驱动实现,同时保留一个能被故障路径强制启用的轮询回退——因为故障上报本身是在 ZoneX 已经失败一次的时刻打印的。方案在 docs/wcet-inputs.md 里已经写清并计过代价,但尚未实现。

区域数量是选板前必须先核对的一项。ZoneX 的隔离能力来自 EL2 MPU 里的区域描述符,而这些描述符是最稀缺的资源。HMPUIR[7:0] 给出 EL2 区域数,Cortex-R52 上架构允许的取值只有 0、16、20、24;实测 S32Z280-594EVB 为 20 个(ZoneX 自身 MMIO 占 2 个,双分区演示用掉 20 个里的 4 个),Armv8-R AEM FVP 报 32 个(MMIO 占 0 个,演示用掉 32 个里的 2 个)。由此有三条结论。第一,没有配置 EL2 MPU 的 Cortex-R52 根本跑不了 ZoneX:0 是合法取值,而且没有软件回退,Armv8-R 在两级转换上都没有页表,区域式 MPU 是唯一的内存控制手段;只有 16 个区域的器件能跑,但余量小于这套测试台。第二,hypervisor 自身的 MMIO 不是免费的,代价取决于板卡:S32Z280 上控制台和 GIC 都落在 background map 的 Normal write-through 带而不是 Device 带,而带 cacheable 属性去访问内存映射设备等于设备不能工作,所以两者各需要一个 Device 属性的 EL2 区域;FVP 上两者都在 Device 带,不占区域,因此模型测不出这个约束,它报的 32 个区域在 Cortex-R52 任一级转换上也都不是合法值。第三,区域还必须能被切换访问到:分区切换靠一次对 HPRENR 的写入来使能和禁用区域组,而该寄存器的实现宽度是器件属性(这块板为 0x000FFFFF,全 20 位),落在掩码之外的区域会带着自己的使能位被编程并留在那里,于是上一个分区的窗口会在下一个分区之下继续存活,而且没有任何东西会触发故障。ZoneX 在启动时分别校验区域数和掩码,两者都满足才继续运行;manifest 目前允许四个分区、每个六个区域,用静态断言对上 24 这个上限。

README 用了整整一节说明 Phase 0 不做什么。演示跑在 lockstep 模式的 Cortex-R52 上,对外表现为一个逻辑核,所以这里做的是单核上的时间分区与内存分区,不是跨多核的空间分区,后者需要 split-mode SMP,已被推迟。中断延迟完全没有测量:guest 中断直接送到 EL1,代价和以前一样,要给中断延迟定界需要用到该核具备但这一阶段未启用的 GIC List Registers。中断虚拟化与有界最坏延迟、分区间通信、完整的时间分区调度器、受监督的分区重启、TraceX 集成、安全工件包,都不属于 Phase 0。

ZoneX 面向 Armv8-R AArch32,整个代码库受两个前提约束:两级转换都没有页表,Armv8-R 的 stage 2 是区域式 MPU(PMSAv8-R)而不是转换表,照 KVM、Xen 这类 A-profile hypervisor 的样子来写是错误模板;寄存器名用的是 AArch32 Hyp 模式的那一套(HVBAR、HCR、HSCTLR、HPRBAR/HPRLAR/HPRENR/HPRSELR、HMPUIR、HSR、HDFAR/HIFAR/HPFAR、HMAIR0/HMAIR1),通过 MRC/MCR p15, 4 访问。

构建方式为 CMake 加 Ninja,宿主单测和 FVP 交叉编译各一条脚本:

scripts/build_host.sh && scripts/test_host.sh
scripts/build_fvp.sh

项目里还有两处说明值得留意。README 顶部带有 AI 披露,声明该文件绝大部分由 Claude Code (Opus 5) 生成,AI 生成部分可能被视为公有领域(CC0-1.0)而不属于项目许可范围,人类贡献者已审查并验证代码正确。贡献流程走 dev 分支、需要签署 Eclipse 贡献者协议,欢迎 AI 辅助的贡献但必须署名。许可证为 MIT。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2026-9-11 18:48 , Processed in 0.112145 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表