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

簡單剖析虛擬內(nèi)存與交換分區(qū)
存儲(chǔ)器的分區(qū)內(nèi)存管理與分區(qū)存儲(chǔ)管理

為什么要使用MPU?MPU如何實(shí)現(xiàn)內(nèi)存保護(hù)?

AUTOSAR SWC內(nèi)存分區(qū)與實(shí)現(xiàn)

AUTOSAR架構(gòu)之內(nèi)存分區(qū)與實(shí)現(xiàn)
為什么要使用MPU?MPU如何實(shí)現(xiàn)內(nèi)存保護(hù)?
什么是MPU?MPU在哪些方面保護(hù)內(nèi)存安全?

AUTOSAR通信與CAN協(xié)議的關(guān)系
快速搞懂C語言程序內(nèi)存分區(qū)!

評論