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