FW_DYNAMIC固件
FW_DYNAMIC固件在运行时从上一个启动阶段获取有关下一个启动阶段的信息,例如引导加载程序或操作系统内核。
- 上一个启动阶段(即LOADER)通过
a2寄存器将struct fw_dynamic_info的位置传递给FW_DYNAMIC - 之前的启动阶段(即LOADER)需要知道
struct fw_dynamic_info
struct fw_dynamic_info {
/** Info magic */
unsigned long magic;
/** Info version */
unsigned long version;
/** Next booting stage address */
unsigned long next_addr;
/** Next booting stage mode */
unsigned long next_mode;
/** Options for OpenSBI library */
unsigned long options;
unsigned long boot_hart;
} __packed;
FW_JUMP固件
FW_JUMP固件假定下一个引导阶段的地址固定,但是不直接包含下一阶段的二进制代码,只是告诉OpenSBI,它运行完后需要到哪个地址执行。
例如,OpenSBI执行完后,需要加载kernel,而Kernel的加载地址为0x80200000,那么我们指定0x80200000为需要跳转的地址,OpenSBI执行完毕后,就会跳转到0x80200000处去加载kernel。
具体例子:
OpenSBI执行完后,去执行uboot或者kernel,假设uboot或者kernel在内存中的地址为0x80200000,则编译OpenSBI:
make PLATFORM=generic FW_JUMP_ADDR=0X80200000
在编译OpenSBI时,加入参数FW_JUMP_ADDR,即可指定需要跳转的地址。
注意, 由于OpenSBI运行在M模式下,本质上也是一个bootloader ,启动时,OpenSBI就会进行一些硬件的初始化操作,加上fw_jump固件可以指定跳转地址,因此 对于RISC-V Linux而言,OpenSBI执行完后,可以不执行uboot,直接启动kernel ,将uboot去掉,不影响RISC-V Linux正常启动。
在某些内存优化的场景下,可以考虑将uboot去掉,利用fw_jump固件直接启动kernel,从而节省内存。
FW_PAYLOAD固件
FW_PAYLOAD固件直接包含下一引导阶段的二进制代码,下一引导阶段通常是bootloader或os镜像。
不同于FW_JUMP固件的指定地址跳转,FW_PAYLOAD固件是将bootloader或os镜像直接打包进来。
具体例子:
将uboot打包进来,则编译OpenSBI:
make PLATFORM=generic FW_PAYLOAD_PATH=uboot.bin
将Linux kernel打包进来,则编译OpenSBI:
make PLATFORM=generic FW_PAYLOAD_PATH=Image
在编译OpenSBI时,加入参数FW_PAYLOAD_PATH,即可以将下一引导阶段的二进制代码打包进来。相当于将OpenSBI、uboot、kernel合并为一个文件。
实际中,我们用的更多的是FW_PAYLOAD固件,将uboot和OpenSBI一起编译。
-
寄存器
+关注
关注
31文章
5589浏览量
129068 -
内核
+关注
关注
4文章
1436浏览量
42491 -
Linux
+关注
关注
88文章
11628浏览量
217981 -
固件
+关注
关注
11文章
568浏览量
24610 -
RISC
+关注
关注
6文章
485浏览量
86102
发布评论请先 登录
意法半导体为STM32Cube生态系统新增LoRaWAN®固件无线更新支持
【「RISC-V体系结构编程与实践」阅读体验】-- SBI及NEMU环境
Lua固件是否支持上传arduino代码?
什么是固件,固件的概念
编程器固件和路由器固件什么不同
opensbi下的riscv64裸机系列编程1(串口输出)
Core 3308Y固件ROC RK3308B CC PLUS支持Docker固件
固件升级 | NDI系列产品支持NDI 5.0
Klipper固件的打印机可以插卡打印吗?
基于OpenSBI的linux nommu实现

OpenSBI支持哪些固件
评论