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文章
5317瀏覽量
120010 -
內核
+關注
關注
3文章
1363瀏覽量
40228 -
Linux
+關注
關注
87文章
11229瀏覽量
208927 -
固件
+關注
關注
10文章
550瀏覽量
22971 -
RISC
+關注
關注
6文章
461瀏覽量
83654
發布評論請先 登錄
相關推薦
評論