国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

VxWorks應用開發(fā)中的異常分析及處理方法

2017-08-16 06:24:50李躍鵬康婧婧張健王琪元
電腦知識與技術 2017年19期
關鍵詞:函數(shù)調用堆棧內存

李躍鵬,康婧婧,張健,王琪元

(許繼電氣股份有限公司,河南許昌461000)

VxWorks應用開發(fā)中的異常分析及處理方法

李躍鵬,康婧婧,張健,王琪元

(許繼電氣股份有限公司,河南許昌461000)

在嵌入式實時軟件開發(fā)過程中,通常會由于非法指針、代碼段破壞、堆棧溢出、內存泄漏、任務死循環(huán)等原因導致系統(tǒng)異常,并且難以定位異常原因。文章基于嵌入式實時操作系統(tǒng)VxWorks,對開發(fā)過程中常見的異常進行分析,并給出了異常故障記錄、異常定位以及異常解決等方法。

VxWorks;代碼段破壞;堆棧溢出;故障記錄;異常定位

1 背景

隨著嵌入式實時操作系統(tǒng)在工業(yè)自動化、航天、軍事、通信等領域的快速發(fā)展與普及,越來越多的項目采用VxWorks、QNX、Windows CE、嵌入式Linux等嵌入式實時操作系統(tǒng)[1]。同時由于硬件系統(tǒng)處理性能越來越強,嵌入式系統(tǒng)的軟件規(guī)模與復雜性不斷增大,嵌入式開發(fā)者受限于經(jīng)驗和技術的不足,在軟件設計中不可避免地存在各種問題,如何能快速、正確的定位嵌入式軟件的異常并正確處理,在軟件開發(fā)過程中起著重要作用[2]。

通常嵌入式系統(tǒng)中存在非法指針、代碼段破壞、堆棧溢出、內存泄漏、任務死循環(huán)等軟件錯誤,并且有些缺陷和錯誤難以發(fā)現(xiàn),一旦被觸發(fā)很可能造成系統(tǒng)死機或復位[3,4]。本文主要針對目前在嵌入式領域廣泛應用的VxWorks操作系統(tǒng),討論如何能夠在VxWorks開發(fā)中快速對異常原因進行定位分析并正確處理。

2 代碼段保護

正文內容。從實時性角度看,嵌入式操作系統(tǒng)不可能采用通用操作系統(tǒng)的虛擬內存管理機制,即一般沒有段頁式的虛擬內存管理,而是采用簡單、快速的內存分配方案[5,6]。因為虛擬內存管理機制會導致不確定性的I/O阻塞時間,使得程序運行期間不可預期。VxWorks雖然使用MMU(Memory ManagementUnit)和頁表,但其內存映射相對簡單,虛擬地址等同于物理地址,這樣就導致了VxWorks的內核同用戶程序處于同一內存空間,系統(tǒng)中所有任務共享同一物理內存空間,也就是說一個任務可以訪問任何的內存地址。一旦某一個任務中存在錯誤的指針操作,訪問了系統(tǒng)代碼、數(shù)據(jù)段或者自定義運行時段,就可能影響其他任務的運行,甚至破壞系統(tǒng)內核,導致系統(tǒng)崩潰,因此系統(tǒng)中重要內存進行保護至關重要,是保證一個嵌入式系統(tǒng)可靠性的方法。

VxWorks使用MMU不是提供虛擬地址和物理地址之間的靈活映射,更多是提供面向頁的Cache機制和權限控制機制。因此可以利用MMU的頁保護機制,對系統(tǒng)代碼段或者自定義運行時代碼段進行保護[15]。VxWorks中每一個虛擬頁都可以有一個或多個狀態(tài),分別為有效/無效、可寫、可讀、執(zhí)行、緩存/不緩存等。頁狀態(tài)可以用函數(shù)vmStateSet()實現(xiàn)[8]。在程序中如果存在自定義運行時系統(tǒng),為了防止其他任務破壞該區(qū)域,可以在運行時運行前將對應頁面設置為可讀和執(zhí)行,使別的任務不能重寫該頁面,具體方法如下所示:

同時,除了針對自定義內存改變頁屬性方法外,還可以在Kernel Configuration中添加INCLUDE_PROTECT_TEXT組件,VxWorks就會對系統(tǒng)內核代碼以及內核組件進行寫保護。添加INCLUDE_PROTECT_VEC_TABLE組件,則可以針對異常向量表進行寫保護[7]。通過以上三種方法的組合使用,開發(fā)過程中基本實現(xiàn)了所有代碼段的保護。

3 堆棧跟蹤

異常處理過程中關鍵的是堆棧跟蹤,即使用堆?;厮莸姆椒▽崿F(xiàn)現(xiàn)場分析。堆棧跟蹤同處理器類型密切相關,需要根據(jù)處理器定義的應用程序二進制接口(AB I-Application Binary Interface)規(guī)則進行分析,其中主要包括基本數(shù)據(jù)類型、通用寄存器使用、參數(shù)傳遞規(guī)則、堆棧使用規(guī)則。下面以QorIQ Power?PC處理器P1010為例進行說明,P1010為32位e500內核,有32個通用寄存器,其中R1寄存器為堆棧寄存器SP,LR寄存器為鏈接寄存器[10]。

3.1 PowerPC應用程序二進制接口

AB I接口規(guī)定了應用程序與操作系統(tǒng)、應用程序與庫、應用程序的組成部分之間的底層接口,其目的是使不同編譯器編譯出來的二進制文件可以互相使用。堆棧的使用規(guī)則也由ABI定義,圖1是PowerPC函數(shù)調用的堆棧組織結構[9]。

圖1 PowerPC堆棧組織結構

圖1中,Back chain為每個函數(shù)棧幀的最低地址,根據(jù)該Back chain可以找到上一級棧幀的起始位置。LR save word為該函數(shù)執(zhí)行完,返回到上一級函數(shù)調用地址的下一條指令位置,得到該地址就可以找到函數(shù)調用地址,通過查找符號表就能得到該函數(shù)名稱。SP為函數(shù)的堆棧指針。

3.2 函數(shù)調用規(guī)則

對任意目標二進制代碼objdump反匯編,并結合ABI應用程序二進制接口分析,發(fā)現(xiàn)幾乎所有的函數(shù)開頭都有如下形式[11]:

在函數(shù)的結尾都有如下形式:

根據(jù)以上分析函數(shù)調用中存在明顯的特征標志,只要在需要分析代碼段的上下文搜索特征標志,就可以找到函數(shù)入口地址以及返回地址。函數(shù)的入口地址得到后,通過VxWorks提供的函數(shù)symFindByValue()獲得函數(shù)的名稱。具體的流程如圖2所示。

根據(jù)流程圖可以得到被調用函數(shù)的入口地址(LR-1)以及返回地址(PrevSP),再將返回地址帶入流程圖起始搜索位置進行搜索,可以得到調用函數(shù)的入口地址以及返回地址,依次進行迭代即可得到完整的函數(shù)調用鏈。

圖2 堆棧跟蹤分析流程

當系統(tǒng)出現(xiàn)異常時,根據(jù)異常中斷服務程序中記錄的當前堆棧指針,再根據(jù)圖2的分析流程進行迭代分析,就可以對發(fā)生異常時的堆棧進行跟蹤,獲得發(fā)生異常位置前后的函數(shù)調用關系,對問題分析提供了更多的信息,方便了用戶對問題的定位[12]。

4 故障記錄與存儲

4.1 故障記錄

VxWorks 6.x提升了系統(tǒng)故障診斷與定位能力,提供了錯誤檢測與報告工具(Error Detective and Reporting,簡稱為ED&R)[13],它能跟蹤系統(tǒng)運行軌跡,在系統(tǒng)發(fā)生異常時,詳細記錄故障類型、故障位置、故障前后代碼、關鍵寄存器值以及當前任務堆棧使用情況等,并將這些信息存儲在內存高地址空間中,不過這些存儲的信息在目標系統(tǒng)熱重啟時會丟失,如果保存的錯誤信息過多,ED&R會將最舊的信息覆蓋掉。

錯誤檢測和報告工具在集成開發(fā)環(huán)境Workbench下都是以組件的形式提供給用戶,用戶只需要在Kernel Configuration文件中添加INCLUDE_EDR_SHOW組件,在主機的shell環(huán)境下,使用函數(shù)edrShow即可查看異常故障記錄。程序開發(fā)人員根據(jù)這些信息可以準確地查看系統(tǒng)中的漏洞,從而提高開發(fā)效率。

圖3 edrShow顯示故障記錄

4.2 故障存儲

系統(tǒng)使用錯誤檢測與報告工具將故障信息記錄在內存中,可以隨時在串口打印查看故障信息,方便問題的查找,但是一旦處理器掉電或者系統(tǒng)發(fā)生故障看門狗復位系統(tǒng),內存中的ED&R故障信息就會丟失。若能將ED&R故障信息進行存儲保存,開發(fā)人員就可以隨時獲取并根據(jù)這些故障信息準確地定位系統(tǒng)中的異常代碼。

在VxWorks中設備以文件的形式提供給用戶操作,當打開設備時,就返回文件描述符[14]。VxWorks使用0、1、2三個文件描述符作為系統(tǒng)保留的標準輸入、標準輸出、標準錯誤輸出,并在usrConfig.c中對這三個標準文件描述符進行初始化,將串口作為標準輸入、標準輸出、標準錯誤輸出設備[15]。默認故障信息的輸出是在串口打印,因此需要在任務中將標準輸出、標準錯誤輸出重定向到指定的存儲文件上[12]。具體方法如下代碼所示:

這樣就可以將當前任務狀態(tài)統(tǒng)計、內存使用統(tǒng)計、堆棧上下文、ED&R故障等這些重要的信息存儲在FLASH中,具體路徑為tffs0目錄下的edr.log文件,這樣就不用擔心處理器掉電或者看門狗復位導致信息丟失,隨時可以使用這些豐富的信息記錄對異常進行定位。

5 結束語

本文針對嵌入式操作系統(tǒng)VxWorks介紹了若干在軟件發(fā)中可能碰到的問題,分別對代碼段保護給出實現(xiàn)方法,任務堆棧跟蹤原理進行分析,以及異常發(fā)生時如何對故障進行記錄和存儲,以及ED&R故障信息的存儲,既保證了系統(tǒng)的穩(wěn)定運行,同時也幫助了開發(fā)人員快速定位故障、快速解決問題。

[1]張敏燕.基于嵌入式實時操作系統(tǒng)VxWorks平臺的分析與研究[D].南京:南京理工大學,2007.

[2]房同忠,楊卉卉,張華年,等.基于VxWorks的異常問題分析及調試方法的研究[J].工業(yè)控制計算機,2012(6):23-24.

[3]汪慶發(fā).DSP的程序異常檢測技術研究[D].哈爾濱:哈爾濱工業(yè)大學,2010.

[4]朱雪梅.基于動態(tài)方法的嵌入式軟件缺陷檢測技術研究與實現(xiàn)[D].杭州:杭州電子科技大學,2014.

[5]路艷麗,雷英杰.Linux 2.6內存保護機制研究[J].航空計算技術,2006(3):56-59.

[6]陸超,朱賀飛,陳兆千,等.針對Linux操作系統(tǒng)的MMU設計[J].小型微型計算機系統(tǒng),2007(4):738-741.

[7]肖楠,高德遠,吳列治,等.基于VxWorks的PowerPC750 MMU初始化流程和內存保護策略分析[J].科學技術與工程, 2008(5):1177-1182.

[8]劉小軍,李秀娟.嵌入式操作系統(tǒng)VxWorks的內存管理技術研究[J].電子科技,2008(6):62-65.

[9]Freescale Semiconductor,Inc.PowerPC?e500 Core Family Reference Manual,Rev.1[M].2005,4.

[10]朱劍鋒,繆萬勝,康介祥.基于堆棧回溯的異常處理[J].計算機工程與設計,2014(12):4176-4180.

[11]王澤民,蘆東昕,謝鑫,等.基于VxWorks的異常處理的研究和實現(xiàn)[J].計算機工程,2005(13):90-92.

[12]邊聚廣,魏海光,許春雷.基于異常處理的控制系統(tǒng)軟件故障定位方法[J].微處理機,2012(4):59-62,66.

[13]周潔,劉永陽,甘躍斌,等.基于VxWorks內存錯誤檢測與內核核心轉儲分析與應用[J].現(xiàn)代計算機,2013(25):30-33.

[14]張敏燕.基于嵌入式實時操作系統(tǒng)VxWorks平臺的分析與研究[D].南京:南京理工大學,2007.

[15]曹桂平.VxWorks設備驅動開發(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—),男,河南許昌人,助理工程師,碩士,主要研究方向為特高壓直流輸電控制保護平臺研發(fā);康婧婧,助理工程師,碩士;張健,助理工程師,碩士;王琪元,助理工程師,碩士。

猜你喜歡
函數(shù)調用堆棧內存
基于C語言的數(shù)學菜單的設計與實現(xiàn)
“春夏秋冬”的內存
當代陜西(2019年13期)2019-08-20 03:54:22
基于函數(shù)調用序列模式和函數(shù)調用圖的程序缺陷檢測方法*
嵌入式軟件堆棧溢出的動態(tài)檢測方案設計*
探討C++編程中避免代碼冗余的技巧
基于堆棧自編碼降維的武器裝備體系效能預測
Unity3D項目腳本優(yōu)化分析與研究
中國新通信(2017年1期)2017-03-08 03:12:21
基于內存的地理信息訪問技術
一種用于分析MCS-51目標碼堆棧深度的方法
上網(wǎng)本為什么只有1GB?
绥德县| 黄山市| 大悟县| 马鞍山市| 朔州市| 全州县| 西盟| 资溪县| 文昌市| 涞源县| 万安县| 喜德县| 丹棱县| 东源县| 马龙县| 衡山县| 扬中市| 凉山| 鹤峰县| 南京市| 龙井市| 甘南县| 庄河市| 阿勒泰市| 沅江市| 镶黄旗| 富民县| 望都县| 嘉祥县| 连南| 邹城市| 山阳县| 杭锦旗| 凤阳县| 马鞍山市| 武汉市| 饶平县| 普定县| 阳朔县| 九江县| 东乌珠穆沁旗|