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