内核调用的用户 I/O 准入¶
可选 broker 将不可信标量输入与可信内核策略、保留的用户内存所有权分离。已实现操作是有界类型化 GPIO 读取或 set/reset 写入。用户不能提供端口、MMIO 地址、回调、主体身份、私有槽指针或异步 DMA 操作。
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 用户消息尚未实现。未来 transport 必须提供实际提供者排空与内存端口合同,不能接受用户提交的“已排空”标志。
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 的省略由集成构建图另行验证。