bl2_main函數
bl2_main函數完成了bl2階段的主要操作,包括
- ? 對下一個階段鏡像文件的解析、
- ? 獲取入口地址和鏡像文件大小等信息,
- ? 然后對鏡像文件進行驗簽和加載操作。
- ? 將bl31加載到內存中后會觸發安全監控模式調用(smc)將CPU權限轉交給bl31。
該函數的主要內容和相關注釋如下:
** void bl2_main(void)
{
entry_point_info_t *next_bl_ep_info;
bl2_arch_setup(); //執行平臺相關初始化
#if TRUSTED_BOARD_BOOT
/* Initialize authentication module */
auth_mod_init(); //初始化image驗證模塊
#endif /* TRUSTED_BOARD_BOOT */
//加載bl3x image到RAM中并返回bl31的入口地址
next_bl_ep_info = bl2_load_images();
#ifdef AARCH32
disable_mmu_icache_secure(); //禁止MMU的指令cache
#endif /* AArch32 */
console_flush(); //刷新console操作
/* 調用smc指令,觸發在bl1中設定的smc異常中斷處理函數,跳轉到bl31 */
smc(BL1_SMC_RUN_IMAGE, (unsigned long)next_bl_ep_info, 0, 0, 0, 0,0, 0);
}**
bl2_load_images函數
bl2_load_images函數完成將bl32和bl33的鏡像文件加載到內存中并返回bl31鏡像的入口地址,最終在bl2_main函數中通過觸發安全監控模式調用(smc)跳轉到bl31,并將CPU控制權限交給bl31。
該函數的主要內容和注釋如下:
entry_point_info_t *bl2_load_images(void)
{
bl_params_t *bl2_to_next_bl_params;
bl_load_info_t *bl2_load_info;
const bl_load_info_node_t *bl2_node_info;
int plat_setup_done = 0;
int err;
/* 獲取bl3x image的加載和入口函數信息 */
bl2_load_info = plat_get_bl_image_load_info();
/* 檢查返回的bl2_load_info中的信息是否正確 */
assert(bl2_load_info);
assert(bl2_load_info- >head);
assert(bl2_load_info- >h.type == PARAM_BL_LOAD_INFO);
assert(bl2_load_info- >h.version >= VERSION_2);
/* 將bl2_load_info中的head變量的值賦值為bl2_node_info,即將bl31 image的入口信息
傳遞給bl2_node_info變量 */
bl2_node_info = bl2_load_info- >head;
/* 進入loop循環 */
while (bl2_node_info) {
/* 在加載特定的bl3x image到RAM之前先確定是否需要進行平臺的初始化 */
if (bl2_node_info- >image_info- >h.attr & IMAGE_ATTRIB_PLAT_SETUP) {
if (plat_setup_done) {
WARN("BL2: Platform setup already done! ! n");
} else {
INFO("BL2: Doing platform setupn");
bl2_platform_setup();
plat_setup_done = 1;
}
}
/* 對bl3x image進行電子驗簽,如果通過則執行加載操作 */
if (! (bl2_node_info- >image_info- >h.attr & IMAGE_ATTRIB_SKIP_LOADING)) {
INFO("BL2: Loading image id %dn", bl2_node_info- >image_id);
err = load_auth_image(bl2_node_info- >image_id,
bl2_node_info- >image_info);
if (err) {
ERROR("BL2: Failed to load image (%i)n", err);
plat_error_handler(err);
}
} else {
INFO("BL2: Skip loading image id %dn", bl2_node_info- >image_id);
}
/* 可以根據實際需要更改,通過給定image ID來更改image的加載信息 */
err = bl2_plat_handle_post_image_load(bl2_node_info- >image_id);
if (err) {
ERROR("BL2: Failure in post image load handling (%i)n", err);
plat_error_handler(err);
}
bl2_node_info = bl2_node_info- >next_load_info;
}
/* 獲取下一個執行的鏡像的入口信息,并且將以后會被執行的鏡像的入口信息組合成鏈表,通過判斷
image des中的ep_info.h.attr的值是否為(EXECUTABLE|EP_FIRST_EX)來確定接下來第一個
被執行的image*/
bl2_to_next_bl_params = plat_get_next_bl_params();
assert(bl2_to_next_bl_params);
assert(bl2_to_next_bl_params- >head);
assert(bl2_to_next_bl_params- >h.type == PARAM_BL_PARAMS);
assert(bl2_to_next_bl_params- >h.version >= VERSION_2);
plat_flush_next_bl_params();
/* 返回下一個進入的鏡像的入口信息,即bl31的入口信息 */
return bl2_to_next_bl_params- >head- >ep_info;
}
bl3x鏡像文件信息
ATF使用bl_mem_params_node_t結構體變量數組bl_mem_params_desc_ptr來保存bl3x鏡像文件的信息。該結構體內容如下:
typedef struct bl_mem_params_node {
unsigned int image_id; //鏡像文件的id值
image_info_t image_info; //鏡像文件的信息
entry_point_info_t ep_info; //bl3x的入口地址信息
unsigned int next_handoff_image_id; //寫一個階段bl3x的id值
bl_load_info_node_t load_node_mem; //該鏡像文件需要被保存在RAM中的信息
bl_params_node_t params_node_mem; //該鏡像文件啟動時所需參數在RAM中的信息
} bl_mem_params_node_t;
在bl2_load_images函數中通過調用plat_get_bl_image_load_info函數來獲取bl3x鏡像文件的信息,ATF源代碼中通過使用REGISTER_BL_IMAGE_DESCS宏將事先定義好的bl2_mem_params_descs變量中的數據保存到bl_mem_params_desc_ptr數組中,而bl2_mem_params_descs中保存的就是所有bl3x鏡像文件的基本信息,開發者可根據不同平臺的實際情況修改bl2_mem_params_descs變量中各鏡像文件的信息。
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
內存
+關注
關注
9文章
3209瀏覽量
76357 -
函數
+關注
關注
3文章
4417瀏覽量
67499 -
變量
+關注
關注
0文章
616瀏覽量
29505
發布評論請先 登錄
相關推薦
熱點推薦
BL2 在跳轉到 BL31 之前掛起 — 訓練后出現 DDR PHY (0x01400000) 訪問問題,求解
BL2 中訓練后,如何啟用對 DDR PHY 寄存器區域(0x01400000 基)的訪問?
是否需要特定的序列或 MMU 映射配置才能使該區域可訪問?
附件:
bl2_boot_log.txt(
發表于 03-03 06:34
【NanoPi M2試用體驗】+SD卡啟動BL1拷貝BL2到DDR2中運行
裸機程序SD卡啟動BL1拷貝BL2到DDR2中運行;代碼的拷貝會用到一些指針函數,第一個參數為
發表于 06-11 17:03
如何在BL2中配置DDR init?
:2022 年 10 月 25 日 18:55:21錯誤:BL2:加載圖像失敗(-2)身份驗證失敗我認為我們必須更改 atf\plat\nxp\soc-ls1046\ls1046ardb\ddr_init.c
發表于 03-24 08:50
S32g如何在ATF中啟用安全啟動?
/cortexa53-wrs-linux/atf-s32g/2.5-r0/build/batman/release /bl2/bl2_main.o:在函數“
發表于 04-03 07:12
Yocto LS1028定制板用BL2,為了使DDR工作是否需要編輯ddr_init.c中的任何其他函數/值或ATF源中的任何其他文件??
了 BUILD_STRING = \"custom\" 選項來檢查我正在運行的 BL2 是否是我的。
為了使 DDR 工作,我是否需要編輯 ddr_init.c 中的任何其他函數/值或AT
發表于 06-01 09:03
ATF中bl2到bl31的跳轉介紹
之后,系統將跳轉到中斷處理函數(smc_handler64)繼續執行。該函數定義在bl1/aarch64/bl1_exception.S文件中
uboot的啟動BL1和BL2兩個階段介紹
之前對這個uboot的源碼了解有些許遺忘。最近做AVB校驗,需要uboot到kernel的這個過程。這里再復習一下。 與大多數BootLoader一樣,uboot的啟動過程分為BL1和BL2兩個階段
ATF中如何用函數完成bl2的啟動
評論