U-Boot是一个开源的主引导加载程序。在嵌入式环境中,它可以用作第一和/或第二阶段引导加载程序。在OpenSBI环境中,U-Boot可以被指定为OpenSBI固件的负载,成为OpenSBI固件执行之后的启动阶段。
关于如何从U-Boot提示符构建U-Boot映像和引导高级操作系统的详细说明,请参阅U-Boot构建文档。
OpenSBI能够在S-mode下直接加载Linux内核映像。由Linux内核构建过程生成的flattened image 可以作为OpenSBI的有效负载提供。详细的例子可以在QEMU和HiFive Unleashed平台指南中找到。
带有动态信息的OpenSBI固件(FW_DYNAMIC)是一个可以获取下一个启动阶段(例如引导加载程序或操作系统)和运行时OpenSBI库选项的固件。
上一个启动阶段会在内存中创建fw_dynamic_info结构体,并将其地址通过RISC-V CPU的a2寄存器传递给FW_DYNAMIC。地址在RV64上必须对齐为8字节,在RV32上必须对齐为4字节。
一个平台可以通过以下任何一种方式启用FW_DYNAMIC固件。
在make命令行中指定FW_DYNAMIC=y。
在目标平台配置文件config.mk中指定FW_DYNAMIC=y。
FW_DYNAMIC Firmware配置选项
FW_DYNAMIC固件不需要任何特定平台的配置参数,因为所有必需的信息都是在运行时通过struct fw_dynamic_info在上一个启动阶段传递的。
带有跳转地址的OpenSBI固件(FW_JUMP)是一个只处理下一个启动阶段入口地址的固件,例如引导加载程序或操作系统内核,而不直接包含下一个启动阶段的二进制代码。
一个平台可以通过以下任何一种方式启用FW_JUMP固件。
在make命令行中指定FW_JUMP=y。
在目标平台配置文件config.mk中指定FW_JUMP=y。
编译后的FW_JUMP固件ELF文件命名为FW_JUMP.ELF。其扩展镜像文件为fw_jump.bin。这两个文件都创建在build/platform/<platform_subdir>/firmware目录下的特定于平台的构建目录中。
为了正确运行,FW_JUMP 固件需要使用顶级 make 命令行或目标平台 config.mk 配置文件定义一些配置参数。可能的参数如下:
FW_JUMP_ADDR - 要在 OpenSBI 固件之后执行的引导阶段入口点的地址。 该地址通常与加载下一个引导阶段的地址完全对应。 这是一个强制参数。 未定义此地址将导致编译错误。
FW_JUMP_FDT_ADDR - 在执行 OpenSBI 固件之后的引导阶段之前,之前引导阶段传递的扁平设备树(FDT 文件)将被放置在内存中的地址。 如果未提供此选项,则 OpenSBI 固件会将前一个引导阶段传递的 FDT 地址传递给下一个引导阶段。
qemu/virt平台介绍了如何配置和使用FW_JUMP的固件
带有Payload (FW_PAYLOAD)的OpenSBI固件是一个直接包含启动阶段的二进制文件的固件,在OpenSBI固件执行之后。通常,这个有效负载将是一个引导加载程序或一个OS内核。
当在 OpenSBI 固件之前执行的引导阶段不能同时加载 OpenSBI 固件和跟随 OpenSBI 固件的引导阶段时,FW_PAYLOAD 固件特别有用。
FW_PAYLOAD 固件也适用于 OpenSBI 固件之前的引导阶段未传递扁平设备树(FDT 文件)的情况。 在这种情况下,FW_PAYLOAD 固件允许在最终固件的 .text 部分中嵌入扁平设备树。
一个平台可以通过以下任何一种方式启用FW_PAYLOAD固件。
在make命令行中指定FW_PAYLOAD=y。
在目标平台配置文件config.mk中指定FW_PAYLOAD=y。
编译后的FW_PAYLOAD固件ELF文件命名为fw_payload.elf。它的扩展镜像文件是fw_payload.bin。这两个文件都创建在build/platform/<platform_subdir>/firmware目录下的特定于平台的构建目录中。
FW_PAYLOAD_OFFSET - 与 FW_TEXT_BASE 的偏移量。其中有效负载二进制文件将链接到最终的 FW_PAYLOAD 二进制固件镜像中。 如果未定义 FW_PAYLOAD_ALIGN,则此配置参数是必需的。 编译错误将由 FW_PAYLOAD_OFFSET 或 FW_PAYLOAD_ALIGN 的错误定义导致,或者如果这些参数均未定义。
FW_PAYLOAD_ALIGN - 地址对齐约束,其中有效负载二进制文件将在FW_PAYLOAD 固件中的base固件结束后链接。 如果未定义 FW_PAYLOAD_OFFSET,则此配置参数是必需的。 如果同时定义了 FW_PAYLOAD_OFFSET 和 FW_PAYLOAD_ALIGN,则使用 FW_PAYLOAD_OFFSET 而忽略 FW_PAYLOAD_ALIGN
FW_PAYLOAD_PATH -下一个启动阶段二进制文件的映像文件路径。如果没有提供此选项,那么将自动生成一个简单的测试有效载荷,并将其用作有效载荷。这个测试有效负载在平台控制台上打印消息后执行一个无限的while(1)循环。
FW_PAYLOAD_FDT_ADDR - 在执行下一个引导阶段(即有效负载固件)之前,将放置由先前引导阶段传递或由 FW_FDT_PATH 参数指定并嵌入在 .rodata 部分中的 FDT 的地址。 如果未提供此选项,则固件会将前一个引导阶段传递的 FDT 地址传递到下一个引导阶段。