E2E功能安全(Functional Safety)是一項系統特性,由于基于功能安全的設計會影響到系統設計,所以從系統開發初始階段就要進行考慮。由于軟件的復雜度會影響 到功能安全的設計,所以在AUTOSAR規范中,包含了部分與功能安全相關的需求,這些新技術和概念能夠幫助降低功能安全相關組件的復雜度。不過需要強調的是,AUTOSAR雖然通過提供安全措施和機制來支持基于功能安全產品開發,但這些獨立的安全措施(Safety Measure)并不能形成整體的安全解決方案。
在功能安全標準(ISO 26262 2018, Part 6)中,提到了要避免軟件相關元素之間干擾(Freedom from Interference between software elements)。軟件之間的相互干擾主要集中在軟件的執行時間(Timing),軟件間的死鎖(Dead locks,Live locks),內存使用(Memory),信息交換(Information Exchange)。
本文主要介紹一下AUTOSAR規范中對于軟件內存分區的保護措施。
1 失效模式
基于組件化設計的嵌入式系統中,通常會同時包含不同ASIL等級的功能安全相關組件(包括非功能安全相關的組件)。低ASIL等級的軟件組件有可能會以錯誤的方式讀寫高ASIL等級的軟件組件。如果不同的軟件組件能夠在不同的內存分區中執行,則可以避免產生內存訪問相關的影響。
這篇文章中介紹了AUTOSAR OS和RTE的部分功能,這些功能用于支持多個SWC在不同的內存分區中執行,用于避免內存異常訪問。
根據ISO 26262 Part 6,內存相關的異常訪問分類如下:
內容的破壞(Corruption of Contents)
讀寫其它組件的分配管理的內存空間
AUTOSAR中提供的內存分區(Memory Partitioning)機制通過限制訪問內存及基于內存映射的硬件(如Flash,Register)等,支持內存使用的保護。
內存分區意味著把不同的OS-Application部署于不同的內存區域,這樣,特別是代碼執行時,一個分區內的代碼無法修改另一個分區的內存數據。而且,內存分區還可以保護只讀的區域(如代碼段)。
AUTOSAR的內存分區和用戶/特權機制相關的特性,可以支持軟件組件之間的FFI,如SWC內存相關的錯誤不會擴散到其它的軟件組件,同時,處于用戶態的SWC也無法修改或重新配置CPU內部的寄存器。
2 內存分區機制介紹
內存分區是AUTOSAR OS和RTE的一個擴展機制,這在AUTOSAR相關的規范中有描述。在這篇文章中,會以在AUTOSAR方法論中提到的Runnable,Tasks,SWC和OS-Application之間上下文關系的形式介紹這個擴展機制。
2.1 應用程序(Application Software)
在AUTOSAR架構中,應用程序位于RTE之上的,并且包含一組內部存在信息交換的軟件組件(SWC),這些軟件組件實現一系列的原子功能(不可拆分),組合在一起實現應用程序的功能。
AUTOSAR的SWC與硬件無關,所以這些SWC可以集成在任何ECU的硬件上。為了實現ECU內(Inter-)和ECU間(Intra-)通信,AUTOSAR SWC僅通過RTE進行通信(Exclusively)。
AUTOSAR SWC包含一系列的功能實現和變量定義,通過這些提供內部的功能實現。這些功能實現和變量定義對于外部是不可見的,僅能通過公布的RTE接口使用。
AUTOSAR SWC也提供了函數接口,但只能在運行時調用。這些C語言的函數在AUTOSAR中被叫做Runnable。Runnable不能主動執行,而是通過配置的形式,分配到某個位于操作系統中的可執行的實體上,比如,作為一個OS-Task調用的代碼段。
Runnable以周期性執行或者以外部觸發的形式在OS-Task的上下文中執行。從分配的角度來看,一個SWC可以由多個Runnable構成,一個OS-Task可以觸發多個Runnable(同一個SWC內的Runnable可以在不同的OS-Task上執行),一個OS-Application可以管理多個OS-Task,而OS-Application和內存分區(Partition)之間,是一對一的關系。
2.2 OS-Application
AUTOSAR的OS-Application是操作系統對象的集合體,其中包括任務 (Tasks),中斷服務程序 (ISRs),調度表 (Schedule Tables),計數器 (Counters)和警報 (Alarms),這些對象構成一個內聚的功能單元。在一個OS-Application內的各個對象可以互相訪問。
操作系統內的在同一個OS-Application內的對象,可以分屬于不同的SWC。RTE實現了一段內存空間,為這些在同一個OS-Application內的對象相互訪問,提供了不受限的通信支持。
OS-Application可以分為2類:
受信任 (Trusted)的OS-Application可以不受那些運行時的監控 (Monitoring)或者保護 (Protection)特性的限制執行。這類應用可以不受限的訪問內存和操作系統API。受信任的應用對于執行時間上也不受限制,同時也可以在任何支持的處理器上以特權模式執行。
不受信任 (Non-trusted)的OS-Application不可以在運行時監控及保護機制關閉的時候執行。這類應用在訪問內存、操作系統API時都有限制,同時也不允許以特權模式執行。
2.3 通信與代碼共享
一個OS-Application可以包含多個SWC及相關的Runnable。Runnable只允許直接訪問SWC內部的變量和函數。內部的函數調用及變量訪問對于其它SWC來說是不可見的,主要原因是這些函數及變量在SWC相關的頭文件中根本就沒有聲明。這也說明,AUTOSAR標準并不期望從其它的SWC中直接通過變量訪問及直接的執行另一個SWC內部的代碼。AUTOSAR中,SWC之間,僅允許基于RTE進行組件間的通信。
2.4 應用 (Application Software)內的內存分區
基于AUTOSAR開發的ECU內部可以包含功能安全相關與功能安全無關的SWC。ISO 26262要求不同的ASIL等級的軟件組件之間要避免相互干擾 (Freedom from interference)。
AUTOSAR操作系統通過將OS-Application放置于獨立的內存區域內,實現避免內存相關的干擾。這個機制叫做內存分區 (Memory Partitioning)。一個OS-Application不能直接修改另一個OS-Application的內部數據,從而實現相互之間的保護。
應用軟件可以包含不同等級的SWC,但這些SWC不能分配到同一個OS-Application內。內存分區無法對位于同一個OS-Application內部的SWC提供保護。操作系統也只能阻止OS-Application間的非法訪問,無法阻止一個有故障的SWC訪問位于同一個OS-Application內的其它SWC的數據。
2.5 SWC內部的內存分區
可能會有一些SWC有在內部包含不同ASIL等級的Runnable的需求,這就要求避免相互干擾的機制要在這些SWC之間進行。但在Runnable的設計上來說,是屬于SWC的屬性,但一個SWC只能分配到一個OS-Application上,所以基于OS-Application的內存分區機制無法保障一個SWC內部的不同等級的Runnable之間相互干擾。這個特性就需要AUTOSAR操作系統支持Task之間的內存分區,因為Runnable是在某個Task上調用執行的。(目前還不確定是否有AUTOSAR OS支持這個特性)
2.6 實現內存分區
大量的系統及軟件級的TSC (Technical Safety Concept)可以使用內存分區機制來實現。
通常BSW位于受信任 (Trusted)區域,部分SWC可以和BSW一樣在受信任區域,以管理 (Supervisor)權限運行。其它的內存區域可以劃分為多個內存分區,每個內存分區內可以有一個或多個SWC以用戶態運行。
現代的安全相關的微處理器通常都在硬件級別上支持內存分區機制,這主要是通過內存保護單元 (Memory Protection Unit, MPU)來實現的。
在一個典型的MPU實現中,不受信的應用也可以配置為訪問多個內存區域。訪問的方式可以是讀、寫、執行及這些的組件。針對MPU的配置要用管理權限。
MPU的保護可以針對內存、Flash及外設進行。另外,使用內存分區的可能場景有如下幾個:
SWC位于同一個內存分區中
位于同一個內存分區中的SWC可以相互訪問內部數據,進而可以造成內部數據破壞
標準定義SWC不能直接訪問外設,因為處理器的架構對于SWC來說不透明。如果強行使用SWC訪問外設,這會導致系統嚴重的安全風險
SWC位于不同的內存分區中
位于不同內存分區的的SWC不可以相互訪問內部數據,也就不能破壞其它SWC的數據了
標準定義SWC不能直接訪問外設,因為處理器的架構對于SWC來說不透明。如果強行使用SWC訪問外設,這會導致系統嚴重的安全風險
MCAL驅動程序
MCAL驅動是一系列函數集合,如讀、寫及初始化等。這類接口必須在BSW或CDD中執行
MCAL驅動可以訪問外設空間,根據不同的處理器實現,可能會需要管理權限
3 檢測與響應
內存分區的安全機制通過限制訪問內存及支持內存映射的外設的方法來實現保護。一塊分區內的代碼,無法修改另一個分區的數據。內存分區也支持只讀方式的訪問,這個可以用來保護那些基于內存映射訪問的硬件。SWC也可以被限定為禁止訪問CPU的寄存器,如重新配置等。
在支持MPU或MMU的硬件上使用內存分區機制,操作系統要事先進行合理的配置來檢測和阻止不正確的內存訪問。一旦出現了在非受信區域的內存訪問或者執行了不合法的CPU指令,這些訪問首先會被阻止,然后處理器硬件會產生一個異常 (Exception)。操作系統和RTE會處理這些異常,執行內存分區的關閉 (Shutdown),或重啟分區內的所有SWC的動作。
4 限制條件
如果分區內的SWC都設置為相同的ASIL等級,則不需要按照ISO 26262中要求的FFI來設計安全機制。同時,對于OS-Application,可以包含多個SWC,但內存分區的關閉或重啟機制是針對整個分區進行,所以即使狀態正常的SWC也會受到影響
內存分區機制不適用于受信任的OS-Application,受信區域中的代碼執行不會被保護機制監控Task級的內存保護不是AUTOSAR的強制標準,所以OS-Application內部的FFI可能內存分區會帶來性能上的影響。由于增加了內存分區,會導致上下文的切換增多BSW的軟件不支持內存分區,所以才會有Safe BSW的方案。
審核編輯:劉清
電子發燒友App
































評論