楊弋 仝敏 衛(wèi)一芃



【摘要】? ? 為了滿足嵌入式操作系統(tǒng)對空間保護、隔離故障、防止故障蔓延、空間和資源之間的分離保護機制等能力,本文在嵌入式操作系統(tǒng)中提出了實時進程的概念。通過研究實時進程的功能架構(gòu)、實時進程的資源管理、空間管理劃分及映射、實時進程的通信、運行方式等功能,剖析了實時進程在嵌入式操作系統(tǒng)與UNIX/Linux等傳統(tǒng)桌面系統(tǒng)的功能差異,以及不同于傳統(tǒng)進程模型的功能特點。隨著嵌入式實時操作系統(tǒng)在各個領(lǐng)域應(yīng)用越來越廣泛,越來越多的新技術(shù)的應(yīng)用都需要高可靠實時性強高安全的系統(tǒng)作為技術(shù)支撐,實時進程機制將在嵌入式實時操作系統(tǒng)中發(fā)揮關(guān)鍵作用。
【關(guān)鍵詞】? ? 嵌入式實時操作系統(tǒng)? ? 實時進程
引言:
嵌入式操作系統(tǒng)產(chǎn)品出現(xiàn)于20世紀80年代初,從最初的只有一個微內(nèi)核到發(fā)展到現(xiàn)在成了一個具有龐大生態(tài)的復(fù)雜系統(tǒng)。早期的嵌入式操作系統(tǒng)的應(yīng)用場景單一,功能簡單,嵌入式硬件的結(jié)構(gòu)和功能也相對單一,應(yīng)用的開發(fā)人員甚至不需要使用操作系統(tǒng)就可以完成一個產(chǎn)品的研發(fā);早期的嵌入式操作系統(tǒng)與應(yīng)用之間并沒有空間和資源之間的分離保護機制,這種特性具有更好的靈活性與性能,但隨著嵌入式操作系統(tǒng)的發(fā)展,以及應(yīng)用場景逐漸復(fù)雜,原有的操作系統(tǒng)架構(gòu)已經(jīng)不能夠很好的支撐當下的應(yīng)用場景。在面向航空、航天、核電、軌道交通等強實時性高安全領(lǐng)域,系統(tǒng)集成復(fù)雜度的提升,帶來的就是應(yīng)用與系統(tǒng)的確定性和穩(wěn)定性的下降。隨著空間保護、隔離故障防止故障蔓延的概念的提出,近年來一些新型的嵌入式實時操作操作系統(tǒng)提出了實時進程(Real Time Process)的機制,該機制實現(xiàn)了應(yīng)用與應(yīng)用、應(yīng)用與操作系統(tǒng)空間隔離的能力。實時進程能力不僅可以保證應(yīng)用程序的故障不會蔓延到其他應(yīng)用程序及核心,同時可以滿足應(yīng)用程序?qū)τ趯崟r性的要求。本文主要介紹在嵌入式實時操作系統(tǒng)中的實時進程的主要能力及特點。
一、實時進程的功能組成
(一)實時進程的結(jié)構(gòu)
操作系統(tǒng)管理和分配資源的基本單位為進程,[1]進程運行在用戶態(tài),每個進程都包含獨立的地址空間,其中存放了應(yīng)用程序所需的代碼段、數(shù)據(jù)段、堆棧以及進程的相關(guān)資源(線程、信號量、消息隊列等),進程內(nèi)可以創(chuàng)建若干線程。對于傳統(tǒng)的桌面系統(tǒng),例如Linux/Unix,進程除了管理用戶程序的空間和對象資源外,其本身也參與調(diào)度,而根據(jù)進程的調(diào)度屬性,又可將進程分為實時進程與普通進程,其中普通進程的調(diào)度策略為CFS策略,[2]即公平調(diào)度原則策略;實時進程的調(diào)度策略為基于優(yōu)先級搶占的先來先服務(wù)調(diào)度策略。本文探討的嵌入式實時操作系統(tǒng)中的實時進程框架與上文描述的進程框架略有不同,首先,實時進程主要提供的是空間隔離保護的功能,其本身并不參與調(diào)度;其次,實時進程內(nèi)運行的為任務(wù),為了保證實時性,任務(wù)的調(diào)度策略為基于優(yōu)先級搶占的先來先服務(wù)調(diào)度策略。實時進程的結(jié)構(gòu)如圖1所示:
(二)實時進程的運行單元
實時進程內(nèi)包含有多個運行在用戶態(tài)的任務(wù),實時進程與任務(wù)之間是一對多的關(guān)系。用戶可以創(chuàng)建多個實時進程,每一個實時進程又可以創(chuàng)建多個任務(wù)。實時進程提供任務(wù)之間的空間隔離和操作系統(tǒng)之間的空間隔離;實時進程內(nèi)的所有任務(wù)共享實時進程內(nèi)的資源,包括對象、堆空間、設(shè)備等。實時進程內(nèi)的任務(wù)調(diào)度策略包括基于優(yōu)先級搶占的先來先服務(wù)策略及同優(yōu)先級時間片輪轉(zhuǎn)策略。實時進程內(nèi)的任務(wù)在操作系統(tǒng)核心內(nèi)均可見,系統(tǒng)內(nèi)的所有實時進程的任務(wù)拉平調(diào)度,競爭的對象還是任務(wù),與實時進程沒有關(guān)系。
二、實時進程的空間管理
實時進程運行在邏輯空間內(nèi),通過操作系統(tǒng)提供的存儲管理功能,由系統(tǒng)給應(yīng)用分配獨立的物理空間。不同的實時進程邏輯空間可以重疊,在應(yīng)用程序訪問內(nèi)存時,通過處理器的MMU單元將實時進程的邏輯地址轉(zhuǎn)換為實際的物理地址。
(一)實時進程的物理空間劃分
操作系統(tǒng)的物理空間劃分如圖2所示,從低到高依次為:操作系統(tǒng)空間、IO空間,操作系統(tǒng)的物理空間訪問范圍為0x00000000-0xFFFFFFFF(此處僅描述32位系統(tǒng)的情況);對于實時進程而言,實時進程的空間,包括用于實時進程間通信的共享存儲區(qū)空間均在操作系統(tǒng)運行時從操作系統(tǒng)堆中動態(tài)申請獲得。
(二)實時進程的邏輯空間劃分
每個實時進程應(yīng)用都有自己的邏輯空間,且每個實時進程的邏輯空間訪問范圍均為0x00000000-0xFFFFFFFF(此處僅描述32位系統(tǒng)的情況)。實時進程可運行在用戶態(tài),也可以通過系統(tǒng)調(diào)用進入到核心態(tài);運行在用戶態(tài)時,可以直接訪問實時進程的空間,當應(yīng)用通過系統(tǒng)調(diào)用進入核心態(tài)時,由于實時進程保存了一份核心的頁表拷貝,所以可以直接訪問核心的空間。當實時進程發(fā)生切換時,需要進行MMU的切換。邏輯空間劃分如圖3所示:
(三)實時進程的空間映射
實時進程空間隔離能力基于處理器所支持的存儲管理能力來實現(xiàn),通過MMU機制,一方面可以實現(xiàn)虛擬地址空間到物理地址空間的映射,另一方面,可以為這種映射關(guān)系附加相應(yīng)的讀寫屬性,操作系統(tǒng)根據(jù)每個實時進程的不同的空間需求,將空間映射表作為實時進程管理的私有數(shù)據(jù)記錄,每個實時進程都有相互獨立且不重疊的物理空間。
實時進程的邏輯空間可以根據(jù)用戶的需求進行設(shè)定,不同實時進程的邏輯地址可以相同或者不同。
三、實時進程的啟動與資源管理
(一)實時進程的啟動過程
實時進程的啟動過程主要分為以下步驟:1.加載實時進程映像,讀取映像信息;2.根據(jù)映像信息創(chuàng)建資源并跳轉(zhuǎn)到映像的起始地址開始執(zhí)行。實時進程的映像為一個標準的elf格式的可執(zhí)行文件,在操作系統(tǒng)運行時動態(tài)的被加載到內(nèi)存空間中并開始運行。通過操作系統(tǒng)的elf文件加載模塊,對可執(zhí)行文件映像進行解析,步驟如下:讀取映像的elf文件頭;計算文件頭部信息中代碼段、數(shù)據(jù)段、bss段的總大小,以及用戶需要的實時進程堆空間大小,并針對以上空間大小申請物理空間;根據(jù)映像中段信息中的邏輯地址,建立邏輯空間到物理空間的映射;將映像中的代碼段和數(shù)據(jù)段加載到內(nèi)存中,并對bss段清零;刷新并無效數(shù)據(jù)cache和指令cache;讀取映像頭部中的映像的入口地址作為實時進程初始任務(wù)的跳轉(zhuǎn)地址。在加載完畢實時進程映像后,還需要初始化一些基本的實時進程數(shù)據(jù),主要包括:包括進程控制塊,MMU空間等。在初始化完畢后,創(chuàng)建一個實時進程的初始任務(wù),初始任務(wù)的啟動入口為實時進程初始任務(wù)的跳轉(zhuǎn)地址,初始任務(wù)開始執(zhí)行則代表實時進程程序開始執(zhí)行。
(二)實時進程的資源管理
實時進程在執(zhí)行過程中,需要管理一些與實時進程相關(guān)的資源,主要包括:代碼段、數(shù)據(jù)段和bss段空間、用戶堆棧空間,以上空間均從核心操作系統(tǒng)堆空間中分配;其他的用戶應(yīng)用所需的資源空間,包括用戶申請的物理空間、對象空間、任務(wù)棧等,均從用戶堆棧空間中分配。
四、實時進程間通信
實時進程間空間互相隔離,實時進程不能夠通過訪問其他實時進程內(nèi)的空間。實時進程間通信主要采用公共對象或者共享存儲區(qū)的方式。
(一)實時進程的公共/私有對象
實時進程內(nèi)的消息隊列或者信號量等可用于通信的對象具有私有/公共的屬性,具有私有屬性的對象僅能夠在當前實時進程內(nèi)使用,其他實時進程無法訪問;如果實時進程內(nèi)的任務(wù)需要與其他實時進程內(nèi)的任務(wù)進行通信,則需要使用具有公共屬性的消息隊列或信號量等對象。對于一個公共對象,創(chuàng)建時其名稱格式為“/***”,對于私有對象,名稱前不允許加“/”,系統(tǒng)通過“/”來區(qū)分公共和私有。
公共消息隊列緩沖空間為內(nèi)核空間,由于每個實時進程間空間隔離,消息的發(fā)送與接收需要使用操作系統(tǒng)內(nèi)核的一塊緩沖空間進行數(shù)據(jù)過渡。當用戶任務(wù)通過公共消息隊列發(fā)送消息給另一個實時進程的任務(wù)時,首先通過系統(tǒng)調(diào)用訪問進入核心態(tài),之后將用戶的消息緩沖空間的內(nèi)容拷貝至操作系統(tǒng)內(nèi)核的消息緩沖空間中;當用戶任務(wù)通過公共消息隊列接收另一個實時進程的任務(wù)發(fā)送的消息時,首先通過系統(tǒng)調(diào)用訪問進入核心態(tài),之后將操作系統(tǒng)內(nèi)核的消息緩沖空間的內(nèi)容拷貝至用戶的消息緩沖空間中。
(二)共享存儲區(qū)
共享存儲區(qū)是一個或多個實時進程都可以訪問的一塊內(nèi)存區(qū)域。共享存儲區(qū)分為兩種:共享數(shù)據(jù)區(qū)和共享IO區(qū)。一塊共享數(shù)據(jù)區(qū)必須與一塊物理內(nèi)存區(qū)域進行關(guān)聯(lián)。共享數(shù)據(jù)區(qū)對應(yīng)于內(nèi)核中的一塊可用的內(nèi)存區(qū),用戶可以自行指定一段已經(jīng)映射但沒有使用的物理空間或者由操作系統(tǒng)動態(tài)分配一段物理空間,作為映射的物理空間;用戶可以自行指定一段已經(jīng)映射但沒有使用的邏輯空間或者由操作系統(tǒng)動態(tài)分配一段邏輯空間,作為映射的邏輯空間;最后建立邏輯空間到物理空間之間的映射。物理空間和邏輯空間必須按照MMU頁面對齊。一塊共享IO區(qū)必須與一塊IO空間進行關(guān)聯(lián)。共享IO區(qū)對應(yīng)于系統(tǒng)中的某個IO設(shè)備,物理地址需要用戶根據(jù)設(shè)備情況指定。用戶可以自行指定一段已經(jīng)映射但沒有使用的邏輯空間或者由操作系統(tǒng)動態(tài)分配一段邏輯空間,作為映射的邏輯空間;最后建立邏輯空間到IO空間之間的映射。IO空間和邏輯空間必須按照MMU頁面對齊。
共享存儲區(qū)空間操作系統(tǒng)內(nèi)核以及實時進程均可訪問,根據(jù)共享存儲區(qū)屬性對共享存儲區(qū)進行組織管理。共享存儲區(qū)的屬性主要包含:只讀、只寫、讀寫、不允許訪問。完成共享存儲區(qū)的建立后,共享存儲區(qū)空間的訪問屬性已經(jīng)確定,不能通過程序進行更改。
共享存儲區(qū)由發(fā)起的實時進程通過接口進行創(chuàng)建,其他的實時進程要操作這段共享存儲區(qū)時,通過接口對這塊共享存儲區(qū)打開后操作。
五、實時進程的中斷異常
當中斷/異常產(chǎn)生時,處理器進入核心操作系統(tǒng)的中斷異常入口,對現(xiàn)場上下文進行保護,之后轉(zhuǎn)入核心操作系統(tǒng)安裝的中斷異常處理程序,處理完成后,如果不需要通知實時進程,則執(zhí)行上下文現(xiàn)場恢復(fù),最后中斷異常返回;如果需要通知實時進程,則通過信號的方式通知實時進程的任務(wù)。
當系統(tǒng)從核心返回用戶任務(wù)時,如果此時系統(tǒng)產(chǎn)生了信號,系統(tǒng)會發(fā)送信號給用戶任務(wù),之后返回到用戶任務(wù),并執(zhí)行信號處理。如果需要通過信號的方式在核心產(chǎn)生中斷/異常時通知實時進程,則需要通過信號相關(guān)的服務(wù)掛接相應(yīng)的信號處理服務(wù)。
六、實時進程的設(shè)備管理
實時進程使用設(shè)備管理的方式有以下兩種:1.在核心操作系統(tǒng)中通過設(shè)備管理注冊設(shè)備驅(qū)動,之后通過系統(tǒng)調(diào)用方式直接對核心設(shè)備管理進行調(diào)用使用,在實時進程應(yīng)用中即可直接通過標準的IO接口來訪問核心的設(shè)備。2.通過共享IO區(qū)將設(shè)備地址映射到實時進程中,通過直接訪問IO空間的方式來訪問設(shè)備。
七、實時進程的故障處理
實時進程中的應(yīng)用在發(fā)生故障后,通過操作系統(tǒng)通過的故障檢測報告機制來接管。應(yīng)用程序使用故障檢測報告接口注入的故障和操作系統(tǒng)內(nèi)核通過通用故障注入接口注入的故障均交由故障檢測報告處理。在故障發(fā)生后,可以通過故障檢測報告機制對故障信息進行獲取、記錄和展現(xiàn)。故障相關(guān)信息包括故障位置、類型、操作系統(tǒng)狀態(tài)、寄存器、堆棧信息等。在發(fā)生故障后可通過接口輸出相關(guān)的故障信息。
實時進程故障注入包括以下來源:1.用戶應(yīng)用程序注入故障。用戶應(yīng)用程序自行判斷運行邏輯錯誤,使用操作系統(tǒng)提供的用戶故障注入用戶接口注入故障,調(diào)用操作系統(tǒng)的故障處理功能,試圖恢復(fù)應(yīng)用程序的錯誤狀態(tài)以及防止應(yīng)用程序錯誤對操作系統(tǒng)和其他實時進程造成影響。2.實時進程運行狀態(tài)檢查。實時進程運行過程中在各關(guān)鍵環(huán)節(jié)檢查數(shù)據(jù)、狀態(tài)的正確性,如用戶輸入、請求資源等時機,當檢測到故障時即調(diào)用故障處理功能。
故障檢測報告的主要功能包括:1、記錄應(yīng)用程序和操作系統(tǒng)的故障信息,故障記錄不會因重啟而丟失。2.根據(jù)參數(shù)選擇記錄的故障信息內(nèi)容,包括:時間、故障點文件位置、故障任務(wù)、內(nèi)存信息、異常信息、寄存器信息、CoreDump、棧追蹤信息等。3.提供記錄故障前和記錄故障后調(diào)用用戶定義的故障處理動作的功能。4.提供管理故障日志記錄的功能,如顯示故障記錄、清空故障記錄等。5.可根據(jù)參數(shù)選擇特定的故障日志顯示方式,如僅顯示致命故障、僅顯示警告信息等。
八、結(jié)束語
本文研究了嵌入式實時操作系統(tǒng)中的實時進程機制,通過實時進程的功能架構(gòu)、空間管理和劃分及映射、實時進程的資源管理、實時進程的加載運行方式、實時進程間通信、實時進程對于中斷異常,設(shè)備管理的處理以及實時進程錯誤處理方面,簡要闡述了在嵌入式實時操作系統(tǒng)中的實時進程特性。隨著嵌入式實時操作系統(tǒng)的發(fā)展,以及應(yīng)用場景的逐漸復(fù)雜,安全性、數(shù)據(jù)保護以及空間隔離變得越來越重要。隨著嵌入式實時操作系統(tǒng)在各個領(lǐng)域應(yīng)用越來越廣泛,越來越多的新技術(shù)的應(yīng)用,如容器技術(shù)、深度學(xué)習(xí)等新興技術(shù)都需要高可靠實時性強高安全的系統(tǒng)作為技術(shù)支撐,實時進程機制將在嵌入式實時操作系統(tǒng)中發(fā)揮關(guān)鍵作用。
作者單位:楊弋? ? 仝敏? ? 衛(wèi)一芃? ? 中國航空工業(yè)集團公司西安航空計算技術(shù)研究所
參? 考? 文? 獻
[1] 仇陽. Linux內(nèi)核進程調(diào)度算法發(fā)展.電子世界,2017,(07).
[2] 蘇淑霞. Linux進程調(diào)度算法的研究及改進.數(shù)字技術(shù)與應(yīng)用,2014,(09).