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