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