OpenSBI 1.3 官方文档《Domain Support》中文翻译
OpenSBI Domain 支持
OpenSBI domain 是对底层硬件的系统级分区(子集),每个 domain 拥有独立的内存区域(RAM 和 MMIO 设备)以及 HART。OpenSBI 将尝试使用 RISC-V 平台特性(如 PMP、ePMP、IOPMP、SiFive Shield 等)实现 domain 之间的安全隔离。
实现 OpenSBI domain 支持的核心数据结构包括:
- struct sbi_domain_memregion:表示一个 domain 的内存区域
- struct sbi_hartmask:表示一个 domain 的 HART 集合
- struct sbi_domain:表示一个 domain 实例
RISC-V 平台上的每个 HART 都必须被分配到一个 OpenSBI domain 中。OpenSBI 平台支持负责填充 domain 并提供 HART ID 到 domain 的映射。OpenSBI 默认会将 ROOT domain 分配给平台上所有 HART,因此平台支持并非必须显式配置 domain。
Domain 内存区域
一个 domain 的内存区域在 OpenSBI 中用 struct sbi_domain_memregion 表示,包含以下字段:
- order:内存区域大小为 2^order,其中 order 必须满足 3 ≤ order ≤ __riscv_xlen
- base:内存区域起始地址,必须按 2^order 对齐
- flags:表示内存类型(如 RAM 或 MMIO)以及允许的访问权限(如读、写、执行等)
Domain 实例
一个 domain 实例在 OpenSBI 中用 struct sbi_domain 表示,包含以下字段:
- index:该 domain 的逻辑索引
- name:该 domain 的名称
- assigned_harts:已分配给该 domain 的 HART 集合
- possible_harts:该 domain 可能拥有的 HART 集合
- regions:以 order=0 结尾的内存区域数组
- boot_hartid:启动该 domain 的 HART ID
- next_addr:该 domain 下一启动阶段的入口地址
- next_arg1:下一启动阶段的 a1 寄存器值
- next_mode:下一启动阶段的特权模式(可为 S-mode 或 U-mode)
- system_reset_allowed:是否允许该 domain 重置系统
- system_suspend_allowed:是否允许该 domain 挂起系统
regions 中的内存区域还需满足以下 PMP 对齐要求:
- 必须存在一个内存区域用于保护 OpenSBI 固件免受 S-mode 和 U-mode 访问
- 两个重叠的内存区域中,一个必须是另一个的子区域
- 两个重叠区域不能大小相同
- 两个重叠区域不能有相同的 flags
- 地址重叠时,优先使用最小区域的访问权限
ROOT Domain
ROOT domain 是 OpenSBI 默认创建的 domain,所有 HART 默认归属其中。其配置如下:
- index:始终为 0
- name:“root”
- assigned_harts:启动时所有有效 HART 均归属 ROOT domain,后续可由平台支持调整
- possible_harts:所有有效 HART
- regions:
- 一个区域用于保护 OpenSBI 固件
- 一个 order=__riscv_xlen 的区域允许 S-mode 和 U-mode 访问整个地址空间
- boot_hartid:冷启动 HART
- next_addr / next_arg1 / next_mode:来自冷启动 HART 的 scratch 空间
- system_reset_allowed / system_suspend_allowed:允许执行系统重置与挂起
Domain 的影响
将系统划分为多个 domain 会带来以下行为差异:
- 任何时刻,一个 HART 只能运行在一个 domain 上下文中
- HART A 发出的 SBI IPI 和 RFENCE 调用只能作用于与 HART A 同属一个 domain 的 HART
- HART A 对 HART B 的 SBI HSM 调用仅在两者属于同一 domain 时有效
- 运行在 S-mode 或 U-mode 的 HART 只能访问其所属 domain 的内存区域
Domain 设备树绑定
OpenSBI domain 可通过前一启动阶段传递的设备树(DT)描述,平台支持可从 DT 中解析并填充 domain。
Domain 配置节点
所有 domain 描述相关节点应位于 /chosen/opensbi-domains 下,节点属性包括:
- compatible(必选):必须为
"opensbi,domain,config" - system-suspend-test(可选):启用系统挂起测试(等待 5 秒后执行 WFI)
Domain 内存区域节点
描述内存区域的节点可被多个 domain 实例引用,属性包括:
- compatible(必选):
"opensbi,domain,memregion" - base(必选):64 位地址,需按 2^order 对齐
- order(必选):32 位值,范围 3 ≤ order ≤ __riscv_xlen
- mmio(可选):布尔值,表示是否为 MMIO 区域
- devices(可选):该区域内设备的 phandle 列表
Domain 实例节点
描述一个 domain 实例,属性包括:
- compatible(必选):
"opensbi,domain,instance" - possible-harts(可选):该 domain 可用的 CPU phandle 列表
- regions(可选):内存区域 phandle 与权限掩码的配对列表
- 权限位定义:
- BIT[0]:M-mode 可读
- BIT[1]:M-mode 可写
- BIT[2]:M-mode 可执行
- BIT[3]:S/U-mode 可读
- BIT[4]:S/U-mode 可写
- BIT[5]:S/U-mode 可执行
- BIT[6]:强制位(锁定 PMP 条目,需谨慎使用)
- 不能仅设置 M-mode 权限
- 权限位定义:
- boot-hart(可选):启动该 domain 的 HART
- next-arg1 / next-addr / next-mode(可选):下一启动阶段参数
- system-reset-allowed / system-suspend-allowed(可选):是否允许系统重置/挂起
分配 HART 到 Domain 实例
默认所有 HART 归属 ROOT domain。可通过在 CPU 节点中添加 opensbi-domain 属性指定归属,其值为对应 domain 实例节点的 phandle。若未指定,则归属 ROOT domain。
Domain 配置仅对 OpenSBI 可见
运行在某个 domain 中的软件应只能看到其可访问的设备与资源。为此:
- 前一启动阶段应为每个 domain 提供独立的设备树,并通过 next-arg1 指定其地址
- 若未提供独立设备树,则 OpenSBI 平台支持应在传递设备树前移除所有 domain 配置信息
更多推荐


所有评论(0)