本應(yīng)用筆記介紹如何管理 STM32 產(chǎn)品中的內(nèi)存保護(hù)單元(MPU)。MPU 是用于存儲器保護(hù)的可選組件。STM32 微控制器(MCU)中嵌入 MPU 之后變得更穩(wěn)健可靠。在使用 MPU 之前,必須對其進(jìn)行編程并加以啟用。如果 MPU 沒有啟用,則存儲系統(tǒng)的行為不會變化。
MPU 可以使嵌入式系統(tǒng)更加穩(wěn)健和安全:
- 禁止用戶應(yīng)用程序破壞關(guān)鍵任務(wù)(例如操作系統(tǒng)核心)使用的數(shù)據(jù)
- 將 SRAM 存儲區(qū)域定義為非可執(zhí)行(禁止執(zhí)行 XN),以防止代碼注入攻擊
- 修改存儲訪問屬性
MPU可最多保護(hù)16個內(nèi)存區(qū)域。在 Armv6、Armv7 架構(gòu)(Cortex-M0+、M3、M4、M7)下,這些區(qū)域可以依次擁有 8 個子區(qū)域(前提是區(qū)域至少有 256 字節(jié)))。在 STM32 中,受保護(hù)區(qū)域的確切數(shù)量可能因內(nèi)核和器件而有所不同,子區(qū)域的大小都是相等的,可以根據(jù)子區(qū)域號進(jìn)行啟用或禁用。因為最小區(qū)域大小是由緩存行長度(32 字節(jié))驅(qū)動的,所以 8 個 32 字節(jié)的子區(qū)域?qū)?yīng)一個 256 字節(jié)的區(qū)域。
區(qū)域的編號為 0 至 15。此外,還有一處默認(rèn)區(qū)域,其 id 為-1。所有編號 0-15 的存儲區(qū)域的優(yōu)先級高于默認(rèn)區(qū)域。
這些區(qū)域可以重疊,也可以嵌套。區(qū)域 0-15 的優(yōu)先級由低到高,這也決定了區(qū)域重疊的方式。優(yōu)先級是固定的,不可更改。
在 Armv8 架構(gòu)(Cortex-M33)中,使用起始地址和終止地址來定義區(qū)域,使開發(fā)人員能夠以靈活、簡單的方式組織這些區(qū)域。此外,正是區(qū)域大小的可靈活配置得到提升,故Cortex-M33就沒有子區(qū)域的概念了。
在 Armv8 架構(gòu)(Cortex-M33)中,現(xiàn)在不允許區(qū)域重疊。由于 MPU 區(qū)域的定義更加靈活,因此沒有必要重疊MPU 區(qū)域。
MPU 是統(tǒng)一的,意味著沒有單獨(dú)的區(qū)域用于數(shù)據(jù)和指令。
MPU 還可以用于定義其他存儲器屬性(如可緩存性),可以導(dǎo)出到系統(tǒng)級緩存單元或存儲存控制器。Arm 架構(gòu)中的存儲器屬性設(shè)置可以支持兩種級別的緩存:內(nèi)部緩存和外部緩存。STM32F7 和 STM32H7 系列僅支持一種級別的緩存(L1-緩存)。
緩存控制由緩存控制寄存器實現(xiàn)全局控制,但 MPU 可以指定緩存策略以及區(qū)域是否可緩存。