專利名稱:一種嵌入式軟件安全內(nèi)存管理方法
技術(shù)領(lǐng)域:
本發(fā)明屬于計算機(jī)軟件內(nèi)存管理方法,特別是工業(yè)實(shí)時自動化裝置中嵌入式軟件的內(nèi)存管理方法。
背景技術(shù):
計算機(jī)軟件編程過程中離不開內(nèi)存管理,通常內(nèi)存管理算法都由操作系統(tǒng)提供;應(yīng)用軟件在運(yùn)行過程中不可避免地頻繁分配、釋放和使用內(nèi)存片段,而內(nèi)存片段的訪問安全性控制、以及內(nèi)存片段分配和釋放過程中形成的大量空間碎片,通常是造成系統(tǒng)不穩(wěn)定的重要起因。在現(xiàn)代嵌入式系統(tǒng)中,嵌入式軟件的功能越來越復(fù)雜,尤其是面向?qū)ο蠹夹g(shù)的廣泛使用,傳統(tǒng)的靜態(tài)內(nèi)存分配模式已不能滿足軟件編程過程中的算法需求。目前在嵌入式系統(tǒng)中大量采用各種嵌入式操作系統(tǒng),這些系統(tǒng)中提供了各具特色的內(nèi)存管理算法,它們大多關(guān)心內(nèi)存的分配和釋放引起的碎片問題,通常采用固定尺寸的空間分配策略,造成空間利用效率低,并且這些算法沒有檢測內(nèi)存片內(nèi)容改寫越界的問題。而這些問題,均是工業(yè)控制系統(tǒng)中滿7x24應(yīng)用中不能容忍的。為了在嵌入式系統(tǒng)中應(yīng)對越來越復(fù)雜的功能需要,面向?qū)ο缶幊碳夹g(shù)越來越受到重視;然而,面向?qū)ο缶幊碳夹g(shù)中許多面向?qū)ο蟊旧硖卣鲙Ыo設(shè)計者的優(yōu)越體驗(yàn),要大量動態(tài)創(chuàng)建對象時才能顯現(xiàn)出來,而大量動態(tài)創(chuàng)建和釋放對象實(shí)例往往會給系統(tǒng)中的內(nèi)存管理帶來大量的內(nèi)存碎片;往往是總的內(nèi)存用量不多,卻又分配不到需要的內(nèi)存片;直接基于地址指標(biāo)的內(nèi)存訪問方法,在這種情況下沒有有效的碎片收集方法來避免系統(tǒng)崩潰。
發(fā)明內(nèi)容
本發(fā)明的目的是提供一種嵌入式軟件安全內(nèi)存管理方法,能夠在內(nèi)存碎片多、內(nèi)存分配申請失敗時,進(jìn)行安全的內(nèi)存碎片收集,確保軟件安全可靠地運(yùn)行。本發(fā)明的目的是這樣實(shí)現(xiàn)的,基于固定訪問標(biāo)識的內(nèi)存管理方法,其特征是:包括:
內(nèi)存池,在RAM中靜態(tài)分配的存貯空間,用于存放分配給客戶代碼使用的內(nèi)存片; 索引表,在RAM中靜態(tài)分配的存貯空間,用于存放內(nèi)存片索引;
一組用于完成內(nèi)存片的管理的算法,這些算法在內(nèi)存池中分配內(nèi)存片并通過索引表進(jìn)行管理,客戶代碼采用固定的訪問標(biāo)識進(jìn)行申請、訪問和釋放等操作。內(nèi)存池是在嵌入式系統(tǒng)RAM中靜態(tài)分配出來的一片存貯空間,其大小由嵌入式軟件編程時預(yù)先配置,軟件中各功能應(yīng)用中需要分配的內(nèi)存片均在內(nèi)存池中分配。在嵌入式系統(tǒng)RAM中靜態(tài)分配出來的一片存貯空間,具有固定尺寸的結(jié)構(gòu),其數(shù)量在嵌入式軟件編程時預(yù)先配置,在內(nèi)存池中分配的內(nèi)存片的信息,都記錄在索引表中。在內(nèi)存池中分配的存貯空間,至少包括信息存貯空間和邊界標(biāo)志。用于完成內(nèi)存片的管理的算法是基于客戶代碼提供的訪問標(biāo)識。 所述的索引表為固定尺寸的結(jié)構(gòu),每個結(jié)構(gòu)中至少包含內(nèi)存片所屬的固定訪問標(biāo)識、內(nèi)存片起始地址、內(nèi)存片長度、分配計數(shù)四項(xiàng)記錄;至少包含內(nèi)存片分配、內(nèi)存片訪問、碎片收集、內(nèi)存片釋放的方法。所述的標(biāo)識用于內(nèi)存管理算法將訪問標(biāo)識與內(nèi)存片一對一地聯(lián)系起來;內(nèi)存片起始地址是內(nèi)存片在內(nèi)存池中的分配的空間的開始地址,用于為使用內(nèi)存片的;內(nèi)存片長度是客戶代碼申請內(nèi)存片時指定的信息存貯空間尺寸和邊界標(biāo)志長度之和;分配計數(shù)是指客戶代碼使用同一個固定標(biāo)志分配空間的次數(shù);內(nèi)存管理算法以固定訪問標(biāo)識為憑據(jù),在內(nèi)存池中搜索已分配過的具有相同固定訪問標(biāo)識的內(nèi)存片,對重復(fù)訪問標(biāo)志分配要求,對索引項(xiàng)中的訪問計數(shù)加一;分配失敗時算法主動完成內(nèi)存碎片收集。以固定訪問標(biāo)識為憑據(jù),在內(nèi)存池中搜索已分配過的具有相同固定訪問標(biāo)識的內(nèi)存片,并且檢測內(nèi)存片的邊界標(biāo)志是否被破壞。將已分配的內(nèi)存片強(qiáng)行移動到從內(nèi)存池起始地址開始的一片連續(xù)存貯空間中,各內(nèi)存片首尾相接,不留縫隙,同時修改索引表中對應(yīng)索引項(xiàng)中記錄的內(nèi)存片起始地址;收集后內(nèi)存池中最后Iv塊內(nèi)存片之后全部為自由存空間;以固定訪問標(biāo)識為憑據(jù),在內(nèi)存池中搜索已分配過的具有相同固定訪問標(biāo)識的內(nèi)存片;若找到,則將其中的分配計數(shù)減一;當(dāng)分配計數(shù)為O時,釋放內(nèi)存片。本發(fā)明的優(yōu)點(diǎn)是:
提供了一套用于嵌入式軟件編程過程中進(jìn)行動態(tài)內(nèi)存管理的一系列算法,實(shí)現(xiàn)了安全、高效的動態(tài)內(nèi)存管理;這可以克服原有設(shè)計模式下需要在編程階段為每個需要貯存器的代碼靜態(tài)分配內(nèi)存、并且還不能確保訪問的內(nèi)存片中的內(nèi)容的可靠性這一問題;尤其是現(xiàn)代嵌入式軟件發(fā)展到越來越復(fù)雜,面向?qū)ο蠹夹g(shù)在嵌入式軟件編程中得到越來越深入的應(yīng)用,在安全、可靠、無碎片的動態(tài)內(nèi)存管理技術(shù)的支持下,面向?qū)ο蠹夹g(shù)可發(fā)揮其全部的潛能。
圖1是本發(fā)明的實(shí)施結(jié)構(gòu)示意 圖2是內(nèi)存片的結(jié)構(gòu) 圖3是索引表的結(jié)構(gòu) 圖4是內(nèi)存片分配算法流程 圖5是內(nèi)存碎片收集算法流程 圖6是內(nèi)存片訪問算法流程 圖7是內(nèi)存片釋放算法流程 圖8是實(shí)施例一在GUI中的應(yīng)用。
具體實(shí)施例方式如圖1所示,一種嵌入式軟件安全內(nèi)存管理方法,包括:固定訪問標(biāo)識是嵌入式軟件中定義的地址、常數(shù)等恒定的、在代碼運(yùn)行期間不會發(fā)生變化的常量。基于固定訪問標(biāo)識的內(nèi)存管理方法,一組用于完成內(nèi)存片的管理的算法,這些算法在內(nèi)存池中分配內(nèi)存片并通過索引表進(jìn)行管理,客戶代碼采用固定的訪問標(biāo)識進(jìn)行申請、訪問和釋放等操作。
內(nèi)存池,在RAM中靜態(tài)分配的存貯空間,用于存放分配給客戶代碼使用的內(nèi)存片。索引表,在RAM中靜態(tài)分配的存貯空間,用于存放內(nèi)存片索引。所述內(nèi)存池是在嵌入式系統(tǒng)RAM中靜態(tài)分配出來的一片存貯空間,其大小由嵌入式軟件編程時預(yù)先配置,軟件中各功能應(yīng)用中需要分配的內(nèi)存片均在內(nèi)存池中分配。所述的索引表是在嵌入式系統(tǒng)RAM中靜態(tài)分配出來的一片存貯空間,具有固定尺寸的結(jié)構(gòu),其數(shù)量在嵌入式軟件編程時預(yù)先配置,在內(nèi)存池中分配的內(nèi)存片的信息,都記錄在索引表中。所述的內(nèi)存片是指結(jié)構(gòu)如圖2所示的在內(nèi)存池中分配占有的一片連續(xù)的存貯空間;至少包括信息存貯空間和邊界標(biāo)志;其中信息存貯空間用于為客戶代碼提供存貯信息用的內(nèi)存空間;邊界標(biāo)志用于識別客戶代碼是否修改了它們申請分配的信息存貯空間之外的存貯器空間。所述的客戶代碼是指嵌入式軟件中使用內(nèi)存管理算法獲得信息存貯空間的計算機(jī)程序代碼。所述的內(nèi)存管理方法至少包含內(nèi)存的4個算法:分配、訪問、碎片收集、釋放方法;這一系列算法都基于使用這些算法的客戶代碼提供的訪問標(biāo)識。所述的索引表中的固定尺寸的結(jié)構(gòu)如圖3所示,至少包含內(nèi)存片所屬的固定訪問標(biāo)識、內(nèi)存片起始地址、內(nèi)存片長度、分配計數(shù)四項(xiàng)記錄;其中內(nèi)存片所屬的標(biāo)識用于內(nèi)存管理算法將訪問標(biāo)識與內(nèi)存片一對一地聯(lián)系起來;內(nèi)存片起始地址是內(nèi)存片在內(nèi)存池中的分配的空間的開始地址,用于為使用內(nèi)存片的;內(nèi)存片長度是客戶代碼申請內(nèi)存片時指定的信息存貯空間尺寸和邊界標(biāo)志長度之和;分配計數(shù)是指客戶代碼使用同一個固定標(biāo)志分配空間的次數(shù)。一、所述的內(nèi)存管理方法中的內(nèi)存片分配算法2如圖4,方法步驟如下:
1)在索引表7內(nèi)按客戶代碼I提供的訪問標(biāo)識2搜索是否有相同訪問標(biāo)識13的索引項(xiàng)。若找到相同訪問標(biāo)識13的索引項(xiàng)17,則對索引項(xiàng)17中的分配計數(shù)16加一,返回索引項(xiàng)中記錄的內(nèi)存片起始地址15;若沒找到相同訪問標(biāo)識13的索引項(xiàng)17,則繼續(xù)下面的過程;
2)在內(nèi)存池10中搜索連續(xù)尺寸大于客戶代碼I申請空間尺寸要求的自由存貯空間8,若找到滿足要求的自由存貯空間8,自由存貯空間8開始的地址即是為客戶代碼分配內(nèi)存片9的開始地址15,則分配一個空白索引項(xiàng)17并填寫該索引項(xiàng)17、設(shè)置內(nèi)存片邊界標(biāo)識12,將新分配的內(nèi)存片9的信息空間11的起始地址作為分配的存貯空間的起始地址返回給客戶代碼I ;若找不到滿足需要的自由存貯空間8,則繼續(xù)下面步驟:
3)調(diào)用內(nèi)存碎片收集方法,整理內(nèi)存池10,將內(nèi)存碎片8合并成一個連續(xù)的自由存貯空間8 ;比較合并后的自由存貯空間8的尺寸是否滿足客戶代碼要求的空間尺寸的要求;若滿足,則自由存貯空間8開始的地址即是為客戶代碼分配內(nèi)存片9的開始地址,分配一個空白索引項(xiàng)17并填寫該索引項(xiàng)17、設(shè)置內(nèi)存片邊界標(biāo)識12,將新分配的內(nèi)存片9的信息空間11的起始地址作為分配的存貯空間的起始地址返回給客戶代碼I ;若不滿足,則返回0,通知客戶代碼I空間分配申請失敗。二、所述的索引項(xiàng)17填寫方法:
索引表7中內(nèi)存片長度14為O的索引項(xiàng)被認(rèn)為是空白索引項(xiàng)。
將訪問標(biāo)識13、內(nèi)存片長度14、內(nèi)存內(nèi)起始地址15、這3項(xiàng)信息記錄在索引項(xiàng)中,并將分配計數(shù)16置1,即為填寫索引項(xiàng);其中,內(nèi)存片長度14是客戶代碼申請的空間長度11與邊界標(biāo)志12長度之和;
三、所述的內(nèi)存碎片是指內(nèi)存池10中所有不連續(xù)的尺寸較小的自由存貯空間8片段的總稱。四、所述的自由存貯空間8是指在內(nèi)存池10中沒有被索引表7中各索引項(xiàng)記錄為被客戶代碼占用的存貯空間片段。五、所述的內(nèi)存碎片收集算法4如圖5,其過程步驟如下:
1)將內(nèi)存池10起始地址作為內(nèi)存碎片收集的起點(diǎn),該地地址作為下列步驟的當(dāng)前地址初值;
2)在索引表7中搜索當(dāng)前地址是否記錄為被占用,若被占用,轉(zhuǎn)到步驟4);若未被占用,則執(zhí)行步驟3);
3)搜索當(dāng)前地址之后距離最近的內(nèi)存片9起始地址的索引項(xiàng)17;若存在這樣的索引項(xiàng)17,則將該內(nèi)存片9整體復(fù)制到從當(dāng)前地址開始的存貯空間中,并將該索引項(xiàng)17內(nèi)存片起始地址15記錄修改為當(dāng)前地址;若不存在,則意味著從當(dāng)前地址開始到內(nèi)存池尾部的連續(xù)空間是自由存貯空間,內(nèi)存碎片收集過程結(jié)束;
4)跳過當(dāng)前索引項(xiàng)17中記錄的內(nèi)存片長度14,即將當(dāng)前地址加上內(nèi)存片長度14作為新的當(dāng)前地址;跳轉(zhuǎn)到步驟2)。七、所述的內(nèi)存管理方法中的內(nèi)存片訪問算法5是指:客戶代碼I通過固定訪問標(biāo)識2獲得對應(yīng)內(nèi)存片9中信息空間11起始地址的過程,如圖6,其過程步驟如下:
1)在索引表7內(nèi)按客戶代碼I提供的訪問標(biāo)識2搜索是否有相同訪問標(biāo)識13的索引項(xiàng)17。若找到記錄有該訪問標(biāo)識13的索引項(xiàng)17,則執(zhí)行步驟2);若沒找到該訪問標(biāo)識13的索引項(xiàng)17,則返回0,通知客戶代碼I內(nèi)存片9訪問操作失??;
2)按索引項(xiàng)17找到內(nèi)存片邊界12,檢查邊界標(biāo)志12;
3)若邊界標(biāo)志12正確,則返回內(nèi)存片9中信息空間11起始地址,并通知客戶代碼I一切正常;
4)修復(fù)邊界標(biāo)志12,返回索引項(xiàng)內(nèi)存片9中的信息空間11起始地址,并通知客戶代碼I內(nèi)存片9內(nèi)容不可靠。八、所述的內(nèi)存管理方法中的內(nèi)存片釋放算法6如圖7,其過程步驟臺下:
1)在索引表7內(nèi)按客戶代碼I提供的訪問標(biāo)識2搜索是否有相同訪問標(biāo)識13的索引項(xiàng)17。若找到記錄有該訪問標(biāo)識13的索引項(xiàng)17,則執(zhí)行步驟2);若沒找到該訪問標(biāo)識13的索引項(xiàng)17,則返回,并通知客戶代碼I內(nèi)存片9釋放操作失??;
2)將索引項(xiàng)17中的分配記數(shù)16減去一;若分配計數(shù)16值為0,則執(zhí)行步驟3);否則跳到步驟4) ;3)索引項(xiàng)17中的內(nèi)存片長度值置為0,即宣告該索引項(xiàng)為空白索引項(xiàng);
3)返回,并通知客戶代碼I內(nèi)存片釋放操作成功。九、圖8是本發(fā)明在GUI中的應(yīng)用舉例,以本發(fā)明為內(nèi)存管理器開發(fā)的GUI的基本思想是:
I)所有描述窗體、控件、行為的數(shù)據(jù)均采用靜態(tài)數(shù)據(jù)表18的形式固化在Flash存貯器中; 2)⑶I代碼19通過讀取這些靜態(tài)數(shù)據(jù)表18,繪制窗體及其控件的外觀到IXD上21,外觀可以是靜態(tài)的也可能是根據(jù)時間或交互輸入而變化的;
3)GUI代碼掃描交互設(shè)備(按鍵或觸摸屏)20的輸入,根據(jù)靜態(tài)數(shù)據(jù)表18中的行為描述,切換出新的窗體、關(guān)閉一或多級窗體;
4)在創(chuàng)建出新窗體和控件時,使用內(nèi)存片分配算法3,為對象實(shí)例分配空間,并在該空間中創(chuàng)建對象實(shí)例;
5)窗體或控件活動時,使用內(nèi)存片訪問算法5取回對象實(shí)例存貯空間的指針,并可獲知該存貯空間是否還有效;若無效了,則采取修復(fù)措施;
6)窗體或控件關(guān)閉時,使用內(nèi)存片釋放算法6釋放對象實(shí)例占用的存貯空間;
對象分配、訪問、釋放存貯空間,均是使用靜態(tài)數(shù)據(jù)表18中該描述對象的數(shù)據(jù)項(xiàng)的地址作為訪問標(biāo)識2 ;因此,在GUI代碼19執(zhí)行其間,任何一個窗體或者控件對象實(shí)例化后使用的存貯空間是唯一確定的;8)由于本發(fā)明獨(dú)特地采用了固定訪問標(biāo)識2作為內(nèi)存管理的唯一依據(jù),完全采用面向?qū)ο蠹夹g(shù)開發(fā)的GUI代碼19能夠可靠地進(jìn)行動態(tài)對象實(shí)例化、無障礙碎片收集,極大地提升了 GUI核心代碼開發(fā)的靈活和可靠性。
權(quán)利要求
1.基于固定訪問標(biāo)識的內(nèi)存管理方法,其特征是:包括: 內(nèi)存池,在RAM中靜態(tài)分配的存貯空間,用于存放分配給客戶代碼使用的內(nèi)存片; 索引表,在RAM中靜態(tài)分配的存貯空間,用于存放內(nèi)存片索引; 一組用于完成內(nèi)存片的管理的算法,這些算法在內(nèi)存池中分配內(nèi)存片并通過索引表進(jìn)行管理,客戶代碼采用固定的訪問標(biāo)識進(jìn)行申請、訪問和釋放等操作。
2.根據(jù)權(quán)利要求1所述的基于固定訪問標(biāo)識的內(nèi)存管理方法,其特征是:內(nèi)存池是在嵌入式系統(tǒng)RAM中靜態(tài)分配出來的一片存貯空間,其大小由嵌入式軟件編程時預(yù)先配置,軟件中各功能應(yīng)用中需要分配的內(nèi)存片均在內(nèi)存池中分配。
3.根據(jù)權(quán)利要求2所述的基于固定訪問標(biāo)識的內(nèi)存管理方法,其特征是:在嵌入式系統(tǒng)RAM中靜態(tài)分配出來的一片存貯空間,具有固定尺寸的結(jié)構(gòu),其數(shù)量在嵌入式軟件編程時預(yù)先配置,在內(nèi)存池中分配的內(nèi)存片的信息,都記錄在索引表中。
4.根據(jù)權(quán)利要求1所述的基于固定訪問標(biāo)識的內(nèi)存管理方法,其特征是:在內(nèi)存池中分配的存貯空間,至少包括信息存貯空間和邊界標(biāo)志。
5.根據(jù)權(quán)利要求1所述的基于固定訪問標(biāo)識的內(nèi)存管理方法,其特征是:用于完成內(nèi)存片的管理的算法是基于客戶代碼提供的訪問標(biāo)識。
6.根據(jù)權(quán)利要求1所述的基于固定訪問標(biāo)識的內(nèi)存管理方法,其特征是:所述的索引表為固定尺寸的結(jié)構(gòu),每個結(jié)構(gòu)中至少包含內(nèi)存片所屬的固定訪問標(biāo)識、內(nèi)存片起始地址、內(nèi)存片長度、分配計數(shù)四項(xiàng)記錄;至少包含內(nèi)存片分配、內(nèi)存片訪問、碎片收集、內(nèi)存片釋放的方法。
7.根據(jù)權(quán)利要求1所述的基于固定訪問標(biāo)識的內(nèi)存管理方法,其特征是:所述的標(biāo)識用于內(nèi)存管理算法將訪問標(biāo)識與內(nèi)存片一對一地聯(lián)系起來;內(nèi)存片起始地址是內(nèi)存片在內(nèi)存池中的分配的空間的開始地址,用于為使用內(nèi)存片的;內(nèi)存片長度是客戶代碼申請內(nèi)存片時指定的信息存貯空間尺寸和邊界標(biāo)志長度之和;分配計數(shù)是指客戶代碼使用同一個固定標(biāo)志分配空間的次數(shù);內(nèi)存管理算法以固定訪問標(biāo)識為憑據(jù),在內(nèi)存池中搜索已分配過的具有相同固定訪問標(biāo)識的內(nèi)存片,對重復(fù)訪問標(biāo)志分配要求,對索引項(xiàng)中的訪問計數(shù)加一;分配失敗時算法主動完成內(nèi)存碎片收集。
8.根據(jù)權(quán)利要求1所述的基于固定訪問標(biāo)識的內(nèi)存管理方法,其特征是:以固定訪問標(biāo)識為憑據(jù),在內(nèi)存池中搜索已分配過的具有相同固定訪問標(biāo)識的內(nèi)存片,并且檢測內(nèi)存片的邊界標(biāo)志是否被破壞。
9.根據(jù)權(quán)利要求1所述的基于固定訪問標(biāo)識的內(nèi)存管理方法,其特征是:將已分配的內(nèi)存片強(qiáng)行移動到從內(nèi)存池起始地址開始的一片連續(xù)存貯空間中,各內(nèi)存片首尾相接,不留縫隙,同時修改索引表中對應(yīng)索引項(xiàng)中記錄的內(nèi)存片起始地址;收集后內(nèi)存池中最后一個塊內(nèi)存片之后全部為自由存貯空間。
10.根據(jù)權(quán)利要求1所述的基于固定訪問標(biāo)識的內(nèi)存管理方法,其特征是:以固定訪問標(biāo)識為憑據(jù),在內(nèi)存池中搜索已分配過的具有相同固定訪問標(biāo)識的內(nèi)存片;若找到,則將其中的分配計數(shù)減一;當(dāng)分配計數(shù)為O時,釋放內(nèi)存片。
全文摘要
本發(fā)明屬于計算機(jī)軟件內(nèi)存管理方法,特別是工業(yè)實(shí)時自動化裝置中嵌入式軟件的內(nèi)存管理方法。包括內(nèi)存池,在RAM中靜態(tài)分配的存貯空間,用于存放分配給客戶代碼使用的內(nèi)存片;索引表,在RAM中靜態(tài)分配的存貯空間,用于存放內(nèi)存片索引;一組用于完成內(nèi)存片的管理的算法,這些算法在內(nèi)存池中分配內(nèi)存片并通過索引表進(jìn)行管理,客戶代碼采用固定的訪問標(biāo)識進(jìn)行申請、訪問和釋放等操作。
文檔編號G06F12/06GK103176911SQ20111042893
公開日2013年6月26日 申請日期2011年12月20日 優(yōu)先權(quán)日2011年12月20日
發(fā)明者衛(wèi)榮平 申請人:陜西銀河網(wǎng)電科技有限公司