張?zhí)煜?,黃建軍,李皖玲,孫 勇
(1.北京空間飛行器總體設(shè)計部,北京 100094;2.長城信息股份有限公司,湖南 長沙 410205)
隨著技術(shù)的發(fā)展,尤其伴隨載人航天、深空探測等重大航天工程的實施,航天器功能和復(fù)雜度不斷得到提高,航天應(yīng)用的軟件產(chǎn)品越來越多,規(guī)模越來越大[1-4]。對高可靠和穩(wěn)定操作系統(tǒng)應(yīng)用的需求越來越大,面對功能接口復(fù)雜的任務(wù)需求時,SpaceOS、Vxworks、QNX 等航天領(lǐng)域常用操作系統(tǒng)[5-9]存在驅(qū)動和第三方庫資源不夠豐富的問題[10-13]。同時,基于Linux 內(nèi)核的系統(tǒng)具有穩(wěn)定性、安全性、開源、便于移植、第三方支持廣泛等優(yōu)點,被廣泛應(yīng)用于服務(wù)器領(lǐng)域、銀行系統(tǒng)、汽車、高鐵、軍用等高可靠場景[14-17]。在面對復(fù)雜功能和接口的航天領(lǐng)域應(yīng)用時,基于Linux的操作系統(tǒng)具有應(yīng)用的可行性[18-20]。
航天作為高投入高風(fēng)險行業(yè),軟件產(chǎn)品質(zhì)量直接影響航天任務(wù)的成敗,因此對軟件的可靠性和安全性提出了更高的要求。通過保證軟件的可靠性,提高和確定整個產(chǎn)品的可靠性在航天領(lǐng)域至關(guān)重要[21-23]。其中軟件工程化是保證軟件質(zhì)量的有效方法[14]。由于國內(nèi)航天領(lǐng)域要求軟件代碼需經(jīng)過充分分析和評測[24],因此Linux 系統(tǒng)在航天領(lǐng)域的應(yīng)用面臨分析、評測等工程化問題。基于Linux 內(nèi)核的系統(tǒng)軟件規(guī)模龐大(根據(jù)應(yīng)用情況一般高達數(shù)百萬行),按照正常的工程化方案無法實施,本文結(jié)合工程實際,探討航天領(lǐng)域嵌入式Linux應(yīng)用的工程化方法。
在載人航天儀表系統(tǒng)領(lǐng)域,典型的基于嵌入式Linux 的系統(tǒng)軟件組成如圖1 所示。由圖1 可知,該軟件主要有UBOOT 模塊、Linux 內(nèi)核、板級支持包模塊和圖形庫模塊。
圖1 嵌入式Linux 系統(tǒng)軟件框架Fig.1 Framework of the embedded Linux system
由于Linux 系統(tǒng)軟件的規(guī)模龐大,為了提高軟件的可靠性,保證人力物力的最優(yōu)化使用,就需要在測試過程中有重點的進行分析和評測[26]。因此需對系統(tǒng)軟件的代碼進行重點與非重點的劃分,根據(jù)不同的情況,開展可靠性保證工作。主要流程如圖2所示。
圖2 基于Linux 的系統(tǒng)軟件工程化流程Fig.2 Process of Linux system software engineering
1)結(jié)合用戶層需求梳理應(yīng)用層涉及到的操作系統(tǒng)功能模塊,選用穩(wěn)定的內(nèi)核版本,使用專業(yè)工具,進行代碼裁剪和提煉。主要包括對操作系統(tǒng)的代碼進行功能代碼定位,劃分代碼重點與非重點,縮小代碼范圍。
2)針對劃分結(jié)果和圈定范疇,制定軟件可靠性保證方案,經(jīng)評審后實施。
3)根據(jù)不同的模塊,分別制定專項的可靠性驗證措施。其中UBOOT 模塊和板級支持包模塊為新研軟件,按照航天軟件工程化實施細則實施;對于商用Linux 內(nèi)核和圖形庫模塊,根據(jù)提煉重點進行針對性的測試和保證。
4)各模塊經(jīng)過驗證后,根據(jù)Linux 操作系統(tǒng)的特點,采取相應(yīng)的專項保證措施。
5)完成開發(fā)方軟件可靠性保證工作后,進行第三方測試、分系統(tǒng)級和系統(tǒng)級測試驗證,經(jīng)評審?fù)ㄟ^后,完成軟件保證總結(jié)。
代碼裁剪針對具體的應(yīng)用需求和系統(tǒng)內(nèi)核版本進行裁剪,降低系統(tǒng)無關(guān)冗余代碼,主要針對內(nèi)核和圖形庫模塊。UBOOT 模塊僅保留系統(tǒng)需要的引導(dǎo)模塊,代碼量由百萬萬余行降低至不足3 000 行,板級支持包為7 000 余行。裁剪穩(wěn)定版本的內(nèi)核,規(guī)模由千萬行經(jīng)過裁剪降至40 余萬行,圖形庫規(guī)模由80 萬行裁剪至30 萬行。
根據(jù)應(yīng)用需求的重要程度和安全等級,對裁剪后的Linux 系統(tǒng)軟件的任務(wù)功能進行梳理,并按照是否影響任務(wù)成敗因素劃分關(guān)鍵等級,作為代碼提煉的初始條件,同時搭建硬件動態(tài)測試環(huán)境。
針對Linux 系統(tǒng)軟件各功能及函數(shù)的調(diào)用分析,采用Valgrind 工具完成。使用Valgrind 工具運行應(yīng)用軟件,操作應(yīng)用軟件的各項功能,動態(tài)分析系統(tǒng)軟件調(diào)用情況,得出系統(tǒng)軟件函數(shù)調(diào)用關(guān)系圖。關(guān)系圖能夠清楚地顯示函數(shù)調(diào)用關(guān)系、調(diào)用次數(shù)、占用百分比等特征。通過對關(guān)系圖展開綜合分析,得出系統(tǒng)關(guān)鍵函數(shù)表。統(tǒng)計軟件提煉了Linux內(nèi)核和圖形庫各能模塊的關(guān)鍵函數(shù),為后續(xù)軟件可靠性質(zhì)量保證劃定了范圍。
系統(tǒng)軟件中的UBOOT 模塊主要完成Linux 系統(tǒng)引導(dǎo)的工作,參照對應(yīng)平臺進行自主研發(fā)。板級支持包模塊主要包括與外設(shè)有關(guān)的驅(qū)動代碼。2 個模塊代碼規(guī)模較小,均按新研制軟件開展工程化工作。
為保證Linux 系統(tǒng)軟件的可靠性,需對裁剪提煉后的系統(tǒng)軟件進行各項測試,包括單元測試、部件測試、配置項測試、人工走查、靜態(tài)分析和動態(tài)測試,同時,分析系統(tǒng)軟件的故障模式及失效模式。從工程化可實施的角度,對系統(tǒng)軟件的不同模塊,分別制定工程化方案。
1)新研模塊(UBOOT 和板級支持包)
UBOOT 和板級支持包需配合全部源代碼的靜態(tài)分析、單元測試、人工走查和功能測試,進行配置項測試。
2)商用模塊(Linux 內(nèi)核及圖形庫)
Linux 內(nèi)核和圖形庫選用的商用穩(wěn)定版本,措施主要包括對裁剪和提煉的代碼中的關(guān)鍵函數(shù)進行單元測試,結(jié)合用戶應(yīng)用軟件完成動態(tài)跟蹤測試,最后進行完整的配置項測試驗證。
基于Linux 系統(tǒng)軟件進行配置項測試,主要測試項目包括功能測試及性能測試。其中系統(tǒng)引導(dǎo)模塊報告系統(tǒng)的運行環(huán)境初始化、系統(tǒng)代碼搬移和運行跳轉(zhuǎn)。系統(tǒng)內(nèi)核模塊負責(zé)任務(wù)管理與調(diào)度、任務(wù)間同步與通信、時鐘管理、中斷管理、異常管理功能、內(nèi)存管理、文件系統(tǒng)管理、I/O 系統(tǒng)、C 語言函數(shù)庫、軟件升級和下載功能。圖形庫程序模塊包括顯卡初始化模塊、基本圖元繪制接口、著色接口、基本控件接口、頁面生成接口、幀緩存接口、坐標(biāo)轉(zhuǎn)換、投影變換函數(shù)等接口。
在開展相關(guān)測試的同時,需進行系統(tǒng)軟件的故障樹分析和失效模式分析,保證系統(tǒng)軟件的可靠性,主要工作內(nèi)容如下。
1)故障樹分析
通過對系統(tǒng)軟件進行故障分析,指導(dǎo)軟件的可靠性和安全性設(shè)計,同時確定軟件測試的重點和內(nèi)容,保證軟件的可靠性和安全性。對系統(tǒng)軟件進行軟件故障樹分析,得出故障發(fā)生時的底事件。為確保系統(tǒng)軟件的功能正常完成,通過設(shè)計、審查、測試等手段,避免保證相應(yīng)底事件的發(fā)生。
2)失效模式分析
對操作系統(tǒng)進行軟件失效模式及影響分析(System Failure Mode and Effects Analysis,SFMEA),經(jīng)分析找出軟件所有可能存在的、危害軟/硬件綜合系統(tǒng)可靠安全運行的失效模式,進而分析其產(chǎn)生的軟件或硬件的失效原因及影響,并在設(shè)計上采取相應(yīng)的改進措施,以保證軟/硬件綜合系統(tǒng)的可靠安全運行。
為了保證基于Linux 內(nèi)核的系統(tǒng)軟件的可靠穩(wěn)定,根據(jù)用戶應(yīng)用和系統(tǒng)聯(lián)合展開針對性的專項測試,具體測試項目如下所示。
1)供調(diào)用資源復(fù)核
編寫系統(tǒng)軟件測試用例,監(jiān)測系統(tǒng)軟件對應(yīng)用軟件提供的各種資源,包括文件系統(tǒng)、內(nèi)存資源、寄存器、數(shù)據(jù)緩沖區(qū)等進行測試,分析數(shù)據(jù)正常及異常時資源的使用情況,驗證系統(tǒng)軟件在正常情況下、臨界情況及溢出情況下是否有保護機制及容錯措施。將分析結(jié)果及使用約束,落實到系統(tǒng)軟件和應(yīng)用軟件的接口文檔中,作為其應(yīng)用軟件研制的依據(jù)。
2)內(nèi)存監(jiān)測分析
由于應(yīng)用程序持續(xù)的動態(tài)使用內(nèi)存,如果不及時釋放,隨著時間延長,內(nèi)存使用量越來越大,最終崩潰。Linux 系統(tǒng)軟件的內(nèi)存空間是經(jīng)過重映射的,用戶使用的內(nèi)存地址不對應(yīng)實際內(nèi)存地址。內(nèi)存地址分為內(nèi)核態(tài)和用戶態(tài),內(nèi)核訪問內(nèi)存地址和應(yīng)用軟件訪問內(nèi)存地址分開,不能直接互相訪問,需調(diào)用特殊的函數(shù)訪問,確保用戶進程任務(wù)無法破壞系統(tǒng)內(nèi)存,保障系統(tǒng)穩(wěn)定。用戶進程任務(wù)使用內(nèi)存地址也完全獨立,使得各個用戶進程之間不影響。
通過Valgrind 檢測應(yīng)用程序進程,分析內(nèi)存使用釋放情況,杜絕應(yīng)用軟件運行中出現(xiàn)內(nèi)存泄漏、數(shù)組越界、除數(shù)為零、非法地址訪問等操作的可能性,確保系統(tǒng)可靠運行。
3)數(shù)學(xué)庫函數(shù)驗證
應(yīng)用軟件會根據(jù)用戶需要進行數(shù)學(xué)計算,調(diào)用系統(tǒng)軟件的數(shù)學(xué)庫函數(shù)。如果數(shù)學(xué)庫函數(shù)的計算值有誤,會導(dǎo)致應(yīng)用任務(wù)執(zhí)行失敗,因此需逐一驗證系統(tǒng)軟件內(nèi)的數(shù)學(xué)庫函數(shù)。具體驗證方法是:針對某一函數(shù),在不同的取值空間范圍內(nèi)取10 個數(shù)據(jù)進行測試,包含對邊界數(shù)據(jù)的測試,確保數(shù)學(xué)庫函數(shù)計算的數(shù)據(jù)準(zhǔn)確可靠。
4)編譯選項復(fù)核
軟件編譯過程中的編譯選項會影響軟件編譯后的可執(zhí)行文件。調(diào)試系統(tǒng)后,修改編譯選項生成調(diào)試版本,調(diào)試版本與最終版本程序相比,只是在程序中加入了調(diào)試信息,其他相同。對系統(tǒng)軟件及應(yīng)用軟件編譯過程中用到的編譯選項進行復(fù)核,不能隨意變更軟件的編譯選項。
5)錯誤碼提示分析
系統(tǒng)軟件定義了一套錯誤碼,在軟件出現(xiàn)錯誤或崩潰時,提供錯誤信息幫助用戶快速定位錯誤位置。針對系統(tǒng)軟件錯誤碼,編譯測試用例進行錯誤碼提示分析,保證錯誤提示的可靠。驗證錯誤碼提示時,檢查系統(tǒng)軟件對錯誤狀態(tài)是否有相應(yīng)的保護及容錯機制,分析對應(yīng)用軟件功能實現(xiàn)的影響。
6)異常處理
系統(tǒng)軟件應(yīng)具備異常處理(CPU 執(zhí)行指令異常、非法地址訪問等)的功能,使用應(yīng)用軟件進行邊界測試、訪問非法地址等手段制造異常,檢測系統(tǒng)軟件的異常處理能力,確保囊括所有的異常情況。
7)圖形庫模塊分析
圖形庫采用開源軟件穩(wěn)定版本,被廣泛應(yīng)用于工業(yè)控制系統(tǒng)、功能手機、數(shù)碼相框等類型的產(chǎn)品中。此外,對系統(tǒng)軟件的圖形庫模塊進行專項分析,測試圖形庫實現(xiàn)的按鈕、文本框、編輯框、輸入法等,對界面顯示和視頻流顯示的畫中畫效果、顯示切換效果編寫測試用例進行測試。圖形庫的測試用例涵蓋圖形庫的各個功能,測試圖形顯示效果符合應(yīng)用需求。
8)運行瓶頸分析
進行系統(tǒng)軟件的瓶頸分析是實現(xiàn)系統(tǒng)軟件最優(yōu)性能的常用方法。系統(tǒng)硬件定型后,系統(tǒng)各個子系統(tǒng)資源確定,一般與系統(tǒng)性能相關(guān)的子系統(tǒng)有CPU、內(nèi)存、驅(qū)動和網(wǎng)絡(luò)。分析應(yīng)用軟件資源占用率,明確存在影響應(yīng)用軟件的運行瓶頸的子系統(tǒng),通過優(yōu)化程序結(jié)構(gòu),實現(xiàn)系統(tǒng)運行最優(yōu)化。
9)運行競態(tài)分析
Linux 系統(tǒng)軟件是多進程多線程系統(tǒng),各個進程和線程是并行運行的。進程和線程的數(shù)據(jù)共享采用共享內(nèi)存、隊列、信號燈等方式。并行運行的各個進程和線程會產(chǎn)生競態(tài)冒險等問題,所以對應(yīng)用軟件使用競態(tài)分析,合理運行自旋鎖、信號燈等機制,確保程序運行穩(wěn)定、結(jié)果唯一。
完成開發(fā)方的軟件可靠性保證后,設(shè)備需進行第三方評測與系統(tǒng)驗證。操作系統(tǒng)和應(yīng)用程序共同運行在真實設(shè)備平臺上,并以真實設(shè)備連接至設(shè)備各外部接口,實現(xiàn)對設(shè)備的輸入、輸出及響應(yīng)。在分系統(tǒng)級和系統(tǒng)級測試環(huán)境中,模擬真實信息輸入,開展產(chǎn)品軟硬件性能聯(lián)合測試。同步開展的第三方評測專家結(jié)合工程化方案中的評測項目和內(nèi)容,按照工程化要求,完成對UBOOT 和板級支持包代碼的需求說明、編碼規(guī)范檢查、人工走查、動態(tài)測試等相關(guān)項目。對商用部分的Linux 內(nèi)核及圖形庫提煉的函數(shù)接口及代碼文件,參考保證方案有重點的完成相關(guān)項目。
完成開發(fā)方、分系統(tǒng)用戶、總體用戶和第三方評測等所有驗證工作后,基于Linux 內(nèi)核的系統(tǒng)軟件,經(jīng)航天器真實運行環(huán)境下的考核驗證,利用航天器初樣和正樣進行各項測試試驗,完成軟件可靠性工程化的考核,最終執(zhí)行航天任務(wù)。
為應(yīng)對單粒子等空間環(huán)境,在工程實施過程中,在產(chǎn)品設(shè)計層面增加2 項措施:1)設(shè)計監(jiān)控進程中,監(jiān)測其他用戶進程,針對周期性進程采用計數(shù)監(jiān)測,發(fā)現(xiàn)計數(shù)異常越界后重啟該進程;針對非周期性進程采用狀態(tài)監(jiān)測,對非預(yù)期狀態(tài)進行進程重啟。2)系統(tǒng)程序內(nèi)核和文件系統(tǒng)采用分區(qū)雙備份方案,在啟動過程中,識別系統(tǒng)復(fù)位日志,選擇可靠的固件加載系統(tǒng)軟件。
截至目前,工程化后的系統(tǒng)軟件已隨載人航天器在軌工作2 年,工作狀況穩(wěn)定。
本文根據(jù)航天應(yīng)用的需求和Linux 系統(tǒng)的特點,結(jié)合工程實際,提出一種基于Linux 的系統(tǒng)軟件工程化方法,并加以實踐。按照新研部分和商用部分的劃分系統(tǒng)軟件,根據(jù)應(yīng)用的需求和軟件的特點,對不同的軟件模塊制定相應(yīng)的測試和保證方案,驗證基于Linux 內(nèi)核的系統(tǒng)軟件可靠性和安全性,滿足航天器型號軟件工程化管理的要求。在航天任務(wù)實踐中增加監(jiān)護進程和雙備份固件方法,保證了系統(tǒng)和產(chǎn)品的可靠運行,為其他相關(guān)領(lǐng)域操作系統(tǒng)軟件的應(yīng)用和工程化提供了一個解決思路。