郭繼寧,于恩祥
(渤海大學(xué),遼寧錦州,121000)
在VxWorks下,使用系統(tǒng)本身提供的接口函數(shù)ExcConnect()來進(jìn)行異常處理只對(duì)PowerPC系列處理器有效,對(duì)目前使用同樣廣泛的Intel80x86系列處理器和ARM系列處理器無法提供有效支持。本文主要針對(duì)目前VxWorks異常機(jī)制可移植性差的問題,提出一種及時(shí)準(zhǔn)確并且與具體處理器類型無關(guān)的捕捉異常的方法。
在VxWorks下如果使用默認(rèn)的異常處理機(jī)制,處理結(jié)束后:產(chǎn)生異常的任務(wù)將被懸掛,且該消息將被傳送到控制臺(tái)??梢钥闯?,如果不對(duì)異常進(jìn)行處理,使用默認(rèn)的異常處理方法,對(duì)于一個(gè)系統(tǒng)來說往往是致命的。所以我們必須對(duì)系統(tǒng)默認(rèn)的異常處理方法進(jìn)行修改和完善。
可以將異常處理流程分為以下5個(gè)階段:
1)一個(gè)軟件錯(cuò)誤發(fā)生。
2)錯(cuò)誤的原因和性質(zhì)被一個(gè)異常對(duì)象攜帶。
3)程序檢測這個(gè)異常對(duì)象,或者允許它的存在,或者由其主動(dòng)上報(bào)。
4)檢測代碼決定如何處理異常。
5)異常處理完畢,恢復(fù)程序并繼續(xù)執(zhí)行。
本文設(shè)計(jì)的異常處理模塊采用鉤子函數(shù)的方式接收操作系統(tǒng)傳入的異?,F(xiàn)場;在內(nèi)存的保留區(qū)保存?zhèn)魅雲(yún)?shù),并釋放信號(hào)量以激活守護(hù)任務(wù);守護(hù)任務(wù)保存未解析的現(xiàn)場信息;采用堆棧回溯和匹配函數(shù)序言的方式進(jìn)行函數(shù)調(diào)用鏈分析,將結(jié)果保存到內(nèi)存保留區(qū);若存在外部存儲(chǔ)介質(zhì),則將解析后的現(xiàn)場和函數(shù)調(diào)用鏈分析結(jié)果寫入文件;對(duì)應(yīng)用層提供鉤子函數(shù)以實(shí)現(xiàn)恢復(fù)策略支持。
異常處理模塊的整個(gè)流程主要由兩部分組成:異常處理初始化流程和異常鉤子函數(shù)流程。初始化流程主要包括初始化全局變量和掛接異常處理鉤子函數(shù)。異常處理的處理過程設(shè)計(jì)如圖2所示:
異常處理過程中的關(guān)鍵是“堆棧分析”,即使用堆?;厮莸姆椒▽?shí)現(xiàn)現(xiàn)場分析,該功能的實(shí)現(xiàn)也是異常處理的難點(diǎn)?,F(xiàn)場分析與處理器類型密切相關(guān),需針對(duì)不同系列處理器分別分析異常類型、現(xiàn)場信息、運(yùn)行棧結(jié)構(gòu)、函數(shù)的序言和尾聲等內(nèi)容。下面以x86處理器為例進(jìn)行說明。
2.2.1 運(yùn)行時(shí)堆棧結(jié)構(gòu)
Intel80x86手冊(cè)中把指令執(zhí)行時(shí)由CPU控制器產(chǎn)生的同步中斷稱為異常。異常是由程序的錯(cuò)誤產(chǎn)生,或者由操作系統(tǒng)內(nèi)核必須處理的異常條件所產(chǎn)生。通常,編譯器產(chǎn)生的代碼中對(duì)堆棧的結(jié)構(gòu)和使用存在一個(gè)約定,其中一個(gè)重要的概念是堆棧幀(Stack Frame)或稱為活動(dòng)記錄(Active Record)。一個(gè)堆棧幀就是運(yùn)行棧中的一個(gè)存儲(chǔ)塊,它按照一定的規(guī)則描述了當(dāng)前函數(shù)的調(diào)用信息,一個(gè)棧框架對(duì)應(yīng)一次函數(shù)調(diào)用。Intel80x86的運(yùn)行棧結(jié)構(gòu)如圖2所示:
圖2 x86運(yùn)行棧
2.2.2 函數(shù)序言與尾聲的匹配
代碼段中,特征十分明顯的函數(shù)序言恰好位于函數(shù)入口處,所以只要在機(jī)器碼代碼段找到函數(shù)序言就獲得了其入口地址。對(duì)一個(gè)幀的分析需要一個(gè)搜索指針,初始值為現(xiàn)場PC或被調(diào)函數(shù)幀的返回地址ret[i],指針沿代碼段向后(低地址)移動(dòng),直到匹配函數(shù)序言的第一條語句為止。這時(shí)該指針的值即為該函數(shù)的入口地址。因此,匹配到函數(shù)序言,就找到了函數(shù)的入口地址。函數(shù)的入口地址得到以后,通過VxWorks提供的函數(shù)symFindByValue()獲得函數(shù)名。前提是生成的系統(tǒng)映像中包括了系統(tǒng)符號(hào)表。
序言匹配的方法是:選擇一個(gè)位于代碼段中待分析的函數(shù)體內(nèi)起點(diǎn)指針,向低地址方向移動(dòng)該指針,直至找到函數(shù)序言為止。
異常拋出機(jī)制指的是:當(dāng)用戶管理的數(shù)據(jù)結(jié)構(gòu)出現(xiàn)嚴(yán)重錯(cuò)誤時(shí)或用戶定義的全局變量失去一致時(shí),用戶進(jìn)程主動(dòng)觸發(fā)一個(gè)事先給定的異常,然后由自定義的異常處理任務(wù)對(duì)該異常進(jìn)行處理,并確定這個(gè)問題發(fā)生的進(jìn)程位置。這種方案實(shí)現(xiàn)簡單,拋出的異常和硬件定義的異常采用同一套處理流程。異常拋出接口定義為:
其中,參數(shù)wEosExcNo為支撐統(tǒng)一定義的異常類型;dwFunc為拋出異常的處理函數(shù)。
本文采用鉤子函數(shù)的方式接收操作系統(tǒng)傳入的異?,F(xiàn)場,避免了對(duì)寄存器進(jìn)行直接操作,從而實(shí)現(xiàn)了跨平臺(tái)獲取異?,F(xiàn)場信息,使軟件異常處理的可移植性和健壯性大大增強(qiáng)。這種異常處理的設(shè)計(jì)具有很高的推廣和實(shí)用價(jià)值,目前已應(yīng)用在航行數(shù)據(jù)記錄儀、列車運(yùn)行監(jiān)控記錄裝置的實(shí)時(shí)數(shù)據(jù)庫中。
圖1 異常處理的處理過程設(shè)計(jì)圖
[1]李玉深,周祖洋,萬楊.實(shí)時(shí)操作系統(tǒng)Vxworks下的異常處理[J].應(yīng)用科技,2005,32(5):30-32.LI Yushen,ZHOU Zuyang,WAN Yang.Excep-tion handling under realtime system Vxworks[J].Applied Science and Technology,2005,32 (5):30-32.
[2]王運(yùn)盛,王堅(jiān).VxWorks實(shí)時(shí)操作系統(tǒng)中的中斷處理機(jī)制分析[J].電訊技術(shù),2007,47(4):178-181.WANG Yunsheng,WANG jian.Analysis of the Interrupt Handling Mechanism in Embeded Re-al-Time Operating System VxWorks[J].Teleco-mmunication Engineering,2007,47(4):178-181.
[3]王澤民,蘆東昕,謝鑫.基于VxWorks的異常處理的研究和實(shí)現(xiàn)[J].計(jì)算機(jī)工程,2005,31 (13):90-92.WANG Zemin,LU Dongxin, XIE xin.Study and Implementation of Exception Handling Bas-ed on VxWorks[J].Computer Engineering,200-5,31(13):90-92.
[4]孔祥營,柏桂枝.嵌入式實(shí)時(shí)操作系統(tǒng)VxWor-ks及其開發(fā)環(huán)境Tornado[M].北京:中國電力出版社,2001.KONG Xiangying,BAI Guizhi.Embedded real-time operating system VxWorks and Tornado development environment[M].Beijing:China El-ectric Power Press,2001.
[5]陳智育,溫彥軍,陳琪.VxWorks程序開發(fā)實(shí)踐[M].北京:人民郵電出版社,2004.CHEN Zhiyu,WEN Yanjun,CHEN Qi.VxWor-ks development practice[M].Beijing:Posts & Telecom Press, 2004.
[6]張曉鷗,毛玉明.VxWorks異常問題調(diào)試方法分析[C].中國西部青年通信學(xué)術(shù)會(huì)議論文集,成都:四川省電子學(xué)會(huì),2006.ZHANG Xiaoou,MAO Yuming.VxWorks deb-ug exception analysis[C].The collection of the Chinese western youths’ communication acade-mic conference,Chengdu: Sichuan Institute of Electronics,2006.