MPU的功能
MPU功能簡述
MPU保護與當前執行的代碼“不相關“的所有數據。
“不相關”是相關內存地址的權限受限制,或者是程序訪問內存地址的范圍于其無關,阻止關鍵數據被破壞,使嵌入式系統更加健壯與安全。
MPU作用主要有兩個方面:
為兩個保護,一個檢測。
1)MPU的保護作用
指訪問區域的保護和讀寫區域的保護。
① 訪問區域的保護。
可以將內存區域劃為特權區域和普通區域,特權區域只有特權用戶才能訪問,普通用戶被禁止訪問,以此來保護特定的數據。
常見的應用場景:
1> 對帶系統的來說,可以設置數據,以防止用戶應用程序破壞操作系統使用過程中的數據。
2> 隔離任務,以防止一個任務訪問其他任務的數據。
3> 將SRAM或者RAM空間定義為不可執行,防止代碼注入。
② 讀寫區域的保護。
設置指定的區域為只讀,可以有效的防止比較關鍵的數據被錯誤修改。
2)MPU的檢測功能
指可以檢測堆和棧的溢出情況及數組有沒有越界。
功能安全中對內存分區MPU的相關描述
汽車ECU軟件是高度模塊化的嵌入式軟件,其功能實現是可以為非功能安全,和功能安全的SWC組合,它們分別擁有不同的ASIL安全等級。
根據ISO26262,如果嵌入式軟件包含不同ASIL等級的SWC,要么整個軟件工程都需要基于最高安全等級的要求進行開發,需要保證擁有更高安全等級的SWC的操作不會受到其他SWC的干擾,也即需要做到FFI(Freedom from interference)的設計。
基于更低安全等級要求開發的SWC,可能會出現錯誤地訪問到更高安全等級SWC的內存區域,產生干擾。
為此,SWC需要運行在不同的內存區域,或者不同的內存分區,來防止類似的內存訪問違例。
ISO26262中,以下內存相關的故障影響被視為SWC之間產生干擾的原因:
內容損壞
讀寫區域屬于另一個SWC
數據不一致
棧溢出或棧下溢
要滿足上述定義,是MPU內存保護的目標,也可以通過限制對于內存以及內存對應的硬件的訪問。
這里的內存分區意味著:
各OS Application運行在相互保護(不干涉)的內存區域,在某一個分區上運行的代碼,無法修改另一個分區的內存。
內存分區也可以保護只讀內存段(例如代碼執行)以及內存對應的硬件。
內存分區和用戶/特權模式可以保證SWC之前互不干擾——即使某一個SWC出現了內存相關的故障,也不會對其他軟件模塊有影響。
如果一個SWC運行在用戶模式,那么它對CPU資源/指令的訪問也是受限制的。
MPU的微控制器有專用的硬件
即內存保護單元(MPU),來支持內存分區。
若想深入理解上述的MPU描述,得先來看下,內存分區和MPU的基礎知識。
計算機程序執行的基礎簡介
內存
計算機的主要作用是對輸入數據進行處理和運算后輸出,CPU處理器主要完成數據的處理運算,但輸入輸出數據包括處理過程中的臨時數據需要有一個空間去存放,這個臨時存放數據供處理器和外設使用的地方就是內存。
如上圖,為了提高效率把存放程序(也即控制指令)和數據(也即操作數)的空間分開,同時把訪問指令與訪問數據的總線分開,使取指令和執行指令能夠重疊(處理器的流水線)。
內存尋址
處理器與內存之間有地址總線用于尋址,有數據總線用于傳輸數據,當然也有相應的控制線來讀寫操作。
存儲器地址的映射簡介
存儲器本身不具有地址信息,它的地址是由芯片廠商或用戶分配,如圖所示,給存儲器分配地址的過程稱為存儲器映射。
如果內核整體可以尋址的 0 到 2^32 -1 共計 4GB 的尋址空間。功能部件RAM, Flash,外設等共同排列在一個4GB的地址空間內。
地址分配
程序C語言通過這些地址可以訪 問 RAM、Flash、外設等,進行讀寫操作。
C編譯的程序占用的內存分為以下幾個部分:
棧區(stack)— 由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等。其操作方式類似于數據結構中的棧。
堆區(heap) — 一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收 。注意它與數據結構中的堆是兩回事,分配方式倒是類似于鏈表。
全局區(靜態區)(static)—全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域, 未初始化的全局變量和未初始化的靜態變量在相鄰的另一塊區域。
文字常量區(.const)—常量字符串就是放在這里的。
棧:只要棧的剩余空間大于所申請空間,系統將為程序提供內存,否則將報異常提示棧溢出。MPU也支持堆棧溢出檢測,簡單如下圖。
代碼例子
inta=0;//全局初始化區 int a = 0; //全局初始化區 char *p1; //全局未初始化區 main() { int b; //棧 char s[] = "abc"; //棧 char *p2; //棧 char *p3 = "123456"; //123456?在常量區,p3在棧上。 static int c = 0; //全局(靜態)初始化區 p1 = (char *)malloc(10); p2 = (char *)malloc(20); //分配得來得10和20字節的區域就在堆區。 strcpy(p1, "123456"); //123456?放在常量區,編譯器可能會將它與p3所指向的"123456"優化成一個地方。 }
MPU內存保護單元
上文描述的內存區,堆棧區,數據區,代碼區都可以被MPU保護,安全相關的微處理器通常都在硬件級別上支持內存分區保護,MPU主要是通過內存映射的地址范圍限制,和監控非受信區域的內存訪問來實現的。
MPU可以保護的區域為內存映射區memory map,可以設置不同存儲區域的存儲器訪問特性(如只支持特權訪問或全訪問)和存儲器屬性(如可緩存、可緩沖、可共享),對存儲器(主要是內存和外設)提供保護,保護可執行程序的(data、code和stack)區域。
MPU 的Region區域
MPU的配置是通過設置多個MPU寄存器,定義多個MPU region,每個MPU region的可配置選項包括: 被保護的起始地址,大小size,訪問權限,所屬硬件MPU分類,Region Owner 以及有效ID等。
MPU在執行其功能時,也是以“region區域”為單位的。
通過上述的MPU配置,各個軟件模塊將具備對不同memory區域的不同訪問權限。
如圖,一個region上述配置的一段連續的地址,它們的位置和范圍都要滿足一些限制。
MPU是可以管理所有的存儲空間(如圖 4G),可以劃分不同的Region內存區域,并為每個Region設置訪問權限與規則,不同的Region允許相互重疊,重疊區域受多重訪問規則的限制。
Link命令對于內存的設置
編譯器關聯的,可參考下面TI的解釋
https://software-dl.ti.com/ccs/esd/documents/sdto_cgt_Linker-Command-File-Primer.html
特權模式與用戶模式
是內核的執行模式。
當代碼運行在特權模式下,代碼擁有所有的訪問許可;
而代碼運行在用戶模式,則訪問權限受限制。
也是MPU中所定義的內存訪問規則。
AUTOSAR中的定義
內存分區的定義
如上圖,一般來說,
BSW模塊運行在授信模式/監控者模式內存分區當中。
部分SWC分組并放置到非授信/用戶模式內存分區當中。
個別SWC也運行在授信/監控者模式內存分區當中。
項目中可以有多個非授信/用戶分區,每個分區都可以包含一個或多個SWC。
上圖中,分區是以應用軟件OS-Application為對象定義的,OS-Application和內存分區(Partition)之間,是一對一的關系。
如何理解OS-Application?
下文簡述
如下圖中,應用程序內的 AUTOSAR SWC
在AUTOSAR架構中,應用程序位于RTE之上的,基于應用功能邏輯定義,內部包含一組存在信息交換的軟件組件(SWC)。
軟件組件SWC是實現一系列的原子功能(最小單元不可拆分),SWC包含一系列的功能實現和變量定義,這些功能實現和變量定義對于外部是不可見的,僅能通過公布的RTE接口使用。
SWC以周期性執行或者以外部觸發的runnable中執行。
從分配的角度來看,一個SWC可以由多個Runnable構成,一個OS-Task可以觸發多個Runnable(同一個SWC內的Runnable可以在不同的OS-Task上執行),一個OS-Application可以管理多個OS-Task。
AUTOSAR OS-Application
AUTOSAR的OS-Application是操作系統對象的集合體,其中包括任務(Tasks),中斷服務程序 (ISRs),調度表 (Schedule Tables),計數器 (Counters)和警報 (Alarms),這些對象構成一個內聚的功能單元。
OS-Application可以分為2類:
受信任 (Trusted)的OS-Application
可以不受那些運行時的監控 (Monitoring)或者保護 (Protection)特性的限制執行。
這類應用可以不受限的訪問內存和操作系統API。受信任的應用對于執行時間上也不受限制,同時也可以在任何支持的處理器上以特權模式執行。
不受信任 (Non-trusted)的OS-Application
不可以在運行時監控及保護機制關閉的時候執行。這類應用在訪問內存、操作系統API時都有限制,同時也不允許以特權模式執行。
AUTOSAT Memory Mapping
AUTOSAR有memory mapping的特性可支持上述內存分區Memory
Partitioning,從而提供MPU需要的Non-trusted 和Trusted的內存分配區域設置。
詳細見AUTOSAR_SWS_MemoryMapping.pdf
MPU的限制規則
內存分區Memory Partitioning的限制
在同一個OS-Application內的對象相互訪問,提供了不受限的通信支持。
在一個OS-Application內的各個對象可以互相訪問,可以分屬于不同的SWC。
MPU工作的過程
操作系統要事先根據功能,和軟件架構,定義軟件分區,進行MPU region配置,
任務運行時,操作系統根據MPU的配置,檢測和阻止不正確的內存訪問,若出現了在非受信區域的內存訪問或者執行了不合法的CPU指令,這些訪問首先會被阻止,然后處理器硬件會產生一個異常 (Exception),記錄故障碼DTC。
操作系統和RTE會處理這些異常:執行內存分區的關閉 (Shutdown),或重啟分區內的所有SWC的動作。
總結語
AUTOSAR中提供的內存分區機制,通過SWC,RTE,Mem映射實現,限制訪問內存,支持內存保護。而內存分區的定義(trust/un trust)和限制規則由控制器的系統設計決定。
審核編輯:劉清
-
微控制器
+關注
關注
48文章
7542瀏覽量
151316 -
C語言
+關注
關注
180文章
7604瀏覽量
136685 -
MPU
+關注
關注
0文章
357瀏覽量
48775 -
AUTOSAR
+關注
關注
10文章
360瀏覽量
21553 -
SRAM芯片
+關注
關注
0文章
65瀏覽量
12059
原文標題:AUTOSAR 內存分區和MPU關系講解
文章出處:【微信號:eng2mot,微信公眾號:汽車ECU開發】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論