1 OP-TEE OS的入口函數
- ? OP-TEE鏡像的入口函數是在編譯OP-TEE OS時通過鏈接文件來確定的,
- ? OP-TEE在編譯時是按照optee_os/core/arch/arm/kernel/kern.ld.S文件鏈接生成OP-TEE OS的鏡像文件,
- ? 在kern.ld.S文件中通過ENTRY宏來指定OP-TEE OS的入口函數,在OP-TEE中指定的入口函數是_start,
- ? 對于ARM32位系統,該函數定義在optee_os/core/arch/arm/generic_entry_a32.S文件中,
- ? 對于ARM64位系統而言,該函數定義在optee_os/core/arch/arm generic_entry_a64.S文件中。
2 OP-TEE的內核初始化過程
** _start會調用reset函數進入OP-TEE OS的啟動過程**。
由于對稱多處理(Symmetr ical Multi-Processing, SMP)架構的原因,在reset函數中會對主核和從核進行不同的啟動操作,分別調用reset_primary函數和reset_secondary函數來完成。
1. reset入口函數執行內容
reset函數是主核和從核啟動的第一個函數,該函數的執行流程如圖所示。

reset函數執行流程
進入到reset函數后, 系統會將_start的地址寫入VBAR寄存器作為中斷向量表的起始地址使用 ,
在啟動從核時, 從核知道會到該地址去獲取應該執行代碼來完成從核的啟動 。整個reset函數的內容和注釋如下:
LOCAL_FUNC reset , :
UNWIND( .fnstart)
UNWIND( .cantunwind)
bootargs_entry //獲取啟動帶入的參數,主要是啟動地址、device tree地址等
/* 使能對齊檢查并禁用數據和指令緩存 */
read_sctlr r0 //讀取sctlr中的數據,獲取當前CPU控制寄存器中的值
#if defined(CFG_SCTLR_ALIGNMENT_CHECK)
orr r0, r0, #SCTLR_A //設定對齊校驗
#else
bic r0, r0, #SCTLR_A
#endif
bic r0, r0, #SCTLR_C //關閉數據cache
bic r0, r0, #SCTLR_I //關閉指令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中,用于關閉cache
isb
/* 早期ARM核安全監控模式態的特殊配置 */
bl plat_cpu_reset_early //執行CPU早期初始化
ldr r0, =_start //設定r0寄存器的值為_start函數的地址
write_vbar r0 //將_start函數的地址寫入VBAR寄存器中,用于啟動時使用
#if defined(CFG_WITH_ARM_TRUSTED_FW)
b reset_primary //支持ATF時跳轉到reset_primary中執行
#else
bl get_core_pos //判定當前CPU CORE的編號
cmp r0, #0 //將獲得的CPU編號與0對比
beq reset_primary //如果當前core是主核,則使用reset_primary進行初始化
b reset_secondary //如果當前core是從核,則使用reset_secondary進行初始化
#endif
UNWIND( .fnend)
END_FUNC reset
plat_cpu_reset_early函數將會設定SCR寄存器中的安全標志位 ,用于標記當前CPU是處于安全世界狀態中,并且將_start地址寫入VBAR寄存器,用于在需要啟動從核時系統能找到啟動代碼的入口地址,
reset_primary函數是主核啟動代碼的入口函數,該函數將會啟動主核的基本初始化、配置運行環境,然后再開始執行喚醒從核的操作。
- ? 對于從核的喚醒操作,如果系統支持PSCI,從核的喚醒是在REE OS啟動時 ,發送PSCI給EL3或Monitor模式的代碼來啟動從核;
- ? 如果不使用PSCI,而是選擇在OP-TEE中使能CFG_SYNC_BOOT_CPU,則OP-TEE會在主核啟動結束后喚醒從核。
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
寄存器
+關注
關注
31文章
5608瀏覽量
129993 -
函數
+關注
關注
3文章
4417瀏覽量
67509 -
架構
+關注
關注
1文章
532瀏覽量
26590 -
TEE
+關注
關注
0文章
30瀏覽量
10682
發布評論請先 登錄
相關推薦
熱點推薦
請問Beal環境下編譯OP-TEE后生成FIP需要哪些文件?
stm32mp157d-***-bl32.dtb fip.bin但是當我使用 OP-TEE 時,我使用以下命令:fiptool 創建 --tos-fw tee
發表于 12-05 07:06
請問HSE op-tee是什么關系?
我有個問題。S32G同時支持HSE和op-tee。S32G的安全加解密和證書管理是通過HSE完成的嗎?op-tee 和 HSE 只是其中之一嗎?有沒有相關的設計文檔?謝謝
發表于 04-06 06:26
OP-TEE無法在鎖定的i.MX6UL上初始化JR怎么解決?
imx 存儲庫,而 U-boot 來自主線存儲庫 (2023.1)在我們鎖定設備之前,這似乎工作正常。鎖定設備后,我們在 OP-TEE 初始化時得到以下輸出(啟用了一些額外的跟蹤消息):E/TC:0 0
發表于 04-17 07:31
解析內核初始化時根內存盤的加載過程
到內存盤中作為根盤。 當同時配置了初始化內存盤(Initail RAM Disk)時, 內核在初始化時可以在安裝主盤之前, 通過引導程序所加載的initrd文件建立一個內存初始化盤,
發表于 11-08 10:40
?0次下載
uboot和內核里phy的初始化_內核里的雙網絡配置及phy的初始化
uboot 和內核里 phy 的初始化,以及內核里的雙網絡配置及 phy 的初始化。 本文以盈鵬飛嵌入式的CoM-335x(基于AM335x)核心板及網絡芯片LAN8720 為例,說明
Linux內核初始化過程中的調用順序
所有的__init函數在區段.initcall.init中還保存了一份函數指針,在初始化時內核會通過這些函數指針調用這些__init函數指針,并在整個初始化完成后,釋放整個init區段(包括.init.text,.initcal
發表于 05-12 08:40
?2019次閱讀
OP-TEE中安全驅動的框架
OP-TEE中的安全驅動是OP-TEE操作安全設備的載體。 TA通過調用某個安全驅動的接口就可實現對特定安全設備的操作。安全驅動在OP-TEE中的軟件框架如圖22-2所示。 (其實這里,你要搞清楚
OP-TEE的內核初始化函數調用
generic_boot_init_primary函數內容 generic_boot_init_primary函數是OP-TEE建立系統運行環境的入口函數,該函數會進行建立線程運行空間、初始化
OP-TEE服務項的啟動
OP-TEE服務項的啟動分為: service_init以及service_init_late ,需要被啟動的服務項通過使用這兩個宏,在編譯時,相關服務的內容將會被保存到initcall1
ARM64位與ARM32位OP-TEE啟動過程的差異
進入reset中去執行OP-TEE啟動,而是直接在_start函數中就完成整個啟動過程, 在進行初始化操作之前會注冊一個異常向量表,該異常向量表會在喚醒從核階段被使用,當主核通知喚醒從核時,從核會查找
OP-TEE的安全存儲的簡介
OP-TEE的安全存儲的簡介 OP-TEE的安全存儲功能是OP-TEE為用戶提供的安全存儲機制。用戶可使用安全存儲功能來保存敏感數據、密鑰等信息。 使用OP-TEE安全存儲功能保存數據
OP-TEE安全存儲安全文件的格式
安全文件、dirf.db文件的數據格式和操作過程 OP-TEE的安全存儲功能可滿足用戶保存敏感數據的需求,需要被保存的數據會被加 密保存到文件系統或RPMB分區中 。 當選擇將數據保存到文件系統中
OP-TEE的內核初始化過程
評論