MPU也就是我們通常說的存儲器保護單元,它可以為微控制器或片上系統(SOC)提供存儲器保護特性,而且會提高所開發產品的健壯性。MPU在使用前需要進行編程使能,若MPU未使能,存儲器系統的行為同沒有MPU時一樣。當然有的支持MPU特性,有的沒有。
MPU是一種可編程的部件,用于定義不同存儲器區域的存儲器訪問權限(如只支持特權訪問或全訪問)和存儲器屬性(如可緩沖、可緩存)。
MPU可以通過以下方面提高嵌入式系統的健壯性:
●避免應用任務破壞其他任務或OS內核使用的棧或數據存儲器。
●避免非特權任務訪問對系統可靠性和安全性很重要的外設。
●將SRAM或RAM空間定義為不可執行的,防止代碼注入攻擊。
●檢測不可預期的存儲器訪問(例如,棧被破壞)。
還可以利用MPU定義其他存儲器屬性,如可被輸出到系統緩存單元或存儲器控制器的可緩存性。
若存儲器訪問和MPU定義的訪問權限沖突,或者訪問的存儲器位置未在已編程的MPU區域中定義,則傳輸會被阻止且觸發一次錯誤異常。觸發的錯誤異常處理可以是存儲器管理錯誤或者HardFault異常,實際情況取決于當前的優先級及存儲器管理錯誤是否使能。然后異常處理就可以確定系統是否應該復位或只是OS環境中的攻擊任務。
在使用MPU前需要對其進行設置和使能,若未使能MPU,處理器會認為MPU不存在。若MPU區域可以出現重疊,且同一個存儲器位置落在兩個MPU區域中,則存儲器訪問屬性和權限會基于編號最大的那個區域。例如,若某傳輸的地址位于區域1和區域4定義的地址范圍內,則會使用區域4的設置。
MPU的設置方法有多種。
對于沒有嵌入式OS的系統,MPU可以被編程為靜態配置。該配置可用于以下功能:
●將RAM/SRAM區域設置為只讀,避免重要數據被意外破壞。
●將棧底部的一部分RAM/SRAM空間設置為不可訪問的,以檢測棧溢出。
●將RAM/SRAM區域設置為XN,避免代碼注入攻擊。
●定義可被系統級緩存(2級)或存儲器控制器使用的存儲屬性配置。
對于具有嵌入式OS的系統,在每次上下文切換時都可以配置MPU,每個應用任務都有不同的MPU配置。這樣可以:
●定義存儲器訪問權限,使得應用任務只能訪問分配給自己的棧空間,因此可以避免因為棧泄漏而破壞其棧。
●定義存儲器訪問權限,使得應用任務只能訪問有限的外設。
●定義存儲器訪問權限,使得應用任務只能訪問自己的數據或自己的程序數據(設置起來可能會有麻煩,因為多數情況下OS和程序代碼是一起編譯的,因此數據在存儲器映射中也可能是混在一起的。)
如果需要的話,具有嵌入式OS的系統還可以使用靜態配置。
簡單應用大多不需要使用MPU,MPU默認為禁止狀態,而且系統運行時它就如同不存在一樣。在使用MPU前,需要確定程序或應用任務要訪問(以及允許訪問)的存儲器區域:
●包括中斷處理和OS內核在內的特權應用的程序代碼,一般只支持特權訪問。
●包括中斷處理和OS內核在內的特權應用使用的數據存儲器,一般只支持特權訪問。
●非特權應用的程序代碼,全訪問。
●非特權應用(應用任務)的棧等數據存儲器,全訪問。
●包括中斷處理和OS內核在內的特權應用使用的外設,只支持特權訪問。
●可用于非特權應用(應用任務)的外設,全訪問。
在定義存儲器區域的地址和大小時,注意區域的基地址必須要對齊到區域大小的整數倍上。例如,若區域大小為4KB(0x1000),起始地址必須為N X 0x1000,其中N為整數。
若使用MPU的目的是防止非特權任務訪問特定的存儲器區域,則可以利用背景區域特性減少所需的設置步驟。只需設置非特權任務所用的區域,而利用背景區域,特權任務和異常處理則對其他存儲器空間具有全訪問權限。
往期回顧:
●快速應用張飛單片機之通用定時器
●USB的四種傳輸類型之批量傳輸
●回調函數的使用
END

