1 OP-TEE OS的入口函數(shù)
- ? OP-TEE鏡像的入口函數(shù)是在編譯OP-TEE OS時(shí)通過(guò)鏈接文件來(lái)確定的,
- ? OP-TEE在編譯時(shí)是按照optee_os/core/arch/arm/kernel/kern.ld.S文件鏈接生成OP-TEE OS的鏡像文件,
- ? 在kern.ld.S文件中通過(guò)ENTRY宏來(lái)指定OP-TEE OS的入口函數(shù),在OP-TEE中指定的入口函數(shù)是_start,
- ? 對(duì)于ARM32位系統(tǒng),該函數(shù)定義在optee_os/core/arch/arm/generic_entry_a32.S文件中,
- ? 對(duì)于ARM64位系統(tǒng)而言,該函數(shù)定義在optee_os/core/arch/arm generic_entry_a64.S文件中。
2 OP-TEE的內(nèi)核初始化過(guò)程
** _start會(huì)調(diào)用reset函數(shù)進(jìn)入OP-TEE OS的啟動(dòng)過(guò)程**。
由于對(duì)稱多處理(Symmetr ical Multi-Processing, SMP)架構(gòu)的原因,在reset函數(shù)中會(huì)對(duì)主核和從核進(jìn)行不同的啟動(dòng)操作,分別調(diào)用reset_primary函數(shù)和reset_secondary函數(shù)來(lái)完成。
1. reset入口函數(shù)執(zhí)行內(nèi)容
reset函數(shù)是主核和從核啟動(dòng)的第一個(gè)函數(shù),該函數(shù)的執(zhí)行流程如圖所示。
reset函數(shù)執(zhí)行流程
進(jìn)入到reset函數(shù)后, 系統(tǒng)會(huì)將_start的地址寫入VBAR寄存器作為中斷向量表的起始地址使用 ,
在啟動(dòng)從核時(shí), 從核知道會(huì)到該地址去獲取應(yīng)該執(zhí)行代碼來(lái)完成從核的啟動(dòng) 。整個(gè)reset函數(shù)的內(nèi)容和注釋如下:
LOCAL_FUNC reset , :
UNWIND( .fnstart)
UNWIND( .cantunwind)
bootargs_entry //獲取啟動(dòng)帶入的參數(shù),主要是啟動(dòng)地址、device tree地址等
/* 使能對(duì)齊檢查并禁用數(shù)據(jù)和指令緩存 */
read_sctlr r0 //讀取sctlr中的數(shù)據(jù),獲取當(dāng)前CPU控制寄存器中的值
#if defined(CFG_SCTLR_ALIGNMENT_CHECK)
orr r0, r0, #SCTLR_A //設(shè)定對(duì)齊校驗(yàn)
#else
bic r0, r0, #SCTLR_A
#endif
bic r0, r0, #SCTLR_C //關(guān)閉數(shù)據(jù)cache
bic r0, r0, #SCTLR_I //關(guān)閉指令cache
#if defined(CFG_HWSUPP_MEM_PERM_WXN) && defined(CFG_CORE_RWDATA_NOEXEC)
orr r0, r0, #(SCTLR_WXN | SCTLR_UWXN)
#endif
write_sctlr r0 //將r0寫入到sctlr中,用于關(guān)閉cache
isb
/* 早期ARM核安全監(jiān)控模式態(tài)的特殊配置 */
bl plat_cpu_reset_early //執(zhí)行CPU早期初始化
ldr r0, =_start //設(shè)定r0寄存器的值為_start函數(shù)的地址
write_vbar r0 //將_start函數(shù)的地址寫入VBAR寄存器中,用于啟動(dòng)時(shí)使用
#if defined(CFG_WITH_ARM_TRUSTED_FW)
b reset_primary //支持ATF時(shí)跳轉(zhuǎn)到reset_primary中執(zhí)行
#else
bl get_core_pos //判定當(dāng)前CPU CORE的編號(hào)
cmp r0, #0 //將獲得的CPU編號(hào)與0對(duì)比
beq reset_primary //如果當(dāng)前core是主核,則使用reset_primary進(jìn)行初始化
b reset_secondary //如果當(dāng)前core是從核,則使用reset_secondary進(jìn)行初始化
#endif
UNWIND( .fnend)
END_FUNC reset
plat_cpu_reset_early函數(shù)將會(huì)設(shè)定SCR寄存器中的安全標(biāo)志位 ,用于標(biāo)記當(dāng)前CPU是處于安全世界狀態(tài)中,并且將_start地址寫入VBAR寄存器,用于在需要啟動(dòng)從核時(shí)系統(tǒng)能找到啟動(dòng)代碼的入口地址,
reset_primary函數(shù)是主核啟動(dòng)代碼的入口函數(shù),該函數(shù)將會(huì)啟動(dòng)主核的基本初始化、配置運(yùn)行環(huán)境,然后再開始執(zhí)行喚醒從核的操作。
- ? 對(duì)于從核的喚醒操作,如果系統(tǒng)支持PSCI,從核的喚醒是在REE OS啟動(dòng)時(shí) ,發(fā)送PSCI給EL3或Monitor模式的代碼來(lái)啟動(dòng)從核;
- ? 如果不使用PSCI,而是選擇在OP-TEE中使能CFG_SYNC_BOOT_CPU,則OP-TEE會(huì)在主核啟動(dòng)結(jié)束后喚醒從核。
-
寄存器
+關(guān)注
關(guān)注
31文章
5402瀏覽量
122869 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4365瀏覽量
63908 -
架構(gòu)
+關(guān)注
關(guān)注
1文章
525瀏覽量
25815 -
TEE
+關(guān)注
關(guān)注
0文章
29瀏覽量
10414
發(fā)布評(píng)論請(qǐng)先 登錄
請(qǐng)問(wèn)Beal環(huán)境下編譯OP-TEE后生成FIP需要哪些文件?
請(qǐng)問(wèn)HSE op-tee是什么關(guān)系?
OP-TEE無(wú)法在鎖定的i.MX6UL上初始化JR怎么解決?
LINUX系統(tǒng)引導(dǎo)和初始化-LINUX內(nèi)核解讀
解析內(nèi)核初始化時(shí)根內(nèi)存盤的加載過(guò)程
uboot和內(nèi)核里phy的初始化_內(nèi)核里的雙網(wǎng)絡(luò)配置及phy的初始化
Linux內(nèi)核初始化過(guò)程中的調(diào)用順序
Armlinux內(nèi)核移植及系統(tǒng)初始化過(guò)程分析
OP-TEE中安全驅(qū)動(dòng)的框架

OP-TEE的內(nèi)核初始化函數(shù)調(diào)用

OP-TEE服務(wù)項(xiàng)的啟動(dòng)
ARM64位與ARM32位OP-TEE啟動(dòng)過(guò)程的差異
ATF中bl32的啟動(dòng)方法

OP-TEE的安全存儲(chǔ)的簡(jiǎn)介

OP-TEE安全存儲(chǔ)安全文件的格式

評(píng)論