Memory Pretection Uint(MPU)機制與實現

一、文章簡介

本文主要介紹基於Davinci 工具鏈的MPC5746R的MPU功能的實現。

二、概念介紹

1、freedom from interference

此概念來自ISO26262-1:absence of cascading failures (1.13) between two or more elements (1.32) that could lead to the violation of a safety requirement
多個元素之間沒有可能導致違反安全目標的級聯故障,稱之爲免於干涉.
免於干涉
在左側的設計中,ASIL A的軟件模塊不可能影響ASIL C的模塊,因此ASIL C模塊對ASIL A模塊免於干涉。
在右側的設計中,存在從ASIL A到ASIL C系統的數據/控制流。結果,至少在沒有任何進一步分析的情況下,ASIL C系統無法實現對於ASIL A軟件模塊的免於干涉。ASIL C系統可能會受到ASIL A系統的影響。在這種情況下,需要採取進一步的設計或驗證措施,以免受到干擾。例如,ASIL C系統可以首先檢查ASIL A系統數據的正確性。考慮到這一措施,ASIL C組件將實現免於干涉

2、Separation in Memory

Vector 的MICROSAR OS將TASK ISR IOC等集合成OS Application,以便將不同的應用劃分到不同的內存區間。針對軟件進行的模塊化和分區可以提高軟件系統的康故障魯棒性。
同一安全等級的軟件或實現同一個安全目標的軟件劃分到同一個模塊或者OS Application。當故障發生時,可以很好的防止出現錯誤級聯,從而實現freedom form interference
在這裏插入圖片描述
SC3 SafeContex OS中必須具備整個軟件中最高的 安全等級,例如軟件中最高等級的模塊位ASIL C,那麼OS必須要具備ASIL C等級,才能保證軟件模塊的安全等級。
SC3 SafeContex OS會運行在Supervisor Mode,保證運行在系統的最高權限。通過Memory Partition,將各個模塊在內存訪問上的操作進行隔離。如果需要附加模塊之間的訪問安全機制,可以有效的達到各個不同安全等級模塊之間的freedom from interference

3、Partitioning Options

Davinci 針對Memory Partitionning 有兩種解決方案:
1、 BSW運行在Non-Trusted,或者QM-partition,配合Safe WDG的時間監控(deadline)以及OS Scalability Class 3/4。這種情況適合與ECU Software中只有一小部分的軟件是功能安全目標實現模塊,另外較大一部分是QM。與底層的BSW交互較多。這種交互不需要跨越partition,SafeWDG作爲有安全等級的模塊出現,且由於其功能是監控軟件運行,一般作爲軟件中最高安全等級
2、BSW所有模塊選擇safety 等級模塊,與ECU中safety等級的其他功能模塊安全等級一致。可以設置爲最高安全等級或者QM的其他安全等級,最好與那些BSW交互較多的軟件模塊設置成一致的安全等級。這樣可以有效降低跨越partition所帶來的OS切換消耗時間。這種方案適合與有一大部分軟件模塊都是safe-related模塊的ECU。
除此之外,MCAL和外設模塊與BSW模塊之間的交互也需要評估,與BSW有交互的模塊需要劃分到BSW同級的模塊,並且需要具備該安全等級。

兩種解決方案

4、Memory Protection

Davinci Safe提供了針對software partition的memory protection,是實現同一個ECU中具備不同安全等級的軟件模塊時必須要實現的freedom form interference 方法

三、Partition元素-MPU

1、MPU介紹

Memory Protection 的實現需要配合硬件MPU。通過MPU配置,各個軟件模塊將具備對不同memory區域的不同訪問權限,主要包括RAM ROM,以及外設寄存器的訪問權限。例如,配置低安全等級軟件模塊無法對高安全等級軟件模塊的flash RAM段進行訪問,(需要配合編譯器,將軟件模塊編譯到不同到區域)即可有效防止低安全等級的軟件模塊在故障產生時對高安全等級模塊發生級聯醒錯誤。
MPU的配置是通過設置多個MPU region來實現的,每個MPU region的可配置選項包括: 被保護的起始地址,訪問權限,所屬硬件MPU分類,Region Owner 以及有效ID等。
一般來講,MPU分爲兩類,System Memory Protection Uint 和 Core Memory Protection Uint。SMPU主要存在與多核系統中,用於對各個BUS設定內存訪問權限。一般來講,SPMU由OS在啓動時設定好,在軟件運行過程中不會被重新設置,不會在軟件中動態的更改BUS對內存的訪問權限。
CMPU一般負責多核的內存保護,一般每個內核都具備一定數量的CMPU,可以爲運行在該內核上的OS Application TASK ISR等分別設定不同的內存區域以及外設地址的訪問權限,從而實現軟件模塊的分區。
CMPU的訪問權限包括讀、寫、執行權限,可以根據內存區域存儲內容設定,CMPU在OS的運行過程中是可以更改權限的。當各個OS Application的權限被設定好之後,OS會在OS Application切換時對MPU相關寄存器進行重重新初始化,並設置位即將切換到的OS Application權限。當出現訪問超過MPU權限允許範圍時,MCU exception會被出發並進入其相應的OS 處理函數,用戶可以根據情況 Shutdown OS或者選擇進入安全模式,從而有效阻止了軟件訪問故障的發生。
在OS SC3/SC4中OS Application分爲兩類,具備最高安全等級的OS Application設定位Tusted Application,其他不具備Trusted屬性的Application 屬於Non-Trusted Application,OS和Trusted Application 運行在Supervisor Mode下,Non-Trusted Application則運行在User模式下。推薦爲Truesd Application 設定除Stack區域以外的所有地址方位的讀、寫、執行權限,包括外設地址。
爲Non-Trusted Application設定屬於其私有的CFlash 和RAM段的訪問權限,以及共享數據區域的讀寫權限。
用戶可以根據ECU軟件各個模塊的安全等級情況,將軟件劃分的到多個OS Application 中,依據MCU資源設定MPU,進而實現不同安全等級的軟件模塊的協同工作,並把故障級聯的概率降到允許範圍內的需求。

2、SMPU和CMPU

2.1、SMPU特性

  1. 用於核之間的安全隔離,實現免於干涉
  2. SMPU限制覈對某些內存空間或者MCU上通過總線訪問的外部資源,一般只限制寫權限
  3. 在OS初始化時被初始化,運行過程不會改變
  4. 配置步驟
    SMPU配置

2.2、CMPU特性

  1. 同一核上OS Application Task ISR之間的安全隔離
  2. 在啓動代碼或者運行中設置,限制權限包括讀、寫、執行權限
  3. 配置步驟:
    CMPU配置

2.3、Static MPU Regions特性

  1. 對MPU Regions不指定具體的Owner,對所有軟件模塊都生效
  2. 系統啓動時設定好,可以是SMPU 或者CMPU,運行過程中不會改變

2.4、Dynamic MPU Regions特性

  1. 對MPU Regions 指定Owner,Owner可以是OS Application TASK ISRS
  2. 根據Owner 運行與否,代碼運行過程中進行enable/disable,

2.5、Optimized /Fast Core MPU Handing

  1. 利用Memory Protection Identifiers值的變化,選擇性使用MPU Regions,在不重新初始化MPU寄存器的情況下,OS切換到某線程,同時具備PID MPU Region ,實現Dynamic MPU切換

3、MPU的配置

在常見的軟件設計中,由於將軟件整體開發到相同的ASIL等級會耗費大量的資源。一般情況下只有一部分軟件會開發生ASIL等級,其他模塊開發成相對較低的安全等級,爲了達到freedom from inerference,需要限制低等級模塊對高等級模塊的訪問。下面舉例說明MPU配置的常見思路。

  1. 從Safety方面,高等級的軟件模塊可以訪問其Memroy以及安全等級較低的軟件模塊Memory。
  2. 從工具方面,MPU可以被配置爲各個OS Application TASK ISR 分別獨立具備訪問範圍,工具並不會因爲軟件模塊安全等級的高低而對OS RTE有區別配置,而只是採用模塊間的隔離策略。隔離機制不會生成在RTE中
  3. 從系統角度,整體軟件至少需要一個Trusted部分(以OS Application爲單位劃分),並且Trusted部分是安全等級最高的模塊,可以訪問其他模塊的Memory
    總結,使用MemMap機制,將各個OS Application所佔用Code Data資源進行良好整齊的存放基礎上,MICROSAR 的推薦MPU配置爲:
  4. 設置軟件中等級最高的軟件模塊爲Trusted Os Application,同時設置位privilege。並設置Memory Region,允許該Application訪問呢所有Memory段和外設。
  5. 其他每個安全等級模塊各設定至少一個OS Applcaiton,並設置爲Non-Trusted,針對其設定允許對整個Memory的讀權限,和模塊代碼的執行權限,以及Stack的寫權限,共享數據區域的讀或者讀寫權限
  6. 關於Stack,不需要用戶自己設定,OS會佔用一個Memory Region進行Stack設置,因此需要留一個Memory Region給到OS
  7. 共同使用Static MPU 和Dynamic MPU,配合OsAppMemoryProtectionIdentifier的作用,儘量減少MPU在代碼運行過程中的重新初始化,這樣可以降低OS contex切換的時間
    在這裏插入圖片描述
    配置思路:
    在這裏插入圖片描述

3.1、MPC MPU硬件特性及配置

以MPC5744 單核爲例介紹,硬件資源如下:

  1. 16個SMPU,24個CMPU,12個data 6個instruction 6個 shared
  2. 2個supervisor ,3種訪問權限
  3. 6個可以選擇的SMPU訪問對象,即6個master ID,分別對應MCU總線上的外設單元
    在這裏插入圖片描述
    在配置工具中查看硬件資源
    在這裏插入圖片描述
    針對OS Application /TASK /ISR設定Memory Region,依次設置其參數並關聯到需要生效的OS Application TASK ISR。根據需要對SMPU進行配置,如果所有MPU都沒有使用SMPU,OS會在初始化時禁止 Gloabl SMPU Control Bit,SMPU將不會生效。同理CMPU,即使OS 設定爲SC3,不設置任何MPU Region,那麼MPU會被disable.
    MPU配置如下圖所示,其中被標註藍色框的選項是必須設置的選項:
    在這裏插入圖片描述
    MPC系列的特殊配置:
  4. Memory Region Bus Master:設置允許訪問MPU設置地址的Master,僅針對SMPU有效
  5. Memory Region Flag :訪問行爲的屬性,可以參數硬件手冊
  6. 當出現MPU錯誤時,代碼會進入
    Os_Hal_Exception_Machine_MCSRR
    Os_Hal_Exception_Data
    Os_Hal_Exception_Instrcution

4、Partition 實現元素 OsApplication

4.1、OS/OsApplication權限以及訪問的權限切換

硬件MCU支持兩種訪問模式,Privileded 和Non-privileded。其中前者具有比較高的權限,有一部分寄存器需要在前者模式下才能被訪問,詳細可以參考RM手冊。OS會運行在Privilege Mode,具有最高的訪問權限,可以訪問所有寄存器。
在採用不同的功能安全等級的軟件模塊協調工作的的系統軟件中,需要利用MPU單元防止低安全等級的模塊對硬件寄存器進行訪問,同時限制除最高安全等級模塊之外的其他軟件模塊的Memory訪問。

4.1.1、 OS/OsApplication權限

  1. OS 具備最高權限 Privilege Mode Trusted
  2. Trusted OS Application - Privileged Mode Trusted,一般將軟件按照安全等級劃分,並分別歸屬到不同的OsApplication中,其中安全等級最高的部分設置爲Trusted,屬於可信度最高的模塊。目前建議Trusted OsApplication具備其他Application Stack的所有區域訪問權限。

4.1.2 MCAL模塊Protected Registers 訪問

系統初始化時,進行MPU初始化,在此之前MPU處於Disable狀態,一般在OS啓動初始化MCAL模塊,此時可以訪問Protected Register。在OS初始化以後,如果MCAL模塊需要在Privilege Mode運行時,基本可以分爲以下幾類:

  1. Vector Modules,例如CAN/LIN ETH等通訊模塊,一般CAN需要勾選CanUserPeripheralAccessApi,並根據PROTED AREA中的定義相應的OsApplication,CAN將會調用OS接口進行privilege權限的獲取
    在這裏插入圖片描述
  2. MCAL模塊一般需要開啓User Mode,例如FlsEnableUserModeSupport,勾選以後,MCAL會採用privilege Mode進行訪問。

4.1.3 OsShutdown的實現

AUTOSAR要求只有在Trusted OsApplication纔可以進行OsShutdown,否則將無法shutdown成功。可以通過Event的方式通知Trusted Task調用OsShutdown Api。但是需要設置一個高優先級/不可搶佔/拓展類的TASK,代碼示例如下:

FUNC(void,ECUM_CODE) EcuM_ShutdownOs(Std_ReturnType ErrCode)
{
	(void) SetEvent(ShutdownTask_Core0, OsEvent_Shutdown);
}
TASK(ShutdownTask_Core0)
{
	EventMaskType eventReceived;
	StatusType errorCode = E_OK;
	(void)WaitEvent(OsEvent_Shutdown);
	(void)GetEvent(ShutdownTask_Core0, &eventRecived);
	(void)ClearEvent(eventReceived);
	ShutdownAllCores(errorCode);
	TerminateTask();
} 

在向FBL跳轉以及系統最後的Reset務必使用Mcu_PrefromReset,這樣纔可以disable MPU,否則可以使用代碼disable MPU之後,在調用對應的API進行Reset操作

4.2 、Trusted/Non-Trusted 配置舉例

不同等級的OsApplication之間互相調用時涉及到安全問題,需要做安全訪問的權限轉換。

  1. Trusted Funtion
    Trusted OS Application供給其他Application調用的函數,應在Privilege Mode下執行。用於Non-Trusted OsApplication調用Trusted OsApplication內部函數,舉例如下:
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述

  2. Non-Trusted Funtion
    Non-Trusted OsApplication供給其他Application調用的函數,應在User Mode下執行,用於其他OsApplication調用Non-Trusted OsApplication 內部函數。配置方式與上面類似

4.3、MemMap機制與OS數據的存放

MPU需要限制各個OsApplication Task ISR對各個地址的訪問權限,所以明確並整理好各個軟件模塊的代碼數據存放位置是關鍵。通過MemMap機制,和Link文件。可以將各個模塊的代碼和數據存放到指定的區域,從而實現MPU保護。如下圖,MemMap的作用
在這裏插入圖片描述
當發生MPU錯誤時,OS會進入ProtectionHook,並返回E_OS_PROTECTION_MEMORY或者E_OS_PROTECTION_EXCEPTION

5、Partition元素-RTE

RTE 作爲動態配置的虛擬總線模塊,負責 OS application 之間的數據交互和訪問,在具備 Memory
partition 的系統中, OS application 之間的訪問會存在跨越安全等級的情況, RET 具備一定的免於干擾的
機制,分別針對各 OS application 產生代碼和變量,在後續的軟件分區過程中分別將 RET 生成的對應各
OS application 的 memory 內容分別歸其所屬。由於大部分的機制由 RTE 自動完成,需要用戶設置的主要
有以下幾點:

  • 爲 OS application 分別關聯 ECUC partition
  • 生成代碼,按照 RTE 段的內容分別歸屬到相應的 OS application,並各自設置訪問權限的允許,
    公共的 RTE code(如 RTE_START_SEC_CODE) 需要對所有的 OS application 開放訪問權限。
  • 尤其針對跨越 OS application 的訪問,分別做好 runnable 的 task mapping,確保調用端和被調用端
    分別 mapping 到對應 task。
  • RTE 端口儘量不要出現懸空狀態,或鏈接不處理數據的狀態
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章