Skip to content

Dual Execution Domain

EnerOS Bot edited this page Jul 5, 2026 · 1 revision

中文 | English

Dual Execution Domain / 双执行域

维护版本:v0.51.2 | 最后更新:2026-07-06

电力系统对实时性有刚性需求——继电保护动作必须在毫秒级完成,开关操作指令必须在确定时限内下发。通用 OS 内核无法提供硬实时保证,而纯实时系统又难以承载 AI 推理与 Agent 编排。EnerOS 的回答是双执行域

详见 ADR-0015README §实时双执行域


域对比

维度 通用执行域 (General) 实时执行域 (Real-Time)
内核模式 标准内核 实时扩展内核
调度策略 公平调度 SCHED_FIFO 优先级抢占
典型任务 Agent 编排、AI 推理、潮流计算 继电保护、开关操作、故障隔离、频率调节
响应时延 秒级 ~ 分钟级 微秒级 ~ 毫秒级(P99 < 1ms)
内存 可堆分配 禁止堆分配(NoAlloc)
可用 Mutex/RwLock 禁用(clippy::disallowed_types)
IPC 任意 无锁 SPSC 通道

核心设计原则

  1. 安全域不可被通用域阻塞 — RT 任务拥有最高优先级,通用域不得影响 RT 确定性
  2. 单向信任 — RT 域可读通用域决策指令;通用域不可直接干预 RT 调度
  3. 跨域通过 SafetyGateway — 所有通用域 → RT 域指令必须经网关约束校验 + 优先级仲裁
  4. 故障降级 — 通用域异常时,RT 域自动切换本地保护逻辑,电网安全不依赖 AI

RT 类型层保证(v0.49.0 引入,v0.50.0 true seal)

RT 域的安全规则从"文档约定"升级为编译期 + 运行时双重保证:

1. Validated<Command> newtype

SafetyGateway 在类型层不可绕过:

// 编译期保证:execute_validated 仅接受 Validated<Command>
pub fn execute_validated(&self, cmd: &Validated<Command>) -> Result<()>;

// Validated::new 是 pub(crate),外部 crate 无法直接构造
// 必须通过 gateway.validate(&cmd)? 拿到 Validated<Command>

外部 crate 直接调用 Validated::new 触发编译错误 error[E0624]: associated function 'new' is private。trybuild compile_fail/bypass_safety_gateway.rs 锁定错误形态。

2. clippy::disallowed_types RT 禁锁

crates/eneros-gateway/clippy.toml 在 crate 级声明 Mutex/RwLock 为 RT 禁用,rt.rs 模块通过 #![cfg_attr(feature = "rt_check", deny)] 强制。

CI rt-check job 以 --features rt_check 在每次提交强制验证。

3. NoAlloc marker trait + AllocTracker

eneros-perf/src/no_alloc.rs

  • NoAlloc marker trait(v0.50.0 迁入 eneros-core::no_alloc
  • AllocTracker GlobalAlloc 包装
  • RT 线程通过 RtThreadGuard 在堆分配时 panic
  • 通过 #[cfg(feature = "rt_check")] 启用

4. lockfree 默认

SafetyGateway::new() 默认启用 lockfree;v0.49.0 BREAKING:移除 with_lockfree_state(),新增 with_locking_state() 作为 opt-out。

5. WCET 框架

pub struct RtTask {
    command: Validated<Command>,
    budget: WcetBudget,
}

// execute_with_wcet 预算约束
// - 超预算:告警
// - 2× 超预算:报错 + 触发看门狗 fallback

WCET 违规写入审计:AuditAction::WcetViolation(v0.50.0)。

6. RepositoryAuditSink HMAC 链(v0.51.0)

AuditSinkFactory::from_config() 支持 "memory" / "repository" 两种 sink。RepositoryAuditSink 通过 tokio::spawn 异步写入 AuditRepository,HMAC 链由 AuditRepository 维护。


实时基础设施

技术 作用
SCHED_FIFO 优先级抢占调度
isolcpus CPU 隔离,避免被通用任务抢占
mlockall 内存锁定,禁止换页
无锁 SPSC IPC 跨域通信无锁竞争
硬件看门狗(/dev/watchdog) 超时复位
huge pages 减少 TLB miss

eneros-os::rt 模块封装上述能力,HardwareWatchdog(v0.51.0 接入实际 /dev/watchdog)。


CI 强制验证

.github/workflows/ci.ymlrt-check job:

rt-check:
  runs-on: ubuntu-latest
  steps:
    - uses: actions/checkout@v4
    - name: RT clippy + test
      run: |
        cargo clippy --workspace --features rt_check -- -D warnings
        cargo test --workspace --features rt_check

每次提交都会强制验证 RT 类型层规则。


下一步

Clone this wiki locally