uboot
- U-Boot作为OpenSBI的有效负载
- 构建和生成U-Boot映像
Linux
- Linux作为OpenSBI的直接有效负载
FW_DYNAMIC 带有动态信息的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_JUMP 带有跳转地址的OpenSBI固件(FW_JUMP)是一个只处理下一个启动阶段入口地址的固件,例如引导加载程序或操作系统内核,而不直接包含下一个启动阶段的二进制代码。
- FW_JUMP编译
- 在make命令行中指定FW_JUMP=y。
- 在目标平台配置文件config.mk中指定FW_JUMP=y。
- FW_JUMP固件配置选项
- FW_JUMP_ADDR - 要在 OpenSBI 固件之后执行的引导阶段入口点的地址。 该地址通常与加载下一个引导阶段的地址完全对应。 这是一个强制参数。 未定义此地址将导致编译错误。
- FW_JUMP_FDT_ADDR - 在执行 OpenSBI 固件之后的引导阶段之前,之前引导阶段传递的扁平设备树(FDT 文件)将被放置在内存中的地址。 如果未提供此选项,则 OpenSBI 固件会将前一个引导阶段传递的 FDT 地址传递给下一个引导阶段。
- FW_JUMP例子
FW_PAYLOAD 带有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_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
- 【risc-v|OpenSBI payload】FW_PAYLOAD_PATH -下一个启动阶段二进制文件的映像文件路径。如果没有提供此选项,那么将自动生成一个简单的测试有效载荷,并将其用作有效载荷。这个测试有效负载在平台控制台上打印消息后执行一个无限的while(1)循环。
- FW_PAYLOAD_FDT_ADDR - 在执行下一个引导阶段(即有效负载固件)之前,将放置由先前引导阶段传递或由 FW_FDT_PATH 参数指定并嵌入在 .rodata 部分中的 FDT 的地址。 如果未提供此选项,则固件会将前一个引导阶段传递的 FDT 地址传递到下一个引导阶段。
- FW_PAYLOAD例子