引言
STM32 MCU 中較新的產品系列例如 STM32L5、STM32U5 采用了 ARM Cortex V8M 的CM33 內核,并引入了 TrustZone 概念。在此基礎上,從內核到存儲器再到外設等設計了完整的支持 TrustZone 架構的系統(tǒng)隔離機制。
在新的 TrustZone 架構下,軟件的開發(fā)由原來的單一工程,變成了 Secure 安全和NonSecure 非安全兩個工程的聯(lián)合開發(fā),系統(tǒng)上電首先從 Secure 工程開始運行,完成必要初始化之后跳轉至 NonSecure 工程運行,之后 NonSecure 工程還可以通過調用 Secure 工程經由 NSC(Secure NonSecure Callable)區(qū)提供的 API 調用 Secure 工程的函數。由于此時系統(tǒng)的所有資源,包括 Memory、外設等等都區(qū)分了安全和非安全屬性,而CPU 也區(qū)分安全和非安全運行狀態(tài),其對應的安全或非安全代碼及其使用的數據都需要有相應的存儲空間存放,且該存儲空間需要具有相同的安全或者非安全屬性,否則代碼無法正常運行。因此,在 TrustZone 架構下首先需要針對不同物理區(qū)間做地址安排及相應安全屬性的正確配置。對于 V8M 內核來說,這涉及到 SAU/IDAU 的配置,且取指令與取數據可能有不同的訪問規(guī)則,同時指令以及數據是否能夠從 memory 中正確取得,除了和 SAU/IDAU 的配置有關以外,還與 Memory 自身的安全屬性配置有關。
本文將對 SAU/IDAU 配置,Memory 的自身安全屬性配置,以及內核訪問指令與數據時的安全訪問規(guī)則加以闡述,希望可以幫助相關開發(fā)者更好地理解 V8M TrustZone 的架構以及在 STM32 中的實現,同時,還會列舉一些與 memory 的 TrustZone 安全配置相關的常見問題及分析方法,給開發(fā)者做參考。
CM33 內核的安全擴展
CM33 內核使用 AHB5 總線,具有可選安全擴展(Security Extension)功能。使能安全擴展的內核則支持 V8M TrustZone 架構,此時 AHB5 總線上將攜帶安全訪問標記信號(HNONSEC),這個標記將指示當前訪問的 Transaction 是安全訪問還是非安全訪問,總線上的從設備需要識別這個標記信號,根據 Transaction 攜帶的安全、非安全權限信息,決定是
否允許最終的物理訪問。
內核的安全擴展除了總線攜帶的安全標記信號以外,還包括 CPU 本身的安全/非安全運行狀態(tài),有對應安全/非安全狀態(tài)的 CPU 寄存器(例如各自的 stack pointer MSP 和PSP),中斷等等。
內核的 SAU 與 IDAU
SAU 是 CM33 內核的單元,負責內核對地址的安全訪問控制。IDAU 同樣作為內核安全訪問控制的一部分,與 SAU 共同作用,只不過 IDAU 是芯片廠商實現的獨立接口,其行為由芯片廠商的設計決定。
資源的安全屬性及其配置
片上 Flash
Flash 控制器屬于 TZ aware 外設,直接支持 AHB5 總線,能夠識別總線上面攜帶的HNONSEC 信號(標記是否為 Secure 訪問),Flash 控制器自身有相關寄存器用于配置Flash 區(qū)域的 S 安全與 NS 非安全屬性。具有 S 安全訪問屬性的 Flash 區(qū)域只能接受安全訪問(即 Transaction 的 HNONSEC=0),具有 NS 非安全訪問屬性的 Flash 區(qū)域只能接受非安全訪問(即 Transaction 的 HNONSEC=1)。這里注意不要將安全/非安全訪問與 CPU 的安全/非安全狀態(tài)混為一談。這二者未必是一致的,后面講 CPU 運行狀態(tài)與訪問規(guī)則的時候會進行解釋。
CPU 訪問資源的安全規(guī)則
CPU 對資源訪問的一般規(guī)則
CPU 的運行分為安全和非安全兩種狀態(tài),CPU 處于哪種狀態(tài)取決于當前 PC 的指令來自于安全地址還是非安全地址。簡單地說,如果 CPU 執(zhí)行的指令來自安全地址(以 SAU/IDAU 角度看),則 CPU 正在執(zhí)行安全代碼,處于安全狀態(tài);當 CPU 執(zhí)行的指令來自于非安全地址(同樣從 SAU/IDAU 角度看),則 CPU 正在執(zhí)行非安全代碼,處于非安全狀態(tài)。
TrustZone Memory 安全配置常見問題及分析方法
小結
本文簡單介紹了 ARM CM33 內核 TrustZone 架構下內核中 SAU/IDAU 如何區(qū)分安全非安全地址,存儲器以及外設資源如何設置自身的安全訪問屬性,以及 CPU 訪問不同資源時的訪問規(guī)則等內容。最后列舉了一些使用 STM32 進行 V8M TZ 開發(fā)中常見的 memory 配置相關的問題以及調試方法,希望對廣大開發(fā)者有所幫助。
在后續(xù)的篇章中,我們還將總結一些其他的 TrustZone 開發(fā)中的常見問題及調試技巧,歡迎讀者繼續(xù)關注。