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文章
5363浏览量
121080 -
内核
+关注
关注
3文章
1382浏览量
40405 -
Linux
+关注
关注
87文章
11342浏览量
210298 -
固件
+关注
关注
10文章
561浏览量
23147 -
RISC
+关注
关注
6文章
465浏览量
83843
发布评论请先 登录
相关推荐
评论