物理总线与 MMIO 规格¶
1. 单一物理访问入口¶
- BUS-REQ-001:所有 CPU 翻译后访问、页表漫游、Boot 装载和设备 DMA 必须通过受控物理总线或其明确的初始化接口。
- BUS-REQ-002:运行期不得通过裸 RAM 指针绕过边界、只读和设备分发规则。
- BUS-REQ-003:总线支持 8、16、32、64 位小端访问,并明确区分读、写、取指、原子和 DMA 来源。
2. 固定地址图¶
| 区域 | 起始地址 | 结束地址(含) | 大小/说明 |
|---|---|---|---|
| Boot ROM | 0x00001000 |
0x0000BFFF |
44 KiB |
| CLINT | 0x02000000 |
0x0200BFFF |
48 KiB |
| PLIC | 0x0C000000 |
0x0FFFFFFF |
64 MiB |
| UART 16550A | 0x10000000 |
0x100000FF |
256 B |
| VirtIO-Blk MMIO | 0x10001000 |
0x10001FFF |
4 KiB |
| VirtIO-Net MMIO | 0x10002000 |
0x10002FFF |
4 KiB |
| RAM | 0x80000000 |
0x80000000 + ram_size - 1 |
默认建议 1 GiB |
所有区间为闭区间且不得重叠。base + size 计算必须检查 64 位溢出。
3. Boot ROM¶
- 运行前可通过受控装载接口写入复位跳板和 FDT。
- 机器开始执行后,来宾写入必须产生存储访问错误。
- ROM 未初始化区域的确定值策略必须固定并测试。
- 指令取指允许,但仍检查范围和访问宽度。
4. RAM¶
- 容量由配置确定,默认值在 CLI 规格冻结。
- 分配失败必须在启动前清晰退出,不能降级成较小 RAM 而不告知。
- RAM 初始内容采用确定的零初始化策略,镜像装载区按原字节覆盖。
- 读写必须检查整个
[address, address+size)都在 RAM 内。 - 任何跨 RAM/MMIO 边界的单次访问不得拆分产生部分副作用。
5. MMIO 分发¶
- BUS-REQ-004:设备注册时检测地址重叠并拒绝启动。
- BUS-REQ-005:未映射地址产生 instruction/load/store access fault,而不是返回零或忽略写入。
- BUS-REQ-006:设备必须自行声明允许宽度和对齐;不合法访问产生访问错误。
- BUS-REQ-007:MMIO 访问不得误用普通 RAM 原子逻辑;设备支持的原子语义必须显式定义。
6. 访问结果¶
总线返回结构化结果,至少区分:成功、未映射、越界、只读、宽度不支持、对齐错误和后端 I/O 故障。上层根据来源映射为来宾 Trap 或宿主致命错误,不能丢失物理地址与设备信息。
7. DMA 安全¶
VirtIO DMA 接口必须:
- 只接受来宾物理地址。
- 检查加法溢出和完整范围。
- 默认只允许 RAM,不允许设备通过描述符访问 MMIO 或 ROM。
- 区分设备读来宾缓冲区与设备写来宾缓冲区。
- 处理跨 RAM 边界失败时不产生部分 used ring 完成,除非设备规范明确规定错误完成。
8. 原子事务¶
总线必须为 A/D PTE 更新和 AMO 提供单一原子读改写抽象。首版串行主循环可以作为原子性的执行基础,但接口和状态提交点必须防止设备事件插入普通读写之间。
- BUS-REQ-008:LR 的读取与保留建立必须是一个事务,并返回只可由后续 SC 消费的不透明 token。
- BUS-REQ-009:SC 必须在一个事务内消费 token、检查地址与宽度并条件写入;失败不得改变目标内存。
- BUS-REQ-010:所有成功的普通存储、原子更新和 DMA 写入都必须经过同一重叠检查,使受影响的保留失效;失败或只读访问不得伪造内存变化。
- BUS-REQ-011:首版单 Hart 保留范围固定为 LR 操作数的精确自然对齐字节范围;未来增加 Hart 时必须扩展为按 Hart 隔离的监视器,不能共享一个 token。
9. 验收条件¶
- 地址图逐边界测试:首地址、末地址、前一字节、后一字节和跨界访问。
- 测试所有宽度、小端序、只读 ROM 和未映射访问。
- 测试设备注册重叠、RAM 尺寸溢出和 DMA 指向非法区域。
- 证明 CPU、MMU 页表访问和 VirtIO DMA 不存在旁路。