李躍鵬,康婧婧,張健,王琪元
(許繼電氣股份有限公司,河南許昌461000)
VxWorks應(yīng)用開發(fā)中的異常分析及處理方法
李躍鵬,康婧婧,張健,王琪元
(許繼電氣股份有限公司,河南許昌461000)
在嵌入式實(shí)時軟件開發(fā)過程中,通常會由于非法指針、代碼段破壞、堆棧溢出、內(nèi)存泄漏、任務(wù)死循環(huán)等原因?qū)е孪到y(tǒng)異常,并且難以定位異常原因。文章基于嵌入式實(shí)時操作系統(tǒng)VxWorks,對開發(fā)過程中常見的異常進(jìn)行分析,并給出了異常故障記錄、異常定位以及異常解決等方法。
VxWorks;代碼段破壞;堆棧溢出;故障記錄;異常定位
隨著嵌入式實(shí)時操作系統(tǒng)在工業(yè)自動化、航天、軍事、通信等領(lǐng)域的快速發(fā)展與普及,越來越多的項(xiàng)目采用VxWorks、QNX、Windows CE、嵌入式Linux等嵌入式實(shí)時操作系統(tǒng)[1]。同時由于硬件系統(tǒng)處理性能越來越強(qiáng),嵌入式系統(tǒng)的軟件規(guī)模與復(fù)雜性不斷增大,嵌入式開發(fā)者受限于經(jīng)驗(yàn)和技術(shù)的不足,在軟件設(shè)計(jì)中不可避免地存在各種問題,如何能快速、正確的定位嵌入式軟件的異常并正確處理,在軟件開發(fā)過程中起著重要作用[2]。
通常嵌入式系統(tǒng)中存在非法指針、代碼段破壞、堆棧溢出、內(nèi)存泄漏、任務(wù)死循環(huán)等軟件錯誤,并且有些缺陷和錯誤難以發(fā)現(xiàn),一旦被觸發(fā)很可能造成系統(tǒng)死機(jī)或復(fù)位[3,4]。本文主要針對目前在嵌入式領(lǐng)域廣泛應(yīng)用的VxWorks操作系統(tǒng),討論如何能夠在VxWorks開發(fā)中快速對異常原因進(jìn)行定位分析并正確處理。
正文內(nèi)容。從實(shí)時性角度看,嵌入式操作系統(tǒng)不可能采用通用操作系統(tǒng)的虛擬內(nèi)存管理機(jī)制,即一般沒有段頁式的虛擬內(nèi)存管理,而是采用簡單、快速的內(nèi)存分配方案[5,6]。因?yàn)樘摂M內(nèi)存管理機(jī)制會導(dǎo)致不確定性的I/O阻塞時間,使得程序運(yùn)行期間不可預(yù)期。VxWorks雖然使用MMU(Memory ManagementUnit)和頁表,但其內(nèi)存映射相對簡單,虛擬地址等同于物理地址,這樣就導(dǎo)致了VxWorks的內(nèi)核同用戶程序處于同一內(nèi)存空間,系統(tǒng)中所有任務(wù)共享同一物理內(nèi)存空間,也就是說一個任務(wù)可以訪問任何的內(nèi)存地址。一旦某一個任務(wù)中存在錯誤的指針操作,訪問了系統(tǒng)代碼、數(shù)據(jù)段或者自定義運(yùn)行時段,就可能影響其他任務(wù)的運(yùn)行,甚至破壞系統(tǒng)內(nèi)核,導(dǎo)致系統(tǒng)崩潰,因此系統(tǒng)中重要內(nèi)存進(jìn)行保護(hù)至關(guān)重要,是保證一個嵌入式系統(tǒng)可靠性的方法。
VxWorks使用MMU不是提供虛擬地址和物理地址之間的靈活映射,更多是提供面向頁的Cache機(jī)制和權(quán)限控制機(jī)制。因此可以利用MMU的頁保護(hù)機(jī)制,對系統(tǒng)代碼段或者自定義運(yùn)行時代碼段進(jìn)行保護(hù)[15]。VxWorks中每一個虛擬頁都可以有一個或多個狀態(tài),分別為有效/無效、可寫、可讀、執(zhí)行、緩存/不緩存等。頁狀態(tài)可以用函數(shù)vmStateSet()實(shí)現(xiàn)[8]。在程序中如果存在自定義運(yùn)行時系統(tǒng),為了防止其他任務(wù)破壞該區(qū)域,可以在運(yùn)行時運(yùn)行前將對應(yīng)頁面設(shè)置為可讀和執(zhí)行,使別的任務(wù)不能重寫該頁面,具體方法如下所示:
同時,除了針對自定義內(nèi)存改變頁屬性方法外,還可以在Kernel Configuration中添加INCLUDE_PROTECT_TEXT組件,VxWorks就會對系統(tǒng)內(nèi)核代碼以及內(nèi)核組件進(jìn)行寫保護(hù)。添加INCLUDE_PROTECT_VEC_TABLE組件,則可以針對異常向量表進(jìn)行寫保護(hù)[7]。通過以上三種方法的組合使用,開發(fā)過程中基本實(shí)現(xiàn)了所有代碼段的保護(hù)。
異常處理過程中關(guān)鍵的是堆棧跟蹤,即使用堆?;厮莸姆椒▽?shí)現(xiàn)現(xiàn)場分析。堆棧跟蹤同處理器類型密切相關(guān),需要根據(jù)處理器定義的應(yīng)用程序二進(jìn)制接口(AB I-Application Binary Interface)規(guī)則進(jìn)行分析,其中主要包括基本數(shù)據(jù)類型、通用寄存器使用、參數(shù)傳遞規(guī)則、堆棧使用規(guī)則。下面以QorIQ Power?PC處理器P1010為例進(jìn)行說明,P1010為32位e500內(nèi)核,有32個通用寄存器,其中R1寄存器為堆棧寄存器SP,LR寄存器為鏈接寄存器[10]。
3.1 PowerPC應(yīng)用程序二進(jìn)制接口
AB I接口規(guī)定了應(yīng)用程序與操作系統(tǒng)、應(yīng)用程序與庫、應(yīng)用程序的組成部分之間的底層接口,其目的是使不同編譯器編譯出來的二進(jìn)制文件可以互相使用。堆棧的使用規(guī)則也由ABI定義,圖1是PowerPC函數(shù)調(diào)用的堆棧組織結(jié)構(gòu)[9]。
圖1 PowerPC堆棧組織結(jié)構(gòu)
圖1中,Back chain為每個函數(shù)棧幀的最低地址,根據(jù)該Back chain可以找到上一級棧幀的起始位置。LR save word為該函數(shù)執(zhí)行完,返回到上一級函數(shù)調(diào)用地址的下一條指令位置,得到該地址就可以找到函數(shù)調(diào)用地址,通過查找符號表就能得到該函數(shù)名稱。SP為函數(shù)的堆棧指針。
3.2 函數(shù)調(diào)用規(guī)則
對任意目標(biāo)二進(jìn)制代碼objdump反匯編,并結(jié)合ABI應(yīng)用程序二進(jìn)制接口分析,發(fā)現(xiàn)幾乎所有的函數(shù)開頭都有如下形式[11]:
在函數(shù)的結(jié)尾都有如下形式:
根據(jù)以上分析函數(shù)調(diào)用中存在明顯的特征標(biāo)志,只要在需要分析代碼段的上下文搜索特征標(biāo)志,就可以找到函數(shù)入口地址以及返回地址。函數(shù)的入口地址得到后,通過VxWorks提供的函數(shù)symFindByValue()獲得函數(shù)的名稱。具體的流程如圖2所示。
根據(jù)流程圖可以得到被調(diào)用函數(shù)的入口地址(LR-1)以及返回地址(PrevSP),再將返回地址帶入流程圖起始搜索位置進(jìn)行搜索,可以得到調(diào)用函數(shù)的入口地址以及返回地址,依次進(jìn)行迭代即可得到完整的函數(shù)調(diào)用鏈。
圖2 堆棧跟蹤分析流程
當(dāng)系統(tǒng)出現(xiàn)異常時,根據(jù)異常中斷服務(wù)程序中記錄的當(dāng)前堆棧指針,再根據(jù)圖2的分析流程進(jìn)行迭代分析,就可以對發(fā)生異常時的堆棧進(jìn)行跟蹤,獲得發(fā)生異常位置前后的函數(shù)調(diào)用關(guān)系,對問題分析提供了更多的信息,方便了用戶對問題的定位[12]。
4.1 故障記錄
VxWorks 6.x提升了系統(tǒng)故障診斷與定位能力,提供了錯誤檢測與報(bào)告工具(Error Detective and Reporting,簡稱為ED&R)[13],它能跟蹤系統(tǒng)運(yùn)行軌跡,在系統(tǒng)發(fā)生異常時,詳細(xì)記錄故障類型、故障位置、故障前后代碼、關(guān)鍵寄存器值以及當(dāng)前任務(wù)堆棧使用情況等,并將這些信息存儲在內(nèi)存高地址空間中,不過這些存儲的信息在目標(biāo)系統(tǒng)熱重啟時會丟失,如果保存的錯誤信息過多,ED&R會將最舊的信息覆蓋掉。
錯誤檢測和報(bào)告工具在集成開發(fā)環(huán)境Workbench下都是以組件的形式提供給用戶,用戶只需要在Kernel Configuration文件中添加INCLUDE_EDR_SHOW組件,在主機(jī)的shell環(huán)境下,使用函數(shù)edrShow即可查看異常故障記錄。程序開發(fā)人員根據(jù)這些信息可以準(zhǔn)確地查看系統(tǒng)中的漏洞,從而提高開發(fā)效率。
圖3 edrShow顯示故障記錄
4.2 故障存儲
系統(tǒng)使用錯誤檢測與報(bào)告工具將故障信息記錄在內(nèi)存中,可以隨時在串口打印查看故障信息,方便問題的查找,但是一旦處理器掉電或者系統(tǒng)發(fā)生故障看門狗復(fù)位系統(tǒng),內(nèi)存中的ED&R故障信息就會丟失。若能將ED&R故障信息進(jìn)行存儲保存,開發(fā)人員就可以隨時獲取并根據(jù)這些故障信息準(zhǔn)確地定位系統(tǒng)中的異常代碼。
在VxWorks中設(shè)備以文件的形式提供給用戶操作,當(dāng)打開設(shè)備時,就返回文件描述符[14]。VxWorks使用0、1、2三個文件描述符作為系統(tǒng)保留的標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出、標(biāo)準(zhǔn)錯誤輸出,并在usrConfig.c中對這三個標(biāo)準(zhǔn)文件描述符進(jìn)行初始化,將串口作為標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出、標(biāo)準(zhǔn)錯誤輸出設(shè)備[15]。默認(rèn)故障信息的輸出是在串口打印,因此需要在任務(wù)中將標(biāo)準(zhǔn)輸出、標(biāo)準(zhǔn)錯誤輸出重定向到指定的存儲文件上[12]。具體方法如下代碼所示:
這樣就可以將當(dāng)前任務(wù)狀態(tài)統(tǒng)計(jì)、內(nèi)存使用統(tǒng)計(jì)、堆棧上下文、ED&R故障等這些重要的信息存儲在FLASH中,具體路徑為tffs0目錄下的edr.log文件,這樣就不用擔(dān)心處理器掉電或者看門狗復(fù)位導(dǎo)致信息丟失,隨時可以使用這些豐富的信息記錄對異常進(jìn)行定位。
本文針對嵌入式操作系統(tǒng)VxWorks介紹了若干在軟件發(fā)中可能碰到的問題,分別對代碼段保護(hù)給出實(shí)現(xiàn)方法,任務(wù)堆棧跟蹤原理進(jìn)行分析,以及異常發(fā)生時如何對故障進(jìn)行記錄和存儲,以及ED&R故障信息的存儲,既保證了系統(tǒng)的穩(wěn)定運(yùn)行,同時也幫助了開發(fā)人員快速定位故障、快速解決問題。
[1]張敏燕.基于嵌入式實(shí)時操作系統(tǒng)VxWorks平臺的分析與研究[D].南京:南京理工大學(xué),2007.
[2]房同忠,楊卉卉,張華年,等.基于VxWorks的異常問題分析及調(diào)試方法的研究[J].工業(yè)控制計(jì)算機(jī),2012(6):23-24.
[3]汪慶發(fā).DSP的程序異常檢測技術(shù)研究[D].哈爾濱:哈爾濱工業(yè)大學(xué),2010.
[4]朱雪梅.基于動態(tài)方法的嵌入式軟件缺陷檢測技術(shù)研究與實(shí)現(xiàn)[D].杭州:杭州電子科技大學(xué),2014.
[5]路艷麗,雷英杰.Linux 2.6內(nèi)存保護(hù)機(jī)制研究[J].航空計(jì)算技術(shù),2006(3):56-59.
[6]陸超,朱賀飛,陳兆千,等.針對Linux操作系統(tǒng)的MMU設(shè)計(jì)[J].小型微型計(jì)算機(jī)系統(tǒng),2007(4):738-741.
[7]肖楠,高德遠(yuǎn),吳列治,等.基于VxWorks的PowerPC750 MMU初始化流程和內(nèi)存保護(hù)策略分析[J].科學(xué)技術(shù)與工程, 2008(5):1177-1182.
[8]劉小軍,李秀娟.嵌入式操作系統(tǒng)VxWorks的內(nèi)存管理技術(shù)研究[J].電子科技,2008(6):62-65.
[9]Freescale Semiconductor,Inc.PowerPC?e500 Core Family Reference Manual,Rev.1[M].2005,4.
[10]朱劍鋒,繆萬勝,康介祥.基于堆?;厮莸漠惓L幚韀J].計(jì)算機(jī)工程與設(shè)計(jì),2014(12):4176-4180.
[11]王澤民,蘆東昕,謝鑫,等.基于VxWorks的異常處理的研究和實(shí)現(xiàn)[J].計(jì)算機(jī)工程,2005(13):90-92.
[12]邊聚廣,魏海光,許春雷.基于異常處理的控制系統(tǒng)軟件故障定位方法[J].微處理機(jī),2012(4):59-62,66.
[13]周潔,劉永陽,甘躍斌,等.基于VxWorks內(nèi)存錯誤檢測與內(nèi)核核心轉(zhuǎn)儲分析與應(yīng)用[J].現(xiàn)代計(jì)算機(jī),2013(25):30-33.
[14]張敏燕.基于嵌入式實(shí)時操作系統(tǒng)VxWorks平臺的分析與研究[D].南京:南京理工大學(xué),2007.
[15]曹桂平.VxWorks設(shè)備驅(qū)動開發(fā)詳解[M].北京:電子工業(yè)出版社,2011.
Abnormal Analysis and Processing Method in VxWorks Application Development
LI Yue-peng,KANG Jing-jing,ZHANG Jian,WANG Qi-yuan (XJ Electric Co.,Ltd.,Xuchang 461000,China)
In the development of embedded realtime application,there are many reasons of this such as invalid point,code seg?ment damage,stack overflow,memory leakage,dead loop task.If it happens,the system would be abnormal and very difficult to debug for developer.This paper analyzes the general exceptions lead to abnormity base on VxWorks and provides the exception fault logging,locate the faults,and abnormal solutions method.
VxWorks;code segment damage;stack overflow;fault logging;fault detection
TP316.2
A
1009-3044(2017)19-0199-03
2017-05-16
李躍鵬(1988—),男,河南許昌人,助理工程師,碩士,主要研究方向?yàn)樘馗邏褐绷鬏旊娍刂票Wo(hù)平臺研發(fā);康婧婧,助理工程師,碩士;張健,助理工程師,碩士;王琪元,助理工程師,碩士。