optee中断处理的介绍(概念篇)
快速鏈接:
.
👉👉👉 個人博客筆記導讀目錄(全部) 👈👈👈
說明:
辣雞文章,不用看
本節介紹optee_os如何根據SMC異常和中斷通知處理世界執行上下文的切換。中斷通知是 IRQ/FIQ 異常,這也可能意味著世界執行上下文的切換:正常世界到安全世界,或安全世界到正常世界。
world context switch的用例
本節列出了 OP-TEE OS 參與世界上下文切換的所有情況。Optee_os 在安全世界中執行。世界切換由核心的安全監視器級別/模式完成,以下稱為Monitor。
當正常世界調用安全世界時,正常世界執行 SMC 指令。SMC 異常始終由監視器捕獲。如果相關服務以可信操作系統為目標,則監視器將切換到 OP-TEE 操作系統世界執行。當安全世界返回正常世界時,OP-TEE OS 執行一個 SMC,該 SMC 被監視器捕獲,監視器切換回正常世界。
當 Arm GIC 發出安全中斷信號時,它將到達 OP-TEE OS 中斷異常向量。如果安全世界正在執行,OP-TEE OS 將直接從其異常向量處理中斷。如果安全中斷引發時正常世界正在執行,則監視器向量必須處理異常并調用 OP-TEE 操作系統來服務中斷。
當 Arm GIC 發出非安全中斷信號時,它將到達正常的世界中斷異常向量。如果正常世界正在執行,它將直接處理來自其異常向量的異常。如果在非安全中斷引發時安全世界正在執行,OP-TEE OS 將通過監視器暫時返回正常世界,讓正常世界為中斷服務。
異常(中斷)向量
監視器向量VBAR_EL3位于 AArch64 和MVBARArmv7-A/AArch32 中。在正常世界或安全世界正在執行時可以訪問監視器。正在執行的安全狀態通過SCR_NS.
可以從 SMC 異常、IRQ 或 FIQ 異常(所謂的中斷)和異步中止訪問監視器。顯然,監視器中止(數據、預取、未定義)是監視器執行的本地操作。
監視器可以在 OP-TEE 操作系統的外部(案例 CFG_WITH_ARM_TRUSTED_FW=y)。如果沒有,則提供本地安全監視器core/arch/arm/sm。 Armv7-A 平臺應使用 OP-TEE OS 安全監視器。Armv8-A 平臺可能依賴Trusted Firmware A。
在監視器外執行時,系統要么在正常世界 ( SCR_NS=1) 中執行,要么在安全世界 ( SCR_NS=0) 中執行。每個世界都有自己的異常向量表(狀態向量):
- VBAR_EL2或者VBAR_EL1非安全或VBAR_EL1安全的AArch64。
- HVBAR或者VBAR非安全或VBAR安全對ARMv7-A和AArch32。
所有 SMC 異常都被捕獲在監視器向量中。IRQ/FIQ 異常可以被捕獲在監視器向量或執行世界的狀態向量中。
當正常世界執行時,系統配置為路由:
- 對將轉發到 OP-TEE OS 的監視器的安全中斷
- 對正在執行的世界異常向量的非安全中斷。
當安全世界正在執行時,系統配置為路由:
- 對正在執行的 OP-TEE 操作系統異常向量的安全和非安全中斷。OP-TEE OS 應將非安全中斷轉發到正常世界。
- Optee_os 非安全中斷總是被困在執行世界的狀態向量中。這由 的靜態值反映SCR_(IRQ|FIQ)。
Native and foreign interrupts
從 OP-TEE OS 的角度定義了兩種類型的中斷。
- Native 中斷- 由 OP-TEE OS 處理的中斷、針對 S-EL1 或安全特權模式的安全中斷
- foreign 中斷- OP-TEE OS 未處理的中斷、針對正常世界的非安全中斷或針對 EL3 的安全中斷。
對于 Arm GICv2模式,本地中斷通過 FIQ 發出信號,外部中斷通過 IRQ 發出信號。對于 Arm GICv3模式,外部中斷作為 FIQ 發出信號,可由安全世界(aarch32 監控模式或 aarch64 EL3)或正常世界處理。
可以通過設置啟用 Arm GICv3 模式CFG_ARM_GICV3=y。本機中斷必須安全地路由到 OP-TEE 操作系統。在安全世界執行期間被困的外部中斷可能需要有效地路由到正常世界。
IRQ 和 FIQ 在正常世界中保持其含義,因此為清楚起見,我們將繼續在正常世界上下文中使用這些名稱。
Normal World 使用 SMC 調用 OP-TEE OS
進入安全監視器
監視器管理安全世界的所有入口和出口。為了從正常世界進入安全世界,監視器保存正常世界的狀態(通用寄存器和未存儲的系統寄存器)并恢復以前的安全世界狀態。然后執行從異常返回并恢復恢復的安全狀態。從安全世界退出到正常世界則相反。
一些通用寄存器在進入和退出時不會保存和恢復,它們用于在安全世界和普通世界之間傳遞參數(詳細信息請參見 ARM_DEN0028A_SMC_Calling_Convention)。
Trusted OS 的進入和退出
在進入和退出 Trusted OS 時,每個 CPU 都使用單獨的入口堆棧并在 IRQ 和 FIQ 屏蔽的情況下運行。SMC 分為兩種類型:fast 和 yielding。
-
對于 fast SMCs,OP-TEE OS 將在 entry stack上執行,并屏蔽 IRQ/FIQ,直到執行返回到正常世界。
-
yielding SMCs,OP-TEE OS 將在某個時候執行請求的服務,并且中斷未屏蔽。為了處理中斷,主要是外來中斷的轉發,OP-TEE OS為SMC請求分配了一個可信線程(core/arch/arm/kernel/thread.c)。受信線程存儲所請求服務的執行上下文。當請求的服務執行和被中斷時,這個上下文可以被掛起和恢復。只有在服務執行返回完成狀態時才釋放受信任線程。
為了產生SMC,OP-TEE OS 分配或恢復受信任的線程,然后取消屏蔽 IRQ 和 FIQ 線。當 OP-TEE OS 需要從外部中斷或遠程服務調用調用正常世界時,OP-TEE OS 會屏蔽 IRQ 和 FIQ 并掛起受信任的線程。掛起時,OP-TEE OS 返回到入口堆棧。 -
這兩個快速產生的SMC結束與IRQ和FIQ進入堆棧蒙面OP-TEE OS將調用監控通過SMC返回到正常的世界。
-
fast 和yielding SMCs在進入optee時的entry stack上,IRQ 和 FIQ都是屏蔽的。OP-TEE OS通過調用smc進入Monitor再返回normal world。
總結
以上是生活随笔為你收集整理的optee中断处理的介绍(概念篇)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 防止Stack smash的技术
- 下一篇: [architecture]-ARM S