衛一芃,李運喜
(中航工業西安計算技術研究所 陜西 西安 710068)
隨著微電子、容錯、軟件技術的發展,航空電子系統已逐步從原有的體系結構向綜合化模塊化航空電子系統(IMA)發展,以提高未來飛機的作戰能力[1]。上世紀末,美國就已經開始研制新一代飛機,并制定了滿足新一代飛機綜合化要求的技術標準ARINC。其中,ARINC 653是美國航電委員會針對數據綜合化的要求提出的應用程序接口標準[2-3]。新一代飛機的航電系統將是高度模塊化、綜合化的,其操作系統需采用專用的航電實時操作系統,在滿足綜合化要求以及保證實時性的前提下,對安全性要求非常高。在高安全性的實時操作系統中支持兩種運行形態:系統態和用戶態。用戶態的程序在運行過程中可能需要使用系統態的功能,由于跨兩態,用戶態的應用不能直接調用系統態下的服務,因此需要使用系統調用機制為用戶態的應用訪問系統態的服務提供解決途徑。
筆者詳細討論了某嵌入式實時操作系統中系統調用的機制以及實現方法。
某嵌入式實時操作系統是滿足ARINC 653標準要求的嵌入式實時操作系統,其軟件結構如圖1所示。

圖1 某嵌入式實時操作系統軟件結構圖Fig.1 Software structure diagram of an embedded real-time operating system
ARINC 653為保證IMA系統中運行的多個航電應用程序執行時不相互影響,提出分區的概念。分區是IMA系統中的一組功能相關的應用軟件,這些軟件在配置和執行時作為一個單一的軟件來對待[4]。相當于通用操作系統中的進程,包含自己的存儲器,上下文以及配置屬性。分區OS運行在用戶態,提供分區管理、分區間及分區內通信、時間管理、進程管理等功能。核心OS運行系統態,提供任務管理、任務間通信、信號管理、系統調用管理等功能。位于用戶態下的程序不能直接訪問系統態下的服務,系統調用機制為應用分區訪問核心OS的服務提供解決途徑,有效保護核心OS的安全[5-6]。
內核提供應用的服務需統一編號,使用表方式統一管理。當用戶態的應用需要調用內核提供的服務時,首先要執行一組特殊的指令使系統進入系統態,通過系統調用號查表得到函數的入口地址,執行內核服務,當調用完成后,內核將執行另一組特征指令將系統返回到用戶態。這里將從系統調用號、系統調用表、系統調用生成及工作過程4個方面描述系統調用機制。
核心OS為每個系統調用定義一個唯一的編號,編號的定義方式如下:
#define__NR_函數名 X
其中,X代表系統調用號,系統調用號定義的部分代碼如下:
#define__NR_SysCallInit 1
#define__NR_RegisterDynamicLibrary 2
#define__NR_fstat 18
#define__NR_creat 19
#define__NR_hmEventDispatch 20
通過這個獨一無二的編號可以關聯到一個特定的系統調用。當用戶空間的進程執行一個系統調用的時候,這個系統調用號就被用來指定要執行的系統調用,進程不會提及系統調用的名稱。
系統調用號一旦分配且完成編譯,就不能有任何變更。
系統調用表(syscall_table)用于記錄各個系統調用處理函數的入口地址,以系統調用號為偏移量能夠很容易在該表中找到對應處理函數地址,部分代碼如下:
.long SYM(syscall_entry) /*0*/
.long SYM(SysCallInit) /*1*/
.long SYM(fstat) /*18*/
.long SYM(creat) /*19*/
.long SYM(hmEventDispatch) /*20*/
核心OS內的syscall.h文件中定義了所有核心OS提供給上層應用的函數。通過編譯,系統生成系統調用號及系統調用表項,同時為每一個函數生成一個文件名為XXX_trap.c的文件,XXX代表函數名。該文件中記錄用_syscallN()封裝后的函數。
應用程序本身無法直接執行內核代碼,而是通過引發一個異常來促使系統切換到系統態執行系統調用處理程序_syscallN(),其中N表示參數個數,在X86體系結構上支持函數最多帶5個參數,PPC體系結構上支持函數最多帶7個參數。
在陷入核心OS時,_syscallN()將系統調用號傳給核心OS。在PPC體系結構中,系統調用號通過通用寄存器傳入,系統調用處理程序一旦執行,可以從通用寄存器中獲得數據,以下為PPC體系結構的_syscall2()代碼片段:
#define_syscall2(type,name,type1,arg1,type2,arg2)
type name(type1 arg1, type2 arg2)
{
unsigned long__sc_ret;
{
register unsigned long__sc_0__asm__ ("r0");
register unsigned long__sc_3__asm__ ("r3");
register unsigned long__sc_4__asm__ ("r4");
__sc_3= (unsigned long) (arg1);
__sc_4= (unsigned long) (arg2);
__sc_0=__NR_##name;
__asm____volatile__
("sc "
: "=&r" (__sc_3)
: "0" (__sc_3), "r" (__sc_0),
"r" (__sc_4)
: __syscall_clobbers);
__sc_ret=__sc_3;
}
__syscall_return (type);
}
由上述代碼片段可以看出,系統調用帶有2個參數,分別通過寄存器r3和r4傳遞,系統調用號通過寄存器r0傳遞。
以打開文件函數creat()為例,通過編譯后將生成creat_trap.c文件,該文件中記錄通過系統調用處理程序封裝后的creat()函數。應用程序調用creat()時,實際就是通過執行用_syscall2()封裝后的函數從用戶態進入系統態,完成系統調用功能。creat_trap.c文件中代碼片段如下:
_syscall2(T_WORD,creat,T_CONST T_BYTE*,name,T_WORD,mode)
系統調用的工作步驟如下:
1)保存所有當前上下文(即用戶態上下文);
2)應用程序通過軟中斷方式通知核心OS需要執行一個系統調用。X86體系結構上的軟中斷由int 0x80指令產生,PPC體系結構上的軟中斷由sc指令產生。
3)引起0x0c00中斷(系統調用中斷),進行異常處理,進入核心OS;
4)判斷系統調用號是否合法,如果為非法系統調用號,則退出;否則根據系統調用號在系統調用表syscall_table中查找函數的入口地址,并跳轉到該地址。
5)執行完畢后返回。
圖2以creat()為例反映了系統調用的工作步驟。

圖2 系統調用工作步驟Fig.2 Work steps of system call
分區OS中的進程通過系統調用產生阻塞性請求的時候,進程因等待系統調用的返回而阻塞。當分區OS中一個進程阻塞的時候,將導致整個分區阻塞,影響應用分區的正常執行。為解決阻塞性系統調用帶來的問題,引入worker任務機制進行處理。
當應用請求了阻塞性的服務時,核心OS中將會啟動相應的系統任務來進行應用請求的操作,通過這樣的方法實現異步IO機制。這種為實現異步IO操作而創建的系統任務稱為worker任務。筆者將從worker任務創建、分派及清理3方面描述worker任務。
3.1.1 worker任務創建
每個分區可支持的worker任務數在配置數據中定義。在分區創建的過程中,將根據配置的worker任務數創建任務,這些任務隸屬于對應的應用分區。所有創建的worker任務都處于worker任務空閑隊列中。
3.1.2 worker任務分派
分區OS根據調用的服務是否為阻塞服務決定是否分派worker任務,分派worker任務前,首先從可用的worker任務隊列中取得一個worker任務并激活該任務,將系統調用的方法交由worker任務處理,當worker任務能夠獲得資源則直接處理,完成后發送系統調用完成的事件,否則worker任務將阻塞在等待的資源上,直到資源被釋放,方可啟動運行,并通知應用分區。
3.1.3 worker任務清理
worker任務在處理阻塞性系統調用過程中,如果處于等待狀態,那么在應用分區設置為IDLE模式、應用分區重啟動過程中,需要對未完成的系統調用進行刷新操作,在對系統調用進行清理的同時,還需要對阻塞的worker任務進行清理,將阻塞在資源等待鏈上的worker任務摘除,并停止worker任務的執行。
采用worker任務機制可以有效地解決應用分區因阻塞性系統調用而無法繼續運行的問題。當系統調用發生阻塞時,啟動worker任務去等待資源,而當前系統調用返回特定的狀態給應用分區,應用分區經過狀態判斷,掛起分區內相應的應用進程,從而產生進程切換,執行其他應用進程,當worker任務等待的資源得到滿足時,則解掛worker任務執行,并通過發送信號通知應用分區阻塞狀態的解除。worker任務機制示意圖如圖3所示。

圖3 worker任務處理機制示意圖Fig.3 Schematic diagram of worker task processing mechanism
筆者深入研究了嵌入式實時操作系統中系統調用原理、參考國內外先進嵌入式實時操作系統中系統調用的實現方法,設計并實現了一種有效的系統調用方法,解決阻塞性系統調用給分區正常運行帶來的影響,保證分區的正常運行。通過在某嵌入式實時操作系統中的實現,文中涉及的設計和實現方法是安全的、可行的、有效的。在今后的工作中,將著重于更進一步提高系統調用的訪問效率及安全性方面的研究。
[1]王樹紅.嵌入式系統的現狀及發展趨勢[J].太原大學學報,2007,8(2):121-122,139.WANG Shu-hong,The present situation and developing trend of embedded system[J]Journal of Taiyuan university,2007,8(2):121-122,139.
[2]王麗杰.嵌入式實時操作系統設計探討[J].軟件世界,2007(20):51-53.WANG Li-jie.Discussion of embedded real time operating system design[J].Software World,2007(20):51-53.
[3]徐曉光,葉宏.分區間通信在航空電子系統中的設計與實現[J].航空計算技術,2005,35(1):45-47,58.XU Xiao-guang,YE Hong.The design and implementation of inter-partition communication in avionics systems[J].Aeronautical Computing Technique,2005,35(1):45-47,58.
[4]ARINC.Specification 653-1,avionics application software standard interface[S].2003.
[5]Rushby J.Partitioning in avionics architectures requirements mechanisms and assurance[R].NASA,2000.
[6]葛仁北.系統調用與操作系統安全[J].計算機工程與應用,2002(19):97-99.GE Ren-bei.System call and computer operation system security [J].Computer Engineering and Applications,2002(19):97-99.