内核调用的用户 I/O 准入

可选 Nexus::UserIoBroker 将不可信消息与可信内核策略分离。标量 GPIO 路径为一次有界类型化读取或 set/reset 写入 pin 用户内存。独立的复制 UART TX 路径只保留特权 request/payload cell,并使用既有 BusOwner/UARTOwner。两条路径都不接受用户提供的 principal、port、MMIO 地址、callback 或私有 slot 指针。实际内核入口、权限和硬件归属仍由集成方负责。

标量 GPIO 与 pinned 用户内存

32 字节输入与 8 字节输出包含显式 uint32_t 字段。可信 gateway 在特权 Thread、进入时中断掩码全清的上下文调用公共 API。内核身份回调认证当前主体,公共消息不能选择它。构造保留不可变且互不重叠的名义用户 RAM 窗口、精确器件/位掩码授权、正数借用容量和内核内存端口。全部已知 broker、策略、端口表与私有 context 范围位于用户窗口之外。

准入在 pin 前校验完整跨度运算、对齐、访问权限与单窗口包含关系。pin 必须建立指定 CPU 访问能力,并保留地址空间/进程/映射生命周期,直到 unpin 成功。pin 失败不能残留映射引用或效果。白名单自身不能证明实际映射 RAM、DMA 可达性、MMIO 排除或 MPU 隔离;可信内核与 SoC 内存布局负责建立这些事实。

输入被 pin 后只复制一次到内核存储,策略使用该快照。任何 GPIO 操作前先 pin 回复范围。最终保存掩码的 guard 将撤销与有界标量提供者操作串行化;进入 guard 前 close 禁止效果,dispatch 后 close 不能撤销效果。每个 dispatch 结果都复制完全初始化的回复,包括提供者错误;取消准入不修改回复。全部复制期间持续保留 pin。

result 报告准入/器件执行,cleanup_result 报告最近释放尝试。首次 pin 成功时 accepted 变为 true。WRITE 提供者调用前设置 device_effect_possible,即使提供者随后返回错误。retained 要求精确内核调用槽、用户内存及地址空间身份保持存活。清理先尝试输出再尝试输入释放,记录错误并独立保留每个失败 pin。gpio_finish 仅重试保留清理,绝不重新读取用户、写回复或重复器件操作。操作错误或清理成功都不能授权重放先前写入。

私有通用借用机制保留精确槽指针与单调 64 位 epoch。复制 token 与旧 epoch 不能释放它;epoch 耗尽拒绝复用。只读范围可共享字节,任何可写范围与对等借用重叠均拒绝。已知策略、提供者、其他借用和排空控制别名均在修改前拒绝。只有两个精确内部 GPIO 子槽可以共享自身调用证明。可信排空回调须证明实际外设/DMA/IRQ/延后执行/复制的最终访问及观察者 join;用户输入不能声明此证明。证明或 unpin 失败保留精确 pin 与 token。

唯一特权串行内核所有者控制 broker 及其槽。全部内存/证明回调有界且在 Arch guard 外执行,可以标记 close,但不能递归准入、释放、执行或保留 cookie 输出。Close 禁止准入且保留全部活动借用。只有 close 后、借用/列表条目为零且无执行者,静止证明才有效。它不隐式停止提供者,也不建立应用停机屏障。没有 reopen 或隐藏身份注册表。NMI/fault/SMP 发布者和非串行特权内存写入者不在本合同内。

这是可由集成特权内核调用的组件,不是已实现的用户空间 transport。本切片未接入 FreeRTOS SVC/MPU 包装、任务主体认证、真实内存 pin、fault-safe 复制或 TrustZone veneer。通用借用提供所有权机制,不提供异步借用用户内存的 UART/SPI/CAN 消息。下文复制 UART 路径使用独立合同,不接受用户提供的排空证明。

复制式异步 UART TX

公共协议与可信构造提供 construct、dispatch、close、reap 和 join。可选目标不创建 factory、内核 task、queue、registry 或 lock。调用方提供精确特权 cell 与 payload 容量、不可变策略/用户窗口、完整私有 context 范围,以及已构造的独占 BusOwner/UARTOwner/UART 绑定。既有 BusOwner 仍是唯一 FIFO。

FIG-25:当前 UART TX 复制代理所有权;标注箭头区分用户复制、既有 owner 执行与必需的可信生命周期证明

FIG-25 描述当前软件机制,不表示已安装内核 gateway 或物理隔离结果。可信内核提供 principal 身份、容错复制和独占 session/role authority。外部 executor 推进既有 owner;任何 gateway 调用都不隐式 service UART。实现、BusOwner 和 UARTOwner定义本图的源码及最后访问边界。

构造在任何外部回调或 claim 前检查全部完整跨度运算及已知别名。Cell、payload、配置、region/operation 表、owner slot、UART executor/provider 和每个已声明 context 均位于名义用户窗口之外,并按要求互不重叠。临时构造 reservation 阻止回调重入。最终可信 claim 为实际 controller/owner 建立唯一独占 role,此后初始化不再有可失败步骤。同一 controller 的另一个 wrapper 不构成另一个 role。

Authority 必须跨新 server 存储、进程/器件复位和重建保留不回绕的 session 历史。它拒绝复用或不递增的非零 session,以及任何第二个活动 role(即使 session 更大),并在历史耗尽时关闭接纳。组件不提供持久化策略或 authority 实现。仅 initialize-once 不足以满足要求:成功 join 后,新对象需要更大的已 claim session,使旧命令不能在新存储中重新有效。

每次已接纳 gateway 事务都在复制用户数据前认证当前 principal。48 B 标量 header 包含 device、session、slot、epoch、length,以及既有 owner 时钟域中的绝对 deadline。40 B 完全初始化的 reply 不包含特权指针。它们是本地 C gateway 记录;任何 transport 序列化均由集成内核负责。复制的 header 只检查一次;完整读写范围包含关系和互不重叠的用户跨度检查先于 payload/reply 复制。可信 copy port 必须为每次回调建立真实权限、容错与 mapping/process 生命周期;名义范围本身不能建立这些属性。返回后不保留任何用户地址。

动作

所有权与结果

SUBMIT

在已 claim session 中提出精确下一个非零 slot epoch;在 owner 接纳前复制正数且有界的 payload。复制失败擦除已复制 payload,不消耗 epoch。接受会保留复制 cell,包括 BusOwner 拒绝时的保留 terminal 错误。

POLL

使用精确已接受 session/slot/epoch。只有以 acquire 观察 SETTLED 才暴露最终 result/count;更早 reply 报告 BUSY 且 count 为零。

CANCEL

请求真实 owner 撤回。取消、超时和隔离保留 cell;晚到取消不能覆盖 provider 已观察到的 terminal 结果。

CONSUME

要求以 acquire 观察 SETTLED,且真实 BusOwner 已 idle/完成发布 join。先复制 reply;只有成功才释放精确身份并擦除已复制字节。

已接受 SUBMIT 后仍可能发生 reply 复制错误。用户已知其提出的 session/slot/epoch,必须以 POLL 恢复;重复 SUBMIT 不能重放或替换操作。CONSUME 的 reply 复制失败保留 terminal cell。已接受 TX 可能已有不可逆效果;任何错误都不授权自动重放。每个 slot 的 epoch 不回绕,且在消费后保留。

Close、可信 reap 与 role join

唯一特权、未屏蔽中断的 Thread 串行执行 gateway 和管理调用。Identity 与 copy 回调可以同步请求 close;递归 dispatch 及进行中的管理重入均拒绝。Close 保留其控制发布,永久拒绝新 SUBMIT,并取消活动工作,不擦除它或停止底层 owner。外部 executor 必须继续 service 真实 UART 排空。QUARANTINED 从不授权 consume 或 reap。

如果用户 mapping 永久消失,经过认证的 reply 复制可能永远无法恢复。可信管理可调用 reap;不存在对应的用户 wire action。它要求永久 close、每个保留的精确 request 都已 acquire 观察 SETTLED,且真实 owner idle。任何擦除前,可信 drained 回调必须证明外部 gateway/transport observer 已 join,且未来入口已阻止,同时仍保留独占 role。失败或 pending/quarantined 工作保留全部 cell 与 role。成功后退出全部 cell 而不重置 epoch,擦除已复制 payload,并锁存拒绝后续 dispatch 的本地 fence。Reap 放弃结果;它不取消进行中的操作,也不撤销已发送字节。

join 要求永久 close、全部 cell 已消费或 reap,以及真实 owner idle;随后 authority 成功 release 证明外部 observer 已 join,并撤回 role 引用。Release 失败保留 role 与全部绑定存储。配置、cell、payload、owner/provider 和每个 context 都须存活至成功 join。只有此后才能回收存储,或由新对象 claim 更大 session。本地 epoch 或软件谓词不能替代外部 gateway 证明,也不能替代 provider 的真实最后访问证明。

Cold 校验对显式 cell/control 执行成对检查;复制与擦除使用调用方精确字节预算,close/reap/join 检查显式 cell 数。这些是有界软件开销,不是 MCU 延迟或功耗测量。SVC/CMSE 入口、实际内核 principal/copy/session authority、MPU/TrustZone 强制、NS RTOS、借用用户内存的异步 SPI/CAN transport 和物理 HIL 仍在本增量之外。原始 IO-39 与 SOC-36 退出仍开放;本公共机制不完成它们。

软件验证边界

Google 测试执行真实 broker、类型化 GPIO 包装、Native GPIO 提供者、Core 请求状态与 Native 保存掩码实现,只模拟外部内核身份/pin/unpin/证明边界及特权上下文。行为 RED/GREEN 日志、sanitizer、公共头文件探针与严格 ARM 编译记录在 tools/testing/evidence/user-io-broker-iteration/manifest.json。这些证明软件行为和编译,不证明物理隔离、HIL 时序或产品发布资格。可选 archive 无可变全局变量;默认 factory/源码/ELF 的省略由集成构建图另行验证。

复制 UART 回归执行真实 mediation、Core request 和既有 BusOwner/UARTOwner,仅模拟外部 identity/copy/role 与 UART 硬件端口。它们覆盖跨新存储/session 生命周期的旧命令、复制失败、真实排空/发布 join、管理回调重入和 closed reap。执行证据归属于精确源码记录,不归属于本页或其图;它不建立物理隔离或 HIL 结果。