Cortex M核心的MPU記憶體保護單元

2021-10-04 14:44:00 字數 1942 閱讀 6807

估計大家經常看見mcu、mpu、mmu等這類縮寫詞,你們了解mpu嗎?

1寫在前面

不知道大家有沒有關注過cortex-m核心的一些內容,在stm32大部分型號中都有mpu。

mpu是cortex-m的選配件,拿stm32f1來說,stm32f10x_xl系列的晶元才具有這個mpu儲存保護單元,而其他stm32f1晶元沒有。

可能很多人都處於簡單知道,或認識mpu的階段,今天就寫點關於mpu的內容,讓大家進一步認識和了解mpu。

2認識mpu,及作用

mpu:memory protection unit,記憶體保護單元。

mpu儲存器保護單元,它可以實施對儲存器(主要是記憶體和外設暫存器)的保護,以使軟體更加健壯和可靠。在使用前,必須根據需要對其程式設計。如果沒有啟用mpu,則等同於系統中沒有配mpu。

mpu有如下的能力可以提高系統的可靠性:

阻止使用者應用程式破壞作業系統使用的資料。

阻止乙個任務訪問其它任務的資料區,從而把任務隔開。

可以把關鍵資料區設定為唯讀,從根本上消除了被破壞的可能。

檢測意外的儲存訪問,如,堆疊溢位,陣列越界。

此外,還可以通過mpu設定儲存器regions的其它訪問屬性,比如,是否緩區,是否緩衝等。

3了解野指標

上面簡單認識了一下mpu的功能,其實它有個重要的功能就是對指標訪問的記憶體具有保護作用。所以,這裡讓大家認識一下指標和野指標。

回顧一下, 什麼是指標?指標在記憶體中實際上是乙個無符號整數(unsigned int),但是它的值被賦予特殊的解釋:表示變數或函式的位址。所以才被形象地稱為「指標」,就好像指向誰家似的。 在使用指標前, 都必須先讓它指向有意義的, 並且允許由程式使用的實體——資料和**。 而所謂「野指標」, 就是指某個指標變數的值因故超出合法的範圍, 使其「槍口」 亂指。 程式邏輯錯誤、 陣列越界、 堆疊溢位、 指標未經初始化、 對快取與緩衝的處理不當、 多工環境中的紊亂條件, 甚至是惡意地破壞等, 都可以製造出野指標。 如果使用野指標去讀取或修改記憶體, 則被讀取或修改的位置是不可預料的。 前者導致讀回來的都是亂掉的資料, 後者則會破壞未知用途的資料。 這常常導致系統發生莫名其妙的功能紊亂, 嚴重時會使系統毫無徵兆,沒有理由地失控、宕機。

野指標就像「肉裡的刺, 醬裡的蛆」 一般: 乙個野指標就足以毀掉整個系統, 而且極其隱蔽, 很難通過症狀來找出是**存在野指標, 甚至都不能判定症狀是否因野指標造成(程式大了其它 bug 也很多,並且也能導致相同的症狀)。對於通常的微控制器系統,是沒有任何辦法來防止野指標的破壞的, 完全靠程式設計師的素質和自律。 但智者千慮, 必有一失。 尤其是當程式規模變得很大時,複雜度會呈指數上公升,千頭萬緒糾纏不清, 就算是謹慎如諸葛亮,聰明如比爾·蓋茨的天才,也不敢保證沒有漏網之魚。

---來自cm3核心翻譯作者

4進一步了解mpu

mpu在執行其功能時,是以所謂的「region區域」為單位的。乙個region其實就是一段連續的位址,只是它們的位置和範圍都要滿足一些限制(對齊方式,最小容量等)。

cm3的mpu共支援8個regions,還允許把每個region進一步劃分成更小的「子region」。此外,還允許啟用乙個「背景region」(即沒有mpu時的全部位址空間),不過它是只能由特權級享用。在啟用mpu後,就不得再訪問定義之外的位址區間,也不得訪問未經授權的region。否則,將以「訪問違例」處理,觸發memmanage fault。

mpu定義的regions可以相互交迭。如果某塊記憶體落在多個region中,則訪問屬性和許可權將由編號最大的region來決定。比如,若1號region與4號region交迭,則交迭的部分受4號region控制。

mpu可用於保護多達16個記憶體區域。如果區域至少為256位元組,那麼這些區域可以有8個子區域。子區域的大小總是相等的,可以通過子區域號啟用或禁用。因為最小區域大小是由快取行長度(32位元組)驅動的,所以8個32位元組的子區域對應256位元組大小。

cortex m3核心中斷

m3核心中有乙個r w 中斷暫存器陣列 該陣列記錄了外部從0到239個中斷的名字pri 0 239,中斷暫存器位址,中斷的優先順序 8位,stm32用了其中的高4位,復位之後是0 如下 另外還有乙個應用中斷控制與復位暫存器r w aircr 這裡面記錄了優先順序分組方法 10 8 對應著前面陣列暫存...

cortex M核心優先順序設定

cortex m核心中 每個中斷都有乙個8位的優先順序設定暫存器 這個8位的暫存器可以分為搶占優先順序和子優先順序兩個部分 通過設定優先順序組設定 搶占優先順序和子優先順序有什麼用?舉例說明 有兩個中斷a b a的搶占優先順序比b的高 當b發生中斷,正在執行b的中斷服務函式時 a發生了中斷,這個時候...

Cortex M0 核心的處理器架構簡介

cortex m0處理器具有32位系統匯流排介面,以及32位位址線,即有4gb的位址空間。系統匯流排基於ahb lite高階高效能匯流排協議。外設匯流排基於apb高階外設匯流排協議,通過乙個轉換橋連線到ahb上。這只是cortex m0核心的大概模式,cortex m0 的儲存器系統與cortex ...