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文章
5607瀏覽量
129760 -
內核
+關注
關注
4文章
1466瀏覽量
42748 -
Linux
+關注
關注
88文章
11746瀏覽量
218828 -
固件
+關注
關注
11文章
569瀏覽量
24824 -
RISC
+關注
關注
6文章
485瀏覽量
86442
發布評論請先 登錄
【「RISC-V體系結構編程與實踐」閱讀體驗】-- SBI及NEMU環境
Lua固件是否支持上傳arduino代碼?
什么是固件,固件的概念
編程器固件和路由器固件什么不同
opensbi下的riscv64裸機系列編程1(串口輸出)
CycurHSM安全固件支持車聯網聯盟數字密鑰規范
Core 3308Y固件ROC RK3308B CC PLUS支持Docker固件
固件升級 | NDI系列產品支持NDI 5.0
Klipper固件的打印機可以插卡打印嗎?
基于OpenSBI的linux nommu實現
OpenSBI支持哪些固件
評論