專利名稱:一種內(nèi)存分配方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計(jì)算機(jī)內(nèi)存技術(shù),特別涉及一種內(nèi)存分配方法。
背景技術(shù):
計(jì)算機(jī)軟件的應(yīng)用得到了越來越廣的應(yīng)用,一方面使用軟件的人數(shù)逐漸增多,另一方面使用軟件的人中有豐富經(jīng)驗(yàn)的計(jì)算機(jī)工程師逐漸減少,這就要求軟件對用戶提供的界面簡單易用,但功能強(qiáng)大。這種要求的直接影響就是軟件規(guī)模變大,復(fù)雜度增加,零錯誤的軟件幾乎是不可能的事情。
在編程中,由于邊界值控制錯誤,常常導(dǎo)致內(nèi)存讀寫越界;或者由于模塊配合錯誤,導(dǎo)致某塊申請來的內(nèi)存在釋放后還被其它模塊繼續(xù)使用。這些都會導(dǎo)致一些非常隱蔽的錯誤,及其難找。給編程帶來很大的困難。
為了避免內(nèi)存讀寫越界或者誤用被釋放的內(nèi)存,一般都要求要對代碼進(jìn)行再檢查(review),以發(fā)現(xiàn)程序錯誤,但靠人工檢查投入很大,且對發(fā)現(xiàn)這種錯誤的幫助很有限,效果不理想。最好就是提供技術(shù)手段供調(diào)試運(yùn)行時(shí)及時(shí)準(zhǔn)確的發(fā)現(xiàn)錯誤。
現(xiàn)在常用來解決上述問題的方法有防止內(nèi)存寫越界申請內(nèi)存時(shí),在需要的長度上多申請一些內(nèi)存。在申請到的內(nèi)存中利用后面多申請到的內(nèi)存做一些特殊標(biāo)記(debug_flag)。如果發(fā)生內(nèi)存寫越界錯誤,特殊標(biāo)記就會被修改。程序運(yùn)行時(shí),在適當(dāng)時(shí)候由程序自己去檢查這些特殊標(biāo)記是否有被改變。當(dāng)發(fā)現(xiàn)標(biāo)記被改變,就認(rèn)為是有寫越界的錯誤產(chǎn)生,程序發(fā)出報(bào)警,由編程人員檢查對這段內(nèi)存進(jìn)行操作的代碼是否有錯誤,參閱圖1。這種方法雖然能檢查到內(nèi)存寫越界,但存下以下缺點(diǎn)(1)程序運(yùn)行時(shí)要經(jīng)常主動去檢查那些特殊標(biāo)記是否被破壞,對性能造成影響,尤其是內(nèi)存操作頻繁時(shí)。
(2)這種方法不能發(fā)現(xiàn)內(nèi)存讀越界錯誤。
(3)當(dāng)發(fā)現(xiàn)標(biāo)記被改變時(shí),只能知道有錯誤產(chǎn)生了。但不能知道錯誤是哪段程序在什么時(shí)候產(chǎn)生的,需要人工去檢查代碼,效率低。
防止使用釋放后的內(nèi)存使用和標(biāo)準(zhǔn)不同的接口,在釋放后把內(nèi)存指針置空,防止該指針被誤用。但用這種方法使用的接口和ANSI C標(biāo)準(zhǔn)規(guī)定的語義不一樣,從而使代碼可移植性不好。
發(fā)明內(nèi)容
本發(fā)明的目的在于提供一種內(nèi)存分配方法,以解決現(xiàn)有的內(nèi)存分配機(jī)制對發(fā)現(xiàn)訪問內(nèi)存錯誤效率低和效果不佳的問題。
一種內(nèi)存分配方法,該方法為按實(shí)際申請的內(nèi)存頁與預(yù)定數(shù)量的內(nèi)存頁之和分配虛擬內(nèi)存地址;將分配的物理內(nèi)存映射到所述虛擬內(nèi)存地址上,并且將相當(dāng)于所述預(yù)定數(shù)量的內(nèi)存頁需要的虛擬內(nèi)存地址設(shè)置為能夠觸發(fā)訪問異常的非法訪問區(qū)。
其中按實(shí)際申請的內(nèi)存頁分配物理內(nèi)存,并將相當(dāng)于所述預(yù)定數(shù)量的內(nèi)存頁需要的虛擬內(nèi)存地址映射為無效頁而使其成為非法訪問區(qū);或者按實(shí)際申請的內(nèi)存頁與預(yù)定數(shù)量的內(nèi)存頁之和分配物理內(nèi)存,并將相當(dāng)于所述預(yù)定數(shù)量的內(nèi)存頁需要的虛擬內(nèi)存地址設(shè)置為特權(quán)級才能訪問的特性來使其成為非法訪問區(qū)。
在釋放內(nèi)存時(shí),將釋放的虛擬內(nèi)存地址設(shè)置為特權(quán)級才能訪問的特性;或者在釋放內(nèi)存時(shí),刪除釋放的虛擬內(nèi)存地址與物理內(nèi)存之間的映射關(guān)系,使該釋放的虛擬內(nèi)存地址成為無效地址。
設(shè)置為非法訪問區(qū)的虛擬內(nèi)存地址處于分配的虛擬內(nèi)存地址中的最后部分,即高地址部分。
所述預(yù)定數(shù)量的內(nèi)存頁為一頁或多頁內(nèi)存。
初化時(shí)對可分配的物理內(nèi)存統(tǒng)一管理,并使未被使用的物理內(nèi)存與虛擬內(nèi)存地址之間無映射關(guān)系。
本發(fā)明通過在為申請內(nèi)存時(shí)多分配內(nèi)存頁,并將相應(yīng)的內(nèi)存頁對應(yīng)的虛擬內(nèi)存地址設(shè)置為非法訪問區(qū),使得有內(nèi)存讀寫越界產(chǎn)生時(shí)能被及時(shí)發(fā)現(xiàn),且方便的定位出出錯位置;內(nèi)存釋放時(shí)斷開虛擬內(nèi)存地址和物理內(nèi)存的映射關(guān)系,在不改變標(biāo)準(zhǔn)規(guī)定的內(nèi)存釋放接口語義情況下,有效防止已釋放內(nèi)存被誤用。
圖1為現(xiàn)有技術(shù)申請的內(nèi)存示意圖;圖2為本發(fā)明申請內(nèi)存時(shí)建立的虛擬內(nèi)存地址與物理內(nèi)存的映射關(guān)系示意圖;圖3為本發(fā)明的釋放內(nèi)存后斷開內(nèi)存虛擬址與物理內(nèi)存之間的映射關(guān)系示意圖。
具體實(shí)施例方式
內(nèi)存地址包括物理地址和虛擬地址。對程序來說,可見的只有虛擬地址,物理地址是透明的,程序操作的所有內(nèi)存地址都是虛擬地址。當(dāng)程序?qū)δ硞€內(nèi)存地址進(jìn)行操作時(shí),微處理器(CPU)的內(nèi)存管理單元(Memory Management Unit,MMU)會自動根據(jù)系統(tǒng)預(yù)先定好的映射表找到該虛擬地址所對應(yīng)的物理地址,并把對虛擬地址的操作實(shí)際應(yīng)用到物理內(nèi)存地址。內(nèi)存管理單元對虛擬地址和物理地址的映射是以頁為長度單位的。
在本發(fā)明中,初始時(shí)對可分配的物理內(nèi)存進(jìn)行統(tǒng)一管理,在物理內(nèi)存未被使用前,不與虛擬內(nèi)存地址之間保持映射關(guān)系(即沒有任何一個虛擬地址是指向這些未被使用的物理內(nèi)存)。
內(nèi)存分配包括內(nèi)存申請和內(nèi)存釋放。參閱圖2所示,申請內(nèi)存時(shí),內(nèi)存管理單元按下述步驟進(jìn)行處理步驟10內(nèi)存管理單元計(jì)算出實(shí)際需要申請的內(nèi)存長度需要幾頁內(nèi)存,在實(shí)際需要的頁數(shù)量上再多加上一頁作為待申請的內(nèi)存頁數(shù)量;步驟20根據(jù)待申請的內(nèi)存頁數(shù)量,由地址分配算法分配相應(yīng)長度的虛擬地址。
步驟30根據(jù)實(shí)際需要的內(nèi)存頁數(shù)量分配相應(yīng)的物理內(nèi)存;步驟40將最后一頁虛擬內(nèi)存地址(即高地址部分)映射為無效頁使其成為非法訪問區(qū),把其余申請到的虛擬內(nèi)存地址映射到分配的物理內(nèi)存上,參閱圖3所示。
因?yàn)樯暾埖奶摂M內(nèi)存地址比取得的物理內(nèi)存地址多了一頁,所以在映射時(shí),將最后一頁的虛擬內(nèi)存地址映射為無效頁來使其成為非法訪問區(qū),即沒有物理內(nèi)存映射到該頁虛擬內(nèi)存地址,這樣對申請到的最后一頁虛擬內(nèi)存地址進(jìn)行訪問時(shí)會立即產(chǎn)生異常。
當(dāng)對申請到的內(nèi)存進(jìn)行讀寫有越界錯誤產(chǎn)生時(shí),即對內(nèi)存的最后一個無效頁進(jìn)行讀或?qū)憰r(shí),硬件立即觸發(fā)一個訪問異常,在異常處理里記錄下程序運(yùn)行環(huán)境,即可準(zhǔn)確得到錯誤產(chǎn)生來源和時(shí)間。
在步驟30中,也可按待申請的內(nèi)存頁數(shù)量分配物理內(nèi)存;在步驟40中,把申請到的虛擬內(nèi)存地址映射到分配的物理內(nèi)存上,并且將最后一頁虛擬內(nèi)存地址設(shè)置為特權(quán)級才能訪問的特性,則任何用戶狀態(tài)下的程序?qū)υ擁搩?nèi)存進(jìn)行讀或?qū)憰r(shí),硬件也會立即觸發(fā)一個訪問異常。
參閱圖4所示,在釋放內(nèi)存的時(shí)候,內(nèi)存管理單元除了在分配釋放算法中釋放虛擬內(nèi)存地址外,同時(shí)將這些虛擬內(nèi)存地址與物理內(nèi)存的映射斷開,使這些虛擬內(nèi)存地址成為無效地址。內(nèi)存釋放后,雖然內(nèi)存指針還保留原值,但該指針?biāo)赶虻奶摂M內(nèi)存地址已經(jīng)變?yōu)橐粋€不合法地址,對這些虛擬內(nèi)存地址進(jìn)行任何讀或?qū)懖僮鞫紩⒓匆甬惓?,這樣就可以馬上發(fā)現(xiàn)哪里的程序錯誤的使用了被釋放的虛擬內(nèi)存地址。
釋放內(nèi)存時(shí),也可以將釋放的虛擬內(nèi)存地址設(shè)置為特權(quán)級才能訪問的特性,任何用戶態(tài)下的程序?qū)υ撎摂M內(nèi)存地址進(jìn)行讀或?qū)懖僮骶鶗⒓从|發(fā)異常。
本實(shí)施例中,雖以內(nèi)存管理單元在實(shí)際需要的內(nèi)存頁數(shù)量上多加上一頁內(nèi)存來分配虛擬內(nèi)存地址為例進(jìn)行說明,但也可加上兩頁或更多頁來分配虛擬內(nèi)存地址,其原理相同。
權(quán)利要求
1.一種內(nèi)存分配方法,其特征在于該方法為按實(shí)際申請的內(nèi)存頁與預(yù)定數(shù)量的內(nèi)存頁之和分配虛擬內(nèi)存地址;將分配的物理內(nèi)存映射到所述虛擬內(nèi)存地址上;以及將相當(dāng)于所述預(yù)定數(shù)量的內(nèi)存頁需要的虛擬內(nèi)存地址設(shè)置為能夠觸發(fā)訪問異常的非法訪問區(qū)。
2.如權(quán)利要求1所述的內(nèi)存分配置方法,其特征在于,按實(shí)際申請的內(nèi)存頁分配物理內(nèi)存,并將相當(dāng)于所述預(yù)定數(shù)量的內(nèi)存頁需要的虛擬內(nèi)存地址映射為無效頁而使其成為非法訪問區(qū)。
3.如權(quán)利要求1所述的內(nèi)存分配方法,其特征在于,按實(shí)際申請的內(nèi)存頁與預(yù)定數(shù)量的內(nèi)存頁之和分配物理內(nèi)存,并將相當(dāng)于所述預(yù)定數(shù)量的內(nèi)存頁需要的虛擬內(nèi)存地址設(shè)置為特權(quán)級才能訪問的特性來使其成為非法訪問區(qū)。
4.如權(quán)利要求1、2或3所述的方法,其特征在于,在釋放內(nèi)存時(shí),將釋放的虛擬內(nèi)存地址設(shè)置為特權(quán)級才能訪問的特性。
5.如權(quán)利要求1、2或3所述的方法,其特征在于,在釋放內(nèi)存時(shí),刪除釋放的虛擬內(nèi)存地址與物理內(nèi)存之間的映射關(guān)系,使該釋放的虛擬內(nèi)存地址成為無效地址。
6.如權(quán)利要求1所述的方法,其特征在于,設(shè)置為非法訪問區(qū)的虛擬內(nèi)存地址處于分配的虛擬內(nèi)存地址中的最后部分,即高地址部分。
7.如權(quán)利要求1所述的方法,其特征在于,所述預(yù)定數(shù)量的內(nèi)存頁為一頁或多頁內(nèi)存。
8.如權(quán)利要求1所述的方法,其特征在于,初化時(shí)對可分配的物理內(nèi)存統(tǒng)一管理,并使未被使用的物理內(nèi)存與虛擬內(nèi)存地址之間無映射關(guān)系。
全文摘要
一種內(nèi)存分配方法,該方法為按實(shí)際申請的內(nèi)存頁與預(yù)定數(shù)量的內(nèi)存頁之和分配虛擬內(nèi)存地址;將分配的物理內(nèi)存映射到所述虛擬內(nèi)存地址上,并且將相當(dāng)于所述預(yù)定數(shù)量的內(nèi)存頁需要的虛擬內(nèi)存地址設(shè)置為能夠觸發(fā)訪問異常的非法訪問區(qū)。本發(fā)明通過在為申請內(nèi)存時(shí)多分配內(nèi)存頁,并將相應(yīng)的內(nèi)存頁對應(yīng)的虛擬內(nèi)存地址設(shè)置為非法訪問區(qū),使得有內(nèi)存讀寫越界產(chǎn)生時(shí)能被及時(shí)發(fā)現(xiàn),且方便的定位出錯位置。
文檔編號G06F12/08GK1673979SQ200410030399
公開日2005年9月28日 申請日期2004年3月24日 優(yōu)先權(quán)日2004年3月24日
發(fā)明者葉媲書, 趙波 申請人:華為技術(shù)有限公司