摘 要:隨著信息技術(shù)的不斷發(fā)展,嵌入式設(shè)備也越來越多的在國防科技、網(wǎng)絡(luò)通信以及工業(yè)控制領(lǐng)域中應(yīng)用,因此對于系統(tǒng)的安全性與可靠性也越來越提出更多的要求,其中VxWorks操作系統(tǒng),不僅具有可搶占式調(diào)度、中斷延遲小、系統(tǒng)內(nèi)核可剪裁的優(yōu)勢,而且也被應(yīng)用到大多數(shù)的嵌入式產(chǎn)品中。以下本篇就將淺析在VxWorks系統(tǒng)中其內(nèi)存泄露檢測機(jī)制中存在的不足以及改進(jìn)對策。
關(guān)鍵詞:VxWorks系統(tǒng);內(nèi)存泄露檢測;不足
中圖分類號:TN929.53;TP319
基于當(dāng)前嵌入式設(shè)備存儲器容量較小的特征,因此對嵌入式系統(tǒng)的性能以及可靠性都提出較高的要求,特別是對于嵌入式操作系統(tǒng)的內(nèi)存管理問題,更是成為當(dāng)前的重點(diǎn),不僅會直接影響到嵌入式設(shè)備的正常運(yùn)行,還將會影響系統(tǒng)的安全性和可靠性。以下本篇就對VxWorks內(nèi)存管理中存在的不足進(jìn)行探討,并給出有效的改進(jìn)對策。
1 VxWorks操作系統(tǒng)內(nèi)存泄露介紹
VxWorks操作系統(tǒng)中內(nèi)存管理作為其重要的研究領(lǐng)域,解決以及處理內(nèi)存泄漏問題以成為重點(diǎn),就根據(jù)程序在申請到動態(tài)內(nèi)存,且使用完動態(tài)內(nèi)存后,不釋放動態(tài)內(nèi)存,并將其保存動態(tài)內(nèi)存的地址變量用作其它時期,使動態(tài)內(nèi)存并不能被釋放,其它程序不能再使用動態(tài)內(nèi)存,也無法被VxWorks操作系統(tǒng)回收,因此就會造成內(nèi)存泄漏[1]。內(nèi)存泄漏是因?yàn)槭韬鲆约板e誤而造成的程序在使用完之后未能釋放動態(tài)內(nèi)存的情況,針對內(nèi)存泄露問題,不僅會使VxWorks應(yīng)用程序申請動態(tài)內(nèi)存的行為失敗,也會導(dǎo)致服務(wù)中止,并且還會導(dǎo)致整個系統(tǒng)的資源崩潰。一般內(nèi)存泄露就是指系統(tǒng)中堆內(nèi)存的泄露,在云計(jì)算中虛擬技術(shù)作為關(guān)鍵技術(shù),針對虛擬機(jī)的內(nèi)存管理依然存在著內(nèi)存泄露風(fēng)險。
2 當(dāng)前VxWorks系統(tǒng)內(nèi)存泄露檢測機(jī)制
針對當(dāng)前內(nèi)存管理中面對于內(nèi)存泄漏的檢測方法中,可以分為動態(tài)檢測方法與靜態(tài)檢測方法兩類。其中動態(tài)檢測方法中,根據(jù)程序動態(tài)內(nèi)存分配時,就可以在內(nèi)存堆中作出標(biāo)記,那么當(dāng)程序退出的時候,釋放所分配內(nèi)存,可以通過檢查堆上的殘留的對象[2],以檢測程序內(nèi)存是否泄露。靜態(tài)檢測方法,就是通過程序源代碼進(jìn)行分析,之后再模擬所有可能執(zhí)行路徑,以此來判定程序中的可執(zhí)行路徑中是否存在安全缺陷,這樣的檢測不需要實(shí)際執(zhí)行程序,不僅能夠克服動態(tài)分析的開銷較大弊端,還可以提高檢測性能。
3 VxWorks系統(tǒng)內(nèi)存泄露檢測機(jī)制中存在的不足
對于當(dāng)前VxWorks操作系統(tǒng)之中,在內(nèi)存泄露檢測中,依然存在一定的不足,動態(tài)檢測方法雖然可以直接發(fā)現(xiàn)在實(shí)際程序中的缺陷,然而這樣的檢測機(jī)制中,時間開銷大,且程序執(zhí)行路徑覆蓋中還存在死角,其內(nèi)存泄露檢測結(jié)果的完備性不足[3],且實(shí)際中的漏報率較高。對于靜態(tài)分析檢測中,并不能精確判斷程序輸入以及環(huán)境變量等數(shù)據(jù)信息,因此在其檢測之中的模擬執(zhí)行路徑可能會存在不可行路徑,靜態(tài)分析方法的誤報率也較高。內(nèi)存泄漏檢測機(jī)制中,主要基于靜態(tài)代碼插樁、中斷式插入、熱補(bǔ)丁三種方式,但是這些都無法滿足嵌入式操作系統(tǒng)對內(nèi)存泄漏檢測機(jī)制的需求,不能滿足實(shí)時性、便捷性以及可靠性的要求,還會導(dǎo)致操作系統(tǒng)內(nèi)存崩潰。
4 改進(jìn)后的VxWorks 操作系統(tǒng)內(nèi)存泄露檢測機(jī)制
針對以上內(nèi)存泄露檢測機(jī)制中的不足,可以在基于Xen虛擬機(jī)的內(nèi)存管理機(jī)制,采取動態(tài)檢測虛擬機(jī)取檢測內(nèi)存泄露,其主要原理就是在虛擬機(jī)運(yùn)行時,可以修改開源軟件Valgrind中的源碼,將其內(nèi)插入監(jiān)測代碼,以便去動態(tài)截獲虛擬機(jī)中申請的內(nèi)存函數(shù)和釋放內(nèi)存函數(shù),將其記錄下來,以此來檢測內(nèi)存泄露,該內(nèi)存檢測機(jī)制不僅不需要修改被探測程序源代碼,也不需要去重新編譯,簡化檢測力度,降低內(nèi)存泄露檢測的漏報率。
4.1 動態(tài)截獲虛擬機(jī)內(nèi)存原理
該檢測機(jī)制中,對于內(nèi)存申請、釋放的接口均具有統(tǒng)一、簡單的特色,通過動態(tài)檢測方法通對內(nèi)存管理機(jī)制進(jìn)行研究,用來截獲內(nèi)存申請以及釋放的函數(shù),可重載內(nèi)存管理函數(shù)、內(nèi)存讀取函數(shù)以及進(jìn)行指針運(yùn)算,有效控制內(nèi)存的操作功能。在內(nèi)存分配以及回收中,主要是通過malloc與free實(shí)現(xiàn),通過鉤子程序與宏定義的方式進(jìn)行替換,并且還具備記錄調(diào)用函數(shù)源文件、與源文件所處位置的功能,還可以在自定義表中增加以及刪除調(diào)用信息,不管是針對管理內(nèi)存塊、堆、棧以及全局變量,只要是有指針引用該內(nèi)存,內(nèi)存塊的起始地址和內(nèi)存塊大小等信息就會被記錄到全局表中,從符號表中得到靜態(tài)內(nèi)存,通過重載內(nèi)存管理函數(shù)實(shí)現(xiàn)對堆里動態(tài)內(nèi)存的分配。
4.2 自動內(nèi)存泄漏檢測機(jī)制的優(yōu)勢
在基于VxWorks操作系統(tǒng)自動內(nèi)存泄漏檢測機(jī)制中,可以預(yù)定義內(nèi)存泄漏的門限以及內(nèi)存駐留時間門限,并通過中斷服務(wù)去喚醒檢測任務(wù),以此例收集泄漏內(nèi)存信息,不僅具有實(shí)時性、便捷性;自動內(nèi)存泄漏檢測機(jī)制,在可靠性方面也有很大的應(yīng)用價值,可以滿足不同內(nèi)存用戶環(huán)境下的內(nèi)存泄漏檢測需求。
4.3 自動內(nèi)存泄漏檢測機(jī)制實(shí)際應(yīng)用
在VxWorks操作系統(tǒng)的自動內(nèi)存泄漏檢測機(jī)制中,主要包括內(nèi)存塊頭結(jié)構(gòu)、中斷及檢測任務(wù)以及檢測結(jié)果三個部分,從而實(shí)現(xiàn)對VxWorks內(nèi)存泄露的有效檢測。其中在內(nèi)存塊頭結(jié)構(gòu)中,VxWorks 系統(tǒng)會在分配每個內(nèi)存塊的同時,也為其分配一個塊頭Block_Hdr,不僅標(biāo)記有指向前一塊指針,還包括塊大小、塊標(biāo)識等信息,其塊頭結(jié)構(gòu)如下所示:
Typedef struct blockHdr
{
struct blockHdr * pPrevHdr;
unsigned int nWords:31;
unsigned int free:1;
} BLOCK_HDR;
可以標(biāo)記任務(wù)ID、任務(wù)棧信息、內(nèi)存創(chuàng)建時間、內(nèi)存狀態(tài)以及內(nèi)存塊大小等。在VxWorks的中斷及檢測任務(wù)中,為提高VxWorks 的實(shí)時性,以中斷方式告知系統(tǒng)外部事件,判斷系統(tǒng)內(nèi)存占用率,提高中斷服務(wù)程序能力,進(jìn)行針對硬件的中斷處理。追加定位信息的內(nèi)存塊頭結(jié)構(gòu)如下所示:
Typedef struct memInfoHdr
{
unsigned int moduleID;
unsigned int taskID;
unsigned int stack[MAX_CALLLS];
unsigned int crtTime;
unsigned int isFreed;
unsigned int size;
} MEM_INFO_HDR;
在內(nèi)存泄露檢測中,實(shí)現(xiàn)內(nèi)存泄漏檢測的自動運(yùn)行,通過中斷及檢測任務(wù),保證檢測機(jī)制的實(shí)時性,提高內(nèi)存泄露檢測的靈活性,進(jìn)一步定位內(nèi)存泄漏點(diǎn)及問題代碼,實(shí)施中斷處理,自行啟動態(tài)內(nèi)存頭的信息,確保系統(tǒng)資源使用情況。
5 結(jié)束語
綜上所述,針對嵌入式操作系統(tǒng)的內(nèi)存泄漏問題,可以采取動態(tài)檢測虛擬機(jī)中內(nèi)存泄露的方法,對應(yīng)用程序中資源的申請、釋放以及資源使用情況進(jìn)行檢測,并插入有效的監(jiān)測代碼,以便檢測出VxWorks系統(tǒng)內(nèi)存泄露代碼,不僅具有一定的可行性,對提高VxWorks內(nèi)存泄露檢測機(jī)制也發(fā)揮不小的作用。
參考文獻(xiàn):
[1]朱筱菲,黃鳳崗.一種基于VxWorks的內(nèi)存分配算法[J].工業(yè)控制計(jì)算機(jī),2010,21(14):56-57.
[2]何先波,鐘樂海,蘆東昕.嵌入式操作系統(tǒng)封裝層的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用,2011,14(12):76-77.
[3]萬逸珠,戚文芽.嵌入式實(shí)時操作系統(tǒng)Vx Works的內(nèi)存管理方案[J].信息工程大學(xué)學(xué)報,2012,07(18):41-42.
作者單位:西安近代光學(xué)研究所,西安 710065