我一直在尝试 RISC-V 模拟器、QEMU 和 mini-rv32ima,并接触到了 OpenSBI。该项目将自己定义为:
RISC-V 管理程序二进制接口 (SBI) 是以下之间的推荐接口:...
- 在 HS 模式下运行的虚拟机管理程序和在 VS 模式下执行的引导加载程序或通用操作系统。
OpenSBI 项目的目标是为特定于平台的固件提供 RISC-V SBI 规范的开源参考实现
深入挖掘一下,您会发现 OpenSBI 被部署为在引导加载程序之前运行的二进制文件。来自这个指南:
QEMU -- passes dtb --> OpenSBI -- passes dtb -->
U-Boot -- parses dtb > finds disk > partitions > filesystem > kernel file
从较高的层面来看,OpenSBI 在此部署中提供了哪些功能?
具体而言,Linux 已经可以读取设备树文件,并且模拟器可以在该内存地址模拟外围设备(
mini-rv32ima.c
通过模拟 UART 8250/16550 非常清楚地显示了这一点)。 Linux 设备驱动程序本质上定义了二进制接口,模拟器则实现它。 OpenSBI 是否增强了这个接口,或者在未来允许更高的性能或灵活性?它还有其他作用吗?
来自 RISC-V 监控二进制接口规范:
的 SBI 允许管理模式(S 模式或 VS 模式)软件在所有 RISC-V 之间移植 通过定义平台(或虚拟机管理程序)特定功能的抽象来实现。
OpenSBI 是 SBI 规范的实现,提供了各种常见平台元素的抽象 - 特别是那些对于启动过程很重要的元素 - 例如 UART、定时器等。
以您的示例为例,平台上存在哪种 UART 的 type 并不重要。 OpenSBI 将所有类型的 UART 抽象为通用控制台 API。
操作系统内核使用该 API 来实现可在任何 SBI 兼容平台上运行的 SBI UART 驱动程序。即使 UART 的“类型”(制造商/型号/设计)不同,相同的 SBI UART 驱动程序也可以工作。这对于平台启动诊断等方面有很大帮助。 当然,这并不普遍适用,通常用于启动所需的极少且重要的外设集。
请注意,仍然需要 DeviceTree 来帮助识别(并在需要时定位)SBI 兼容设备。