1. 概述
多(duo)核啟動時,通(tong)常CPU0作為(wei)主CPU,其它CPU均為(wei)從(cong)CPU,設(she)備上(shang)電后主CPU先啟動完成,再(zai)由主CPU給(gei)從(cong)CPU上(shang)電,并通(tong)知從(cong)CPU從(cong)指(zhi)定的程序入(ru)口開始(shi)執行;通(tong)常情況下,單板初始(shi)化階段由SPL、ATF、UBOOT三部分程序完成,下面(mian)就各部分的工(gong)作流程展開介(jie)紹;

2. 主CPU啟動過程
主CPU啟動(dong)流程如下圖(tu)所示(shi),系統(tong)上(shang)電后(hou)(hou)開始(shi)執行(xing)(xing)SPL程序(xu),在SPL中對必要的(de)基礎外設進(jin)行(xing)(xing)初始(shi)化(hua),并根據配置(zhi)從FLASH或(huo)者SD卡等存(cun)儲介質中load UBOOT版(ban)本到(dao)(dao)(dao)內(nei)存(cun)中,通常ATF版(ban)本和UBOOT版(ban)本打包在一(yi)起;UBOOT版(ban)本load完(wan)成后(hou)(hou)跳(tiao)轉到(dao)(dao)(dao)ATF開始(shi)執行(xing)(xing),ATF程序(xu)的(de)入(ru)口(kou)函數(shu)為(wei)bl31_entrypoint,ATF完(wan)成SMC相關命令(ling)(ling)注冊后(hou)(hou),從EL3切換到(dao)(dao)(dao)EL2狀態執行(xing)(xing)UBOOT程序(xu),UBOOT的(de)入(ru)口(kou)函數(shu)為(wei)_start,和SPL的(de)入(ru)口(kou)函數(shu)相同,這(zhe)是因為(wei)SPL和UBOOT這(zhe)部分代碼共用,部分代碼用編譯宏區(qu)分;UBOOT初始(shi)化(hua)完(wan)成后(hou)(hou)進(jin)入(ru)到(dao)(dao)(dao)main_loop,這(zhe)個時候可(ke)(ke)以(yi)進(jin)入(ru)UBOOT命令(ling)(ling)行(xing)(xing),也可(ke)(ke)以(yi)啟動(dong)os;至此(ci),主CPU已經可(ke)(ke)以(yi)正常工作;

3. 從CPU啟動過程
主CPU通(tong)過(guo)發送psci_cpu_on的(de)SMC消息,通(tong)知ATF給從CPU上電,并喚醒從CPU從指(zhi)定入(ru)口(kou)函(han)(han)(han)數(shu)開(kai)始執行(xing)(xing),入(ru)口(kou)函(han)(han)(han)數(shu)指(zhi)針作(zuo)為(wei)psci_cpu_on消息參數(shu)傳入(ru);從CPU上電起來后(hou)(hou)從SPL程序(xu)(xu)的(de)入(ru)口(kou)_start開(kai)始執行(xing)(xing),完(wan)成基(ji)本初(chu)始化后(hou)(hou),根據cpuid的(de)判斷(duan)分(fen)流,進入(ru)到(dao)從CPU的(de)代碼分(fen)支執行(xing)(xing),循環讀取CPU_RELEASE_ADDR寄存(cun)器(qi),如果非0,則跳轉(zhuan)到(dao)該地址(zhi)開(kai)始執行(xing)(xing),這個(ge)(ge)寄存(cun)器(qi)在ATF中(zhong)賦值為(wei)plat_secondary_cpus_bl31_entry函(han)(han)(han)數(shu)指(zhi)針,ATF中(zhong)會(hui)繼(ji)續跳轉(zhuan)到(dao)PLAT_SEC_ENTRY執行(xing)(xing),這個(ge)(ge)地址(zhi)在ATF中(zhong)被賦值為(wei)bl31_warm_entrypoint,然后(hou)(hou)將psci_cpu_on傳入(ru)的(de)程序(xu)(xu)入(ru)口(kou)函(han)(han)(han)數(shu)作(zuo)為(wei)上下文切換(huan)的(de)ELR,使(shi)用ERET指(zhi)令完(wan)成EL3到(dao)EL2的(de)程序(xu)(xu)跳轉(zhuan),如果時Linux操作(zuo)系統,最終會(hui)跳轉(zhuan)到(dao)sencondary_entry函(han)(han)(han)數(shu);
