專利名稱:一種堆數(shù)據(jù)處理方法及裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計算機(jī)技術(shù)領(lǐng)域,尤其涉及一種堆數(shù)據(jù)處理方法及裝置。
背景技術(shù):
堆是一塊地址連續(xù)的計算機(jī)內(nèi)存區(qū)域,堆區(qū)內(nèi)包括多個連續(xù)的堆,堆溢出是指當(dāng)計算機(jī)程序向某個堆內(nèi)填充的數(shù)據(jù)量超過了堆本身的容量時發(fā)生的數(shù)據(jù)長度超出該堆的存儲邊界的現(xiàn)象。當(dāng)一個超長的數(shù)據(jù)輸入到某個堆內(nèi)時,超出部分就會被寫入堆區(qū)內(nèi)相鄰的其他堆中,其他堆可能已經(jīng)存放數(shù)據(jù),如存放程序執(zhí)行的下一條指令的指針,或者是其他程序的輸出內(nèi)容,因此這些內(nèi)容可能全部或部分被覆蓋或者破壞掉,如果覆蓋或破壞掉的內(nèi)容比較重要,則會影響后續(xù)的正常操作,可見一小部分?jǐn)?shù)據(jù)或者一套指令的溢出就可能導(dǎo)致一個程序或者操作系統(tǒng)崩潰。以Linux系統(tǒng)為例,整個堆區(qū)內(nèi)的堆由于不斷動態(tài)分配和回收,通常已分配堆和空閑堆交錯分布,每個堆的存儲結(jié)構(gòu)為包括連續(xù)存儲的堆元數(shù)據(jù)和堆中數(shù)據(jù),其中,已分配堆中的堆中數(shù)據(jù)為供用戶程序所使用的各類應(yīng)用數(shù)據(jù),空閑堆中的堆中數(shù)據(jù)為初始化數(shù)據(jù),如為全FF等;而堆元數(shù)據(jù)則記載了空閑堆或已分配堆的屬性信息(例如當(dāng)前堆的堆長度、前一空閑堆的堆長度、鏈接前一堆的指針、鏈接后一堆的指針等信息),并且堆元數(shù)據(jù)是分配和回收堆的重要參數(shù)。例如,目前Linux系統(tǒng)分配空閑堆的機(jī)制為將空閑堆的堆元數(shù)據(jù)鏈接至被稱為 Bin的雙向鏈表中,內(nèi)存中有128個Bin雙向鏈表,不同的Bin雙向鏈表鏈接不同長度的空閑堆的堆元數(shù)據(jù),一個Bin雙向鏈表有可能鏈接同一長度的多個空閑堆的堆元數(shù)據(jù);系統(tǒng)在分配空閑堆時,根據(jù)需要占用的內(nèi)存長度及Bin雙向鏈表所鏈接的堆元數(shù)據(jù)所在空閑堆的長度,尋找是否有一個堆長度與需要占用的內(nèi)存長度相匹配的空閑堆供用戶使用,如果有則將其分配給用戶,如果沒有則以堆區(qū)的高地址(堆區(qū)內(nèi)存空間的使用為從低地址到高地址增長)作為起始位置,重新劃分一個合適的空閑堆供用戶使用,該過程中,系統(tǒng)采用最佳匹配算法尋找堆長度與需要占用的內(nèi)存長度相匹配的空閑堆,即將查詢到的第一個堆長度與需要占用的內(nèi)存長度相匹配的空閑堆分配給用戶。然而,由于目前堆的存儲結(jié)構(gòu)為包括堆元數(shù)據(jù)和堆中數(shù)據(jù),由于堆的動態(tài)分配和回收使得已分配堆與空閑堆交錯分布,由于在存儲數(shù)據(jù)的過程中也沒有邊界檢查,這樣攻擊者就很容易通過輸入大量的數(shù)據(jù)而造成堆溢出現(xiàn)象。而堆元數(shù)據(jù)一般位于堆的起始位置,因此堆元數(shù)據(jù)被覆蓋的幾率最大,而堆元數(shù)據(jù)相對來說又是比較重要的信息,因此如果攻擊者惡意造成堆溢出,那就會給操作系統(tǒng)或計算機(jī)網(wǎng)絡(luò)系統(tǒng)帶來非常大的破壞。再者,分配堆過程中的最佳匹配算法具有明顯的規(guī)律性,攻擊者完全可以利用該算法去執(zhí)行堆的分配。因此,堆元數(shù)據(jù)是攻擊者的重要目標(biāo),保護(hù)堆元數(shù)據(jù)不受攻擊者的破壞對于堆區(qū)的安全是非常重要的。為此,提出一種安全而有效地保護(hù)堆元數(shù)據(jù)的堆溢出防范機(jī)制,是防止惡意攻擊堆緩沖區(qū)溢出的重要手段之一。
發(fā)明內(nèi)容
本發(fā)明提供一種堆數(shù)據(jù)處理方法及裝置,用以克服現(xiàn)有技術(shù)中攻擊者利用堆溢出現(xiàn)象來修改堆元數(shù)據(jù),從而造成程序或者操作系統(tǒng)被破壞的問題。本發(fā)明方法包括一種堆數(shù)據(jù)處理方法,包括確定用戶需要分配內(nèi)存寫入數(shù)據(jù)時,從堆區(qū)中選擇空閑堆進(jìn)行分配,并動態(tài)更新設(shè)定區(qū)域中與所分配的堆對應(yīng)的堆元數(shù)據(jù);或者,確定用戶請求釋放已分配堆時,釋放用戶請求的已分配堆,并動態(tài)更新設(shè)定區(qū)域中與所釋放的堆對應(yīng)的堆元數(shù)據(jù);其中所有堆的堆元數(shù)據(jù)集中存儲在所有堆所占區(qū)域外的內(nèi)存中的設(shè)定區(qū)域中。一種堆數(shù)據(jù)處理裝置,包括堆分配模塊,用于確定用戶需要分配內(nèi)存寫入數(shù)據(jù)時,從堆區(qū)中選擇空閑堆進(jìn)行分配;第一堆元更新模塊,用于動態(tài)更新設(shè)定區(qū)域中與所分配的堆對應(yīng)的堆元數(shù)據(jù);堆釋放模塊,用于確定用戶請求釋放已分配堆時,釋放用戶請求的已分配堆;第二堆元更新模塊,用于動態(tài)更新設(shè)定區(qū)域中與所釋放的堆對應(yīng)的堆元數(shù)據(jù);其中所有堆的堆元數(shù)據(jù)集中存儲在所有堆所占區(qū)域外的內(nèi)存中的設(shè)定區(qū)域中。本發(fā)明提供的一種堆數(shù)據(jù)處理方法及裝置,采用集中的方式把所有堆的堆元數(shù)據(jù)存儲在一塊安全的內(nèi)存區(qū)域中,從存儲形式上將堆元數(shù)據(jù)與堆中數(shù)據(jù)分離開來,即將堆元數(shù)據(jù)從堆內(nèi)部分離出來,集中存儲于堆所占區(qū)域以外的設(shè)定區(qū)域,在這種結(jié)構(gòu)下,堆元數(shù)據(jù)的寫操作機(jī)制是完全不同于堆中數(shù)據(jù)的,因此堆元數(shù)據(jù)能被被很好的保護(hù)起來,能夠有效預(yù)防攻擊者通過堆溢出來修改堆元數(shù)據(jù)的問題,避免了因堆元數(shù)據(jù)受到攻擊而導(dǎo)致系統(tǒng)不能正常的分配堆和回收堆。
圖1為本發(fā)明提供的一種堆數(shù)據(jù)處理方法的流程圖;圖2為本發(fā)明提供的一種堆數(shù)據(jù)處理裝置的結(jié)構(gòu)示意圖。
具體實施例方式下面結(jié)合附圖和具體實施例,對本發(fā)明堆數(shù)據(jù)處理方法及裝置的具體實施方式
作進(jìn)一步詳細(xì)描述。本發(fā)明提供一種堆數(shù)據(jù)處理方法,如圖1所示,包括確定用戶需要分配內(nèi)存寫入數(shù)據(jù)時,從堆區(qū)中選擇空閑堆進(jìn)行分配,并動態(tài)更新設(shè)定區(qū)域中與所分配的堆對應(yīng)的堆元數(shù)據(jù);或者,確定用戶請求釋放已分配堆時,釋放用戶請求的已分配堆,并動態(tài)更新設(shè)定區(qū)域中與所釋放的堆對應(yīng)的堆元數(shù)據(jù);其中所有堆的堆元數(shù)據(jù)集中存儲在所有堆所占區(qū)域外的內(nèi)存中的設(shè)定區(qū)域中。堆為用戶程序在運(yùn)行期間動態(tài)存儲數(shù)據(jù)所使用的內(nèi)存區(qū)域,由空閑堆和已分配堆組成整個堆區(qū)。每個空閑堆或已分配堆的內(nèi)部都存儲有堆元數(shù)據(jù)和堆中數(shù)據(jù),其中,堆元數(shù)據(jù)則記載了空閑堆或已分配堆的使用和地址等信息,例如堆使用信息表示了對應(yīng)堆為空閑狀態(tài)還是已分配狀態(tài),堆地址信息則表示了對應(yīng)堆的堆地址、堆長度、前一堆的堆地址、后一堆的堆地址等。由于現(xiàn)有技術(shù)中,堆元數(shù)據(jù)被存儲于對應(yīng)的堆內(nèi)部,使攻擊者很容易利用堆溢出現(xiàn)象來修改堆元數(shù)據(jù),造成不能正常的分配空閑堆或回收已分配堆,從而使程序或者操作系統(tǒng)崩潰。本發(fā)明提供的堆數(shù)據(jù)處理方法,采用集中的方式把所有堆(空閑堆或已分配堆) 的堆元數(shù)據(jù)存儲在一塊安全的內(nèi)存區(qū)域中,從存儲形式上將堆元數(shù)據(jù)與堆中數(shù)據(jù)分離開來,即將堆元數(shù)據(jù)從堆內(nèi)部分離出來,集中存儲于堆所占區(qū)域以外的設(shè)定區(qū)域,在這種結(jié)構(gòu)下,堆元數(shù)據(jù)的寫操作機(jī)制是完全不同于堆中數(shù)據(jù)的,因此堆元數(shù)據(jù)能被被很好的保護(hù)起來,能夠有效預(yù)防攻擊者通過堆溢出來修改堆元數(shù)據(jù)的問題,避免了因堆元數(shù)據(jù)受到攻擊而導(dǎo)致系統(tǒng)不能正常的分配堆和回收堆?,F(xiàn)有技術(shù)中,攻擊者常通過堆溢出的方式來破壞堆元數(shù)據(jù),使系統(tǒng)不能正常的分配堆和回收堆,為了更好的保護(hù)堆元數(shù)據(jù)免受攻擊,本發(fā)明可以進(jìn)一步設(shè)定只有一定權(quán)限才可以對堆元數(shù)據(jù)進(jìn)行修改,否則就不能修改,從而在根本上將管理堆與使用堆分離。本發(fā)明堆數(shù)據(jù)處理方法的執(zhí)行主體為操作系統(tǒng)或其他后臺程序,因此,可以設(shè)定只有操作系統(tǒng)或者其他后臺程序才具有管理堆區(qū)的權(quán)限,才能夠修改堆元數(shù)據(jù),而用戶程序則因不具有權(quán)限就不能對堆元數(shù)據(jù)進(jìn)行操作。為保護(hù)堆元數(shù)據(jù)不被攻擊者修改,本發(fā)明需要把所有堆對應(yīng)的堆元數(shù)據(jù)存儲在一塊連續(xù)的、受保護(hù)的、安全的內(nèi)存區(qū)域中,鑒于堆區(qū)內(nèi)的數(shù)據(jù)存儲方式是由低地址到高地址增長的,以及堆區(qū)內(nèi)空閑堆和已分配堆的交替連接方式,本發(fā)明方法可以從堆區(qū)的起始地址開始,開辟一定長度的空間作為設(shè)定區(qū)域。本發(fā)明提供的堆數(shù)據(jù)處理方法中,用戶首先在所分配的堆中寫入數(shù)據(jù),待所分配的堆寫滿數(shù)據(jù)且數(shù)據(jù)未寫完時,將未寫完的數(shù)據(jù)寫入到所分配的堆之外的堆中。這樣,用戶 (包括攻擊者)只能在堆內(nèi)部執(zhí)行寫操作,修改對象也只能是堆中數(shù)據(jù),不能對堆元數(shù)據(jù)作修改,也就不會給分配堆和回收堆帶來困難,可有效預(yù)防攻擊者通過堆溢出來修改堆元數(shù)據(jù)的問題。優(yōu)選的,本發(fā)明提供的堆數(shù)據(jù)處理方法中,堆元數(shù)據(jù)包括其所對應(yīng)堆的堆地址信息和堆使用信息,其中,堆地址信息為對應(yīng)堆所占區(qū)域的地址信息,通過該信息,本方法在將堆元數(shù)據(jù)從堆內(nèi)部分離出來之后,由堆元數(shù)據(jù)可以準(zhǔn)確定位對應(yīng)堆所占的區(qū)域,以及確定對應(yīng)堆的堆長度;而堆使用信息為對應(yīng)堆的空閑或者已分配等狀態(tài)信息?;诒景l(fā)明中將堆元數(shù)據(jù)從堆本身中分離出來的思想,本發(fā)明堆數(shù)據(jù)處理方法中確定用戶需要分配內(nèi)存寫入數(shù)據(jù)時,從堆區(qū)中選擇空閑堆進(jìn)行分配,并動態(tài)更新設(shè)定區(qū)域中與所分配的堆對應(yīng)的堆元數(shù)據(jù),具體包括確定請求分配的內(nèi)存的長度L ;在所述設(shè)定區(qū)域中查找第一匹配堆元數(shù)據(jù),所述第一匹配堆元數(shù)據(jù)為堆使用信息為空閑、堆地址信息確定的堆長度與長度L相匹配的堆元數(shù)據(jù);將所述第一匹配堆元數(shù)據(jù)對應(yīng)的堆分配給用戶,同時更新所述第一匹配堆元數(shù)據(jù)中的堆使用信息為已分配。
優(yōu)選的,在確定不存在第一匹配堆元數(shù)據(jù)時,本發(fā)明的堆數(shù)據(jù)處理方法還包括在當(dāng)前所有堆所占區(qū)域和設(shè)定區(qū)域以外的內(nèi)存空間中,劃分一個新空閑堆進(jìn)行分配,所述新空閑堆的堆長度與長度L相匹配;同時,在所述設(shè)定區(qū)域中創(chuàng)建對應(yīng)所述新空閑堆的堆元數(shù)據(jù)。具體的,所述新空閑堆的堆長度可以與用戶請求的堆長度L 一致,也可以不一致,可根據(jù)實際需要設(shè)定閾值,在該閾值范圍內(nèi)的堆長度都屬于匹配的堆長度?,F(xiàn)有的Linux系統(tǒng)中,堆分配過程采用的是最佳匹配算法,即將查詢到的第一個滿足堆使用者需求的空閑堆分配給堆使用者,由于這種算法具有明顯的規(guī)律性,攻擊者很容易利用該漏洞來進(jìn)行攻擊,為避免這種情況,本發(fā)明的堆分配過程采用的是隨機(jī)匹配算法確定第一匹配堆元數(shù)據(jù)至少有兩個時,從所述至少兩個第一匹配堆元數(shù)據(jù)中,隨機(jī)選取一個第一匹配堆元數(shù)據(jù),并將選取的第一匹配堆元數(shù)據(jù)對應(yīng)的堆進(jìn)行分配。由于這種隨機(jī)匹配的算法具有很大的隨機(jī)性,攻擊者很難找到漏洞進(jìn)行攻擊,因此,具有更高的安全性。為了在確定用戶請求分配的內(nèi)存長度后,能夠迅速準(zhǔn)確地找到合適的空閑堆進(jìn)行分配,優(yōu)選的,使用不同的鏈表鏈接堆長度不同的空閑堆的堆元數(shù)據(jù);則查找第一匹配堆元數(shù)據(jù),具體包括查找第一匹配鏈表,所述第一匹配鏈表鏈接的是堆長度與長度L相匹配的空閑堆的堆元數(shù)據(jù);確定所述第一匹配鏈表所鏈接的堆元數(shù)據(jù)為第一匹配堆元數(shù)據(jù)。這樣, 由于使用了不同的鏈表去鏈接對應(yīng)堆長度不同的空閑堆的堆元數(shù)據(jù),根據(jù)用戶請求分配的內(nèi)存長度,就可以定位對應(yīng)的鏈表,這種方式容易地找到滿足用戶請求的空閑堆?;诒景l(fā)明中將堆元數(shù)據(jù)從堆本身中分離出來的思想,本發(fā)明堆數(shù)據(jù)處理方法中,確定用戶請求釋放已分配堆時,釋放用戶請求的已分配堆,并動態(tài)更新設(shè)定區(qū)域中與所釋放的堆對應(yīng)的堆元數(shù)據(jù),具體包括根據(jù)請求釋放的已分配堆的堆地址信息,在所述設(shè)定區(qū)域中查找第二匹配堆元數(shù)據(jù),所述第二匹配堆元數(shù)據(jù)為堆使用信息為已分配、堆地址信息與請求釋放已分配堆的堆地址信息一致的堆元數(shù)據(jù);釋放所述第二匹配堆元數(shù)據(jù)對應(yīng)的已分配堆,同時更新所述第二匹配堆元數(shù)據(jù)中的堆使用信息為空閑。本發(fā)明的堆數(shù)據(jù)處理方法需要動態(tài)更新設(shè)定區(qū)域中的堆元數(shù)據(jù),因此在回收堆的同時,要對所述設(shè)定區(qū)域中的第二匹配堆元數(shù)據(jù)進(jìn)行相應(yīng)的修改,從而才能使得第二匹配堆元數(shù)據(jù)能夠正確對應(yīng)被釋放后的堆。優(yōu)選的,使用不同的鏈表對應(yīng)鏈接堆長度不同的空閑堆的堆元數(shù)據(jù),則本發(fā)明的堆數(shù)據(jù)處理方法在更新所述第二匹配堆元數(shù)據(jù)中的堆使用信息為空閑之后,還包括根據(jù)所述第二匹配堆元數(shù)據(jù)中堆地址信息確定的堆長度,將所述第二匹配堆元數(shù)據(jù)鏈接至相應(yīng)的鏈表。由于堆區(qū)內(nèi)一般為空閑堆與已分配堆交替連接,所以在將所述請求釋放的已分配堆釋放為空閑堆時,如果該堆的前一個堆或者后一個堆為空閑堆,則在釋放的同時應(yīng)將二者合并為一個較大的空閑堆。優(yōu)選的,確定堆區(qū)中所述請求釋放的已分配堆的相鄰堆為空閑堆時,將所述請求釋放的已分配堆與所述相鄰堆合并成一個空閑堆;同時,執(zhí)行以下步驟將所述設(shè)定區(qū)域中所述相鄰堆的堆元數(shù)據(jù)刪除,并將所述第二匹配堆元數(shù)據(jù)中的堆地址信息修改為合并后的空閑堆的堆地址信息;或者,將所述設(shè)定區(qū)域中的所述第二匹配堆元數(shù)據(jù)刪除,并將所述相鄰堆的堆元數(shù)據(jù)中的堆地址信息修改為合并后的空閑堆的堆地址信息;或者,將所述設(shè)定區(qū)域中的所述第二匹配堆元數(shù)據(jù)、以及所述相鄰堆的堆元數(shù)據(jù)都刪除,并在所述設(shè)定區(qū)域中創(chuàng)建合并后的空閑堆的堆元數(shù)據(jù)?;谝陨虾喜⒖臻e堆的思想,本發(fā)明的堆數(shù)據(jù)處理方法還包括在將所述第二匹配堆元數(shù)據(jù)中堆地址信息修改為合并后的空閑堆的堆地址信息后,根據(jù)合并后的空閑堆的堆地址信息確定的堆長度,將所述第二匹配堆元數(shù)據(jù)鏈接至相應(yīng)的鏈表;在將所述相鄰堆的堆元數(shù)據(jù)中堆地址信息修改為合并后的空閑堆的堆地址信息之后,根據(jù)合并后的空閑堆的堆地址信息確定的堆長度,將所述相鄰堆的堆元數(shù)據(jù)鏈接至相應(yīng)的鏈表;在所述設(shè)定區(qū)域中創(chuàng)建合并后的空閑堆的堆元數(shù)據(jù)之后,根據(jù)合并后的空閑堆的堆地址信息確定的合并空閑堆的堆長度,將合并后空閑堆的堆元數(shù)據(jù)鏈接至相應(yīng)的鏈表。根據(jù)以上描述,本發(fā)明方法中多處使用到鏈表技術(shù),這是由于鏈表是一種物理存儲單元上非連續(xù)、非順序的存儲結(jié)構(gòu),相比于線性表順序結(jié)構(gòu),鏈表的插入和刪除操作都更方便,因此,利用鏈表鏈接空閑堆的堆元數(shù)據(jù),可以根據(jù)堆空間中空閑堆的變化而方便地對相應(yīng)的鏈表進(jìn)行插入和刪除等操作。鏈表分為單向鏈表和雙向鏈表兩種形式,其中,單向鏈表的鏈接方向是單向的,對單向鏈表的訪問要通過順序讀取從頭部開始;而雙向鏈表的每個數(shù)據(jù)結(jié)點中都有兩個指針,分別指向直接后繼和直接前驅(qū),所以從雙向鏈表中的任意一個結(jié)點(鏈表中每一個元素稱為結(jié)點)開始,都可以很方便地訪問它的前驅(qū)結(jié)點和后繼結(jié)點。為使本發(fā)明方法中查找鏈表的操作更便捷快速,優(yōu)選的,本發(fā)明使用雙向鏈表去鏈接空閑堆的堆元數(shù)據(jù)。本發(fā)明提供一種堆數(shù)據(jù)處理方法的實施例,用于Linux系統(tǒng)內(nèi)堆區(qū)的溢出防護(hù), 如下在堆區(qū)的低地址區(qū)域開辟一定長度的空間作為設(shè)定區(qū)域,用于存儲堆元數(shù)據(jù),并設(shè)置堆元數(shù)據(jù)的結(jié)構(gòu)如下
Struct malloc—chunk
{ 一
Internal—size—t prev—size;/*如果前一堆為空,此值為前一堆的堆長度*/ Internal—size—t size; /*當(dāng)前堆的堆長度及其他堆管理信息*/ Internal—size—t status; /*當(dāng)前堆為空閑堆還是已分配堆*/ Struct malloc—chunk *md; /* 指向堆的內(nèi)存地址 */
Struct malloc—chunk *bk; /*指向后一堆的內(nèi)存地址*/ }上述堆元數(shù)據(jù)結(jié)構(gòu)中各字段的意義為如果當(dāng)前堆的前一堆為空閑堆,則prev_ size字段存放了前一堆的堆長度;size字段包含了當(dāng)前堆的堆長度及其他一些堆管理信息,其中,size字段的最低位表示前一堆是否為空閑堆,例如1表示為已分配堆,0表示為空閑堆,因此只需確定size字段的最低位是否為0就可確定前一堆是否為空閑堆;status字段表示當(dāng)前堆為空閑堆還是已分配堆,例如1表示為已分配堆,0表示為空閑堆;指針md指向當(dāng)前堆在內(nèi)存中的地址(即堆地址);指針Wc指向下一堆的堆地址。其中,堆地址信息包括了 preV_SiZe字段、size字段、指針md和指針bk,堆使用信息由status字段表示。
本實施例的Linux系統(tǒng)中包含1 個Bin雙向鏈表,使用這些Bin雙向鏈表鏈接堆區(qū)內(nèi)特定長度空閑堆的堆元數(shù)據(jù)(由Bin雙鏈表存儲指向所述堆元數(shù)據(jù)的地址指針實現(xiàn)), 具體為系統(tǒng)把所有空閑堆按照堆長度的大小分為大于512字節(jié)和小于512字節(jié)兩個部分, 使用前62個Bin雙向鏈表鏈接小于512字節(jié)的空閑堆堆元數(shù)據(jù),第一個Bin雙向鏈表鏈接 16字節(jié)大小的空閑堆堆元數(shù)據(jù),第二個Bin雙向鏈表鏈接M字節(jié)大小的空閑堆堆元數(shù)據(jù), 依此類推;使用后66個Bin雙向鏈表鏈接大于512字節(jié)的空閑堆堆元數(shù)據(jù);由此,將不同的 Bin雙向鏈表與不同堆長度的堆元數(shù)據(jù)一一對應(yīng)起來,此處,本實施例使用預(yù)定位置的Bin 雙向鏈表鏈接包含預(yù)定堆長度的堆元數(shù)據(jù)。
當(dāng)用戶程序在運(yùn)行期間請求分配對應(yīng)S字節(jié)長度的空閑堆時,操作系統(tǒng)根據(jù)所申請的空閑堆長度S,對所有的Bin雙向鏈表進(jìn)行搜索,從而查找到第一匹配Bin雙向鏈表,并由該匹配的Bin雙向鏈表進(jìn)一步鏈接到設(shè)定區(qū)域中的第一匹配堆元數(shù)據(jù),最終由該第一匹配堆元數(shù)據(jù)中的md指針確定相應(yīng)的空閑堆,將其分配給用戶程序。相應(yīng)的,操作系統(tǒng)要將設(shè)定區(qū)域中的第一匹配堆元數(shù)據(jù)的status字段修改為已分配堆標(biāo)識1。
為用戶分配了合適的堆之后,用戶首先在所分配的堆中寫入數(shù)據(jù),待所分配的堆寫滿數(shù)據(jù)且數(shù)據(jù)未寫完時,將未寫完的數(shù)據(jù)寫入到所分配的堆之外的堆中。這樣,用戶只能在堆內(nèi)部執(zhí)行寫操作,即使是攻擊者,其修改對象也只能是堆中數(shù)據(jù),不會影響到堆元數(shù)據(jù),因此可有效預(yù)防攻擊者通過堆溢出來修改堆元數(shù)據(jù)的問題。
由于包含相同堆長度的堆元數(shù)據(jù)(這類堆元數(shù)據(jù)對應(yīng)的空閑堆堆長度都相同)將被鏈接至同一 Bin雙向鏈表,因此,在上述堆分配過程中,如果操作系統(tǒng)通過搜索所有Bin 雙向鏈表,查找到的第一匹配Bin雙向鏈表鏈接了 N(N> 1)個匹配的堆元數(shù)據(jù),則操作系統(tǒng)通過隨機(jī)數(shù)制造機(jī)f(x)在所述N個匹配的堆元數(shù)據(jù)中,確定一個隨機(jī)的匹配堆元數(shù)據(jù)進(jìn)行使用。
此外,在上述分配過程中,如果操作系統(tǒng)通過搜索所有Bin雙向鏈表,沒有查找到第一匹配Bin雙向鏈表,也就沒有確定任何匹配的堆元數(shù)據(jù),則在堆區(qū)內(nèi)交替鏈接的空閑堆和已分配堆之后的高地址存儲空間中,重新劃分一個合適的堆空間分配給用戶程序使用。
當(dāng)用戶程序在運(yùn)行期間請求釋放堆地址為addl的已分配堆時,操作系統(tǒng)在設(shè)定區(qū)域中查找包含所述堆地址addl的第二匹配堆元數(shù)據(jù),將所述第二匹配堆元數(shù)據(jù)中的 status字段修改為空閑堆標(biāo)識0,同時根據(jù)所述第二匹配堆元數(shù)據(jù)中的md指針查找到對應(yīng)的已分配堆,將其釋放為空閑堆。
在上述回收過程中,如果所述請求釋放已分配堆的相鄰堆為空閑堆時,則操作系統(tǒng)將這兩個空閑堆合并成一個較大的空閑堆。相應(yīng)的,操作系統(tǒng)可以在設(shè)定區(qū)域中將所述相鄰空閑堆的堆元數(shù)據(jù)刪除,并將所述第二匹配堆元數(shù)據(jù)中包含的堆長度、堆地址分別修改為所述合并空閑堆的堆長度、堆地址;同時,操作系統(tǒng)還需要根據(jù)該合并后的空閑堆的堆長度,將所述第二匹配堆元數(shù)據(jù)鏈接至對應(yīng)位置的Bin雙向鏈表。
此外,本實施例在為用戶程序分配堆時,還可以根據(jù)用戶程序請求分配的堆長度, 使用Bin雙向鏈表索引指針去定位對應(yīng)的Bin雙向鏈表。具體的,將所有Bin雙向鏈表的索引指針存放在一個數(shù)組中,在確定用戶程序請求分配堆時,根據(jù)用戶程序請求分配的堆長度,在該數(shù)組中查找到對應(yīng)的Bin雙向鏈表,進(jìn)而可以鏈接到匹配的堆元數(shù)據(jù),確定合適的空閑堆以分配給用戶程序使用。本發(fā)明實施例還提供一種堆數(shù)據(jù)處理裝置,如圖2所示,包括以下各部分堆分配模塊201,用于確定用戶需要分配內(nèi)存寫入數(shù)據(jù)時,從堆區(qū)中選擇空閑堆進(jìn)行分配;第一堆元更新模塊202,用于動態(tài)更新設(shè)定區(qū)域中與所分配的堆對應(yīng)的堆元數(shù)據(jù);堆回收模塊203,用于確定用戶請求釋放已分配堆時,釋放用戶請求的已分配堆;第二堆元更新模塊204,用于動態(tài)更新設(shè)定區(qū)域中與所釋放的堆對應(yīng)的堆元數(shù)據(jù);其中所有堆的堆元數(shù)據(jù)集中存儲在所有堆所占區(qū)域外的內(nèi)存中的設(shè)定區(qū)域中。優(yōu)選的,堆元數(shù)據(jù)包含了對應(yīng)堆的堆地址信息和堆使用信息;則所述堆分配模塊201確定用戶需要分配內(nèi)存寫入數(shù)據(jù)時,從堆區(qū)中選擇空閑堆進(jìn)行分配,具體包括確定請求分配的內(nèi)存的長度L ;在所述設(shè)定區(qū)域中查找第一匹配堆元數(shù)據(jù),所述第一匹配堆元數(shù)據(jù)為堆使用信息為空閑、堆地址信息確定的堆長度與長度L相匹配的堆元數(shù)據(jù);將所述第一匹配堆元數(shù)據(jù)對應(yīng)的堆分配給用戶;并且,所述第一堆元更新模塊202動態(tài)更新設(shè)定區(qū)域中與所分配的堆對應(yīng)的堆元數(shù)據(jù),具體包括將所述第一匹配堆元數(shù)據(jù)中的堆使用信息更新為已分配。優(yōu)選的,所述堆分配模塊201確定不存在第一匹配堆元數(shù)據(jù)時,還用于在當(dāng)前所有堆所占區(qū)域和設(shè)定區(qū)域以外的內(nèi)存空間中,劃分一個新空閑堆進(jìn)行分配,所述新空閑堆的堆長度與長度L相匹配;同時,所述第一堆元更新模塊202在所述設(shè)定區(qū)域中創(chuàng)建對應(yīng)所述新空閑堆的堆元數(shù)據(jù)。優(yōu)選的,所述堆分配模塊201確定第一匹配堆元數(shù)據(jù)至少有兩個時,從所述至少兩個第一匹配堆元數(shù)據(jù)中,隨機(jī)選取一個第一匹配堆元數(shù)據(jù),并將選取的第一匹配堆元數(shù)據(jù)對應(yīng)的堆分配給用戶。優(yōu)選的,使用不同的鏈表鏈接堆長度不同的空閑堆的堆元數(shù)據(jù);則所述堆分配模塊203查找第一匹配堆元數(shù)據(jù),具體包括查找第一匹配鏈表,所述第一匹配鏈表鏈接的是堆長度與長度L相匹配的空閑堆的堆元數(shù)據(jù);確定所述第一匹配鏈表所鏈接的堆元數(shù)據(jù)為第一匹配堆元數(shù)據(jù)。優(yōu)選的,堆元數(shù)據(jù)包含了對應(yīng)堆的堆地址信息和堆使用信息;則所述堆回收模塊203確定用戶請求釋放已分配堆時,釋放用戶請求的已分配堆,具體包括根據(jù)請求釋放的已分配堆的堆地址信息,在所述設(shè)定區(qū)域中查找第二匹配堆元數(shù)據(jù),所述第二匹配堆元數(shù)據(jù)為堆使用信息為已分配、堆地址信息與請求釋放已分配堆的堆地址信息一致的堆元數(shù)據(jù);釋放所述第二匹配堆元數(shù)據(jù)對應(yīng)的已分配堆;并且,所述第二堆元更新模塊204動態(tài)更新設(shè)定區(qū)域中與所釋放的堆對應(yīng)的堆元數(shù)據(jù),具體包括將所述第二匹配堆元數(shù)據(jù)中的堆使用信息更新為空閑。
優(yōu)選的,使用不同的鏈表對應(yīng)鏈接堆長度不同的空閑堆的堆元數(shù)據(jù),則所述第二堆元更新模塊204將所述第二匹配堆元數(shù)據(jù)中的堆的使用信息更新為空閑之后,還用于 根據(jù)所述第二匹配堆元數(shù)據(jù)中堆地址信息確定的堆長度,將所述第二匹配堆元數(shù)據(jù)鏈接至相應(yīng)的鏈表。
優(yōu)選的,所述堆數(shù)據(jù)處理裝置還包括
合并模塊205,用于確定堆區(qū)中所述請求釋放的已分配堆的相鄰堆為空閑堆時,將所述請求釋放的已分配堆與所述相鄰堆合并成一個空閑堆;
同時,所述第二堆元更新模塊204執(zhí)行以下步驟
將所述設(shè)定區(qū)域中所述相鄰堆的堆元數(shù)據(jù)刪除,并將所述第二匹配堆元數(shù)據(jù)中的堆地址信息修改為合并后的空閑堆的堆地址信息;或者,
將所述設(shè)定區(qū)域中的所述第二匹配堆元數(shù)據(jù)刪除,并將所述相鄰堆的堆元數(shù)據(jù)中的堆地址信息修改為合并后的空閑堆的堆地址信息;或者,
將所述設(shè)定區(qū)域中的所述第二匹配堆元數(shù)據(jù)、以及所述相鄰堆的堆元數(shù)據(jù)都刪除,并在所述設(shè)定區(qū)域中創(chuàng)建合并后的空閑堆的堆元數(shù)據(jù)。
優(yōu)選的,所述第二堆元更新模塊204還用于
在將所述第二匹配堆元數(shù)據(jù)中堆地址信息修改為合并后的空閑堆的堆地址信息后,根據(jù)合并后的空閑堆的堆地址信息確定的堆長度,將所述第二匹配堆元數(shù)據(jù)鏈接至相應(yīng)的鏈表;
在將所述相鄰堆的堆元數(shù)據(jù)中堆地址信息修改為合并后的空閑堆的堆地址信息之后,根據(jù)合并后的空閑堆的堆地址信息確定的堆長度,將所述相鄰堆的堆元數(shù)據(jù)鏈接至相應(yīng)的鏈表;
在所述設(shè)定區(qū)域中創(chuàng)建合并后的空閑堆的堆元數(shù)據(jù)之后,根據(jù)合并后的空閑堆的堆地址信息確定的合并空閑堆的堆長度,將合并后空閑堆的堆元數(shù)據(jù)鏈接至相應(yīng)的鏈表。
所述堆數(shù)據(jù)處理裝置各個模塊的具體實現(xiàn)功能參見上述堆數(shù)據(jù)處理方法的具體實現(xiàn)過程,在此不再贅述。
顯然,本領(lǐng)域的技術(shù)人員可以對本發(fā)明進(jìn)行各種改動和變型而不脫離本發(fā)明的精神和范圍。這樣,倘若本發(fā)明的這些修改和變型屬于本發(fā)明權(quán)利要求及其等同技術(shù)的范圍之內(nèi),則本發(fā)明也意圖包含這些改動和變型在內(nèi)。
權(quán)利要求
1.一種堆數(shù)據(jù)處理方法,其特征在于,包括確定用戶需要分配內(nèi)存寫入數(shù)據(jù)時,從堆區(qū)中選擇空閑堆進(jìn)行分配,并動態(tài)更新設(shè)定區(qū)域中與所分配的堆對應(yīng)的堆元數(shù)據(jù);或者,確定用戶請求釋放已分配堆時,釋放用戶請求的已分配堆,并動態(tài)更新設(shè)定區(qū)域中與所釋放的堆對應(yīng)的堆元數(shù)據(jù);其中所有堆的堆元數(shù)據(jù)集中存儲在所有堆所占區(qū)域外的內(nèi)存中的設(shè)定區(qū)域中。
2.如權(quán)利要求1所述的方法,其特征在于,堆元數(shù)據(jù)包含了對應(yīng)堆的堆地址信息和堆使用信息;則確定用戶需要分配內(nèi)存寫入數(shù)據(jù)時,從堆區(qū)中選擇空閑堆進(jìn)行分配,并動態(tài)更新設(shè)定區(qū)域中與所分配的堆對應(yīng)的堆元數(shù)據(jù),具體包括 確定請求分配的內(nèi)存的長度L ;在所述設(shè)定區(qū)域中查找第一匹配堆元數(shù)據(jù),所述第一匹配堆元數(shù)據(jù)為堆使用信息為空閑、堆地址信息確定的堆長度與長度L相匹配的堆元數(shù)據(jù);將所述第一匹配堆元數(shù)據(jù)對應(yīng)的堆分配給用戶,同時更新所述第一匹配堆元數(shù)據(jù)中的堆使用信息為已分配。
3.如權(quán)利要求2所述的方法,其特征在于,確定不存在第一匹配堆元數(shù)據(jù)時,進(jìn)一步包括在當(dāng)前所有堆所占區(qū)域和設(shè)定區(qū)域以外的內(nèi)存空間中,劃分一個新空閑堆進(jìn)行分配, 所述新空閑堆的堆長度與長度L相匹配;同時,在所述設(shè)定區(qū)域中創(chuàng)建對應(yīng)所述新空閑堆的堆元數(shù)據(jù)。
4.如權(quán)利要求2所述的方法,其特征在于,確定第一匹配堆元數(shù)據(jù)至少有兩個時,從所述至少兩個第一匹配堆元數(shù)據(jù)中,隨機(jī)選取一個第一匹配堆元數(shù)據(jù),并將選取的第一匹配堆元數(shù)據(jù)對應(yīng)的堆進(jìn)行分配。
5.如權(quán)利要求2所述的方法,其特征在于,使用不同的鏈表鏈接堆長度不同的空閑堆的堆元數(shù)據(jù);則查找第一匹配堆元數(shù)據(jù),具體包括查找第一匹配鏈表,所述第一匹配鏈表鏈接的是堆長度與長度L相匹配的空閑堆的堆元數(shù)據(jù);確定所述第一匹配鏈表所鏈接的堆元數(shù)據(jù)為第一匹配堆元數(shù)據(jù)。
6.如權(quán)利要求1所述的方法,其特征在于,堆元數(shù)據(jù)包含了對應(yīng)堆的堆地址信息和堆使用信息;則確定用戶請求釋放已分配堆時,釋放用戶請求的已分配堆,并動態(tài)更新設(shè)定區(qū)域中與所釋放的堆對應(yīng)的堆元數(shù)據(jù),具體包括根據(jù)請求釋放的已分配堆的堆地址信息,在所述設(shè)定區(qū)域中查找第二匹配堆元數(shù)據(jù), 所述第二匹配堆元數(shù)據(jù)為堆使用信息為已分配、堆地址信息與請求釋放已分配堆的堆地址信息一致的堆元數(shù)據(jù);釋放所述第二匹配堆元數(shù)據(jù)對應(yīng)的已分配堆,同時更新所述第二匹配堆元數(shù)據(jù)中的堆使用信息為空閑。
7.如權(quán)利要求6所述的方法,其特征在于,使用不同的鏈表對應(yīng)鏈接堆長度不同的空閑堆的堆元數(shù)據(jù),則更新所述第二匹配堆元數(shù)據(jù)中的堆使用信息為空閑之后,還包括根據(jù)所述第二匹配堆元數(shù)據(jù)中堆地址信息確定的堆長度,將所述第二匹配堆元數(shù)據(jù)鏈接至相應(yīng)的鏈表。
8.如權(quán)利要求6所述的方法,其特征在于,還包括確定堆區(qū)中所述請求釋放的已分配堆的相鄰堆為空閑堆時,將所述請求釋放的已分配堆與所述相鄰堆合并成一個空閑堆;同時,執(zhí)行以下步驟將所述設(shè)定區(qū)域中所述相鄰堆的堆元數(shù)據(jù)刪除,并將所述第二匹配堆元數(shù)據(jù)中的堆地址信息修改為合并后的空閑堆的堆地址信息;或者,將所述設(shè)定區(qū)域中的所述第二匹配堆元數(shù)據(jù)刪除,并將所述相鄰堆的堆元數(shù)據(jù)中的堆地址信息修改為合并后的空閑堆的堆地址信息;或者,將所述設(shè)定區(qū)域中的所述第二匹配堆元數(shù)據(jù)、以及所述相鄰堆的堆元數(shù)據(jù)都刪除,并在所述設(shè)定區(qū)域中創(chuàng)建合并后的空閑堆的堆元數(shù)據(jù)。
9.如權(quán)利要求8所述的方法,其特征在于,還包括在將所述第二匹配堆元數(shù)據(jù)中堆地址信息修改為合并后的空閑堆的堆地址信息后,根據(jù)合并后的空閑堆的堆地址信息確定的堆長度,將所述第二匹配堆元數(shù)據(jù)鏈接至相應(yīng)的鏈表;在將所述相鄰堆的堆元數(shù)據(jù)中堆地址信息修改為合并后的空閑堆的堆地址信息之后, 根據(jù)合并后的空閑堆的堆地址信息確定的堆長度,將所述相鄰堆的堆元數(shù)據(jù)鏈接至相應(yīng)的鏈表;在所述設(shè)定區(qū)域中創(chuàng)建合并后的空閑堆的堆元數(shù)據(jù)之后,根據(jù)合并后的空閑堆的堆地址信息確定的合并空閑堆的堆長度,將合并后空閑堆的堆元數(shù)據(jù)鏈接至相應(yīng)的鏈表。
10.如權(quán)利要求5 9任一所述的方法,其特征在于,所述鏈表為雙向鏈表。
11.一種堆數(shù)據(jù)處理裝置,其特征在于,包括堆分配模塊,用于確定用戶需要分配內(nèi)存寫入數(shù)據(jù)時,從堆區(qū)中選擇空閑堆進(jìn)行分配;第一堆元更新模塊,用于動態(tài)更新設(shè)定區(qū)域中與所分配的堆對應(yīng)的堆元數(shù)據(jù); 堆釋放模塊,用于確定用戶請求釋放已分配堆時,釋放用戶請求的已分配堆; 第二堆元更新模塊,用于動態(tài)更新設(shè)定區(qū)域中與所釋放的堆對應(yīng)的堆元數(shù)據(jù); 其中所有堆的堆元數(shù)據(jù)集中存儲在所有堆所占區(qū)域外的內(nèi)存中的設(shè)定區(qū)域中。
12.如權(quán)利要求11所述的裝置,其特征在于,堆元數(shù)據(jù)包含了對應(yīng)堆的堆地址信息和堆使用信息;則所述堆分配模塊確定用戶需要分配內(nèi)存寫入數(shù)據(jù)時,從堆區(qū)中選擇空閑堆進(jìn)行分配,具體包括確定請求分配的內(nèi)存的長度L ;在所述設(shè)定區(qū)域中查找第一匹配堆元數(shù)據(jù),所述第一匹配堆元數(shù)據(jù)為堆使用信息為空閑、堆地址信息確定的堆長度與長度L相匹配的堆元數(shù)據(jù); 將所述第一匹配堆元數(shù)據(jù)對應(yīng)的堆分配給用戶;并且,所述第一堆元更新模塊動態(tài)更新設(shè)定區(qū)域中與所分配的堆對應(yīng)的堆元數(shù)據(jù),具體包括將所述第一匹配堆元數(shù)據(jù)中的堆使用信息更新為已分配。
13.如權(quán)利要求12所述的裝置,其特征在于,所述堆分配模塊確定不存在第一匹配堆元數(shù)據(jù)時,還用于在當(dāng)前所有堆所占區(qū)域和設(shè)定區(qū)域以外的內(nèi)存空間中,劃分一個新空閑堆進(jìn)行分配,所述新空閑堆的堆長度與長度L 相匹配;同時,所述第一堆元更新模塊在所述設(shè)定區(qū)域中創(chuàng)建對應(yīng)所述新空閑堆的堆元數(shù)據(jù)。
14.如權(quán)利要求12所述的裝置,其特征在于,所述堆分配模塊確定第一匹配堆元數(shù)據(jù)至少有兩個時,從所述至少兩個第一匹配堆元數(shù)據(jù)中,隨機(jī)選取一個第一匹配堆元數(shù)據(jù),并將選取的第一匹配堆元數(shù)據(jù)對應(yīng)的堆分配給用戶。
15.如權(quán)利要求12所述的裝置,其特征在于,使用不同的鏈表鏈接堆長度不同的空閑堆的堆元數(shù)據(jù);則所述堆分配模塊查找第一匹配堆元數(shù)據(jù),具體包括查找第一匹配鏈表,所述第一匹配鏈表鏈接的是堆長度與長度L相匹配的空閑堆的堆元數(shù)據(jù);確定所述第一匹配鏈表所鏈接的堆元數(shù)據(jù)為第一匹配堆元數(shù)據(jù)。
16.如權(quán)利要求11所述的裝置,其特征在于,堆元數(shù)據(jù)包含了對應(yīng)堆的堆地址信息和堆使用信息;則所述堆回收模塊確定用戶請求釋放已分配堆時,釋放用戶請求的已分配堆,具體包括根據(jù)請求釋放的已分配堆的堆地址信息,在所述設(shè)定區(qū)域中查找第二匹配堆元數(shù)據(jù), 所述第二匹配堆元數(shù)據(jù)為堆使用信息為已分配、堆地址信息與請求釋放已分配堆的堆地址信息一致的堆元數(shù)據(jù);釋放所述第二匹配堆元數(shù)據(jù)對應(yīng)的已分配堆;并且,所述第二堆元更新模塊動態(tài)更新設(shè)定區(qū)域中與所釋放的堆對應(yīng)的堆元數(shù)據(jù),具體包括將所述第二匹配堆元數(shù)據(jù)中的堆使用信息更新為空閑。
17.如權(quán)利要求16所述的裝置,其特征在于,使用不同的鏈表對應(yīng)鏈接堆長度不同的空閑堆的堆元數(shù)據(jù),則所述第二堆元更新模塊將所述第二匹配堆元數(shù)據(jù)中的堆的使用信息更新為空閑之后,還用于根據(jù)所述第二匹配堆元數(shù)據(jù)中堆地址信息確定的堆長度,將所述第二匹配堆元數(shù)據(jù)鏈接至相應(yīng)的鏈表。
18.如權(quán)利要求16所述的裝置,其特征在于,還包括合并模塊,用于確定堆區(qū)中所述請求釋放的已分配堆的相鄰堆為空閑堆時,將所述請求釋放的已分配堆與所述相鄰堆合并成一個空閑堆;同時,所述第二堆元更新模塊執(zhí)行以下步驟將所述設(shè)定區(qū)域中所述相鄰堆的堆元數(shù)據(jù)刪除,并將所述第二匹配堆元數(shù)據(jù)中的堆地址信息修改為合并后的空閑堆的堆地址信息;或者,將所述設(shè)定區(qū)域中的所述第二匹配堆元數(shù)據(jù)刪除,并將所述相鄰堆的堆元數(shù)據(jù)中的堆地址信息修改為合并后的空閑堆的堆地址信息;或者,將所述設(shè)定區(qū)域中的所述第二匹配堆元數(shù)據(jù)、以及所述相鄰堆的堆元數(shù)據(jù)都刪除,并在所述設(shè)定區(qū)域中創(chuàng)建合并后的空閑堆的堆元數(shù)據(jù)。
19.如權(quán)利要求18所述的裝置,其特征在于,所述第二堆元更新模塊還用于 在將所述第二匹配堆元數(shù)據(jù)中堆地址信息修改為合并后的空閑堆的堆地址信息后,根據(jù)合并后的空閑堆的堆地址信息確定的堆長度,將所述第二匹配堆元數(shù)據(jù)鏈接至相應(yīng)的鏈表;在將所述相鄰堆的堆元數(shù)據(jù)中堆地址信息修改為合并后的空閑堆的堆地址信息之后, 根據(jù)合并后的空閑堆的堆地址信息確定的堆長度,將所述相鄰堆的堆元數(shù)據(jù)鏈接至相應(yīng)的鏈表;在所述設(shè)定區(qū)域中創(chuàng)建合并后的空閑堆的堆元數(shù)據(jù)之后,根據(jù)合并后的空閑堆的堆地址信息確定的合并空閑堆的堆長度,將合并后空閑堆的堆元數(shù)據(jù)鏈接至相應(yīng)的鏈表。
全文摘要
本發(fā)明公開了一種堆數(shù)據(jù)處理方法及裝置,該方法包括確定用戶需要分配內(nèi)存寫入數(shù)據(jù)時,從堆區(qū)中選擇空閑堆進(jìn)行分配,并動態(tài)更新設(shè)定區(qū)域中與所分配的堆對應(yīng)的堆元數(shù)據(jù);或者,確定用戶請求釋放已分配堆時,釋放用戶請求的已分配堆,并動態(tài)更新設(shè)定區(qū)域中與所釋放的堆對應(yīng)的堆元數(shù)據(jù);其中所有堆的堆元數(shù)據(jù)集中存儲在所有堆所占區(qū)域外的內(nèi)存中的設(shè)定區(qū)域中。本發(fā)明方法采用集中的方式把所有堆的堆元數(shù)據(jù)存儲在一塊安全的內(nèi)存區(qū)域中,從存儲形式上將堆元數(shù)據(jù)與堆中數(shù)據(jù)分離開來,用戶的修改對象只能是堆中數(shù)據(jù),不能修改堆元數(shù)據(jù),可有效預(yù)防攻擊者通過堆溢出來修改堆元數(shù)據(jù)的問題。
文檔編號G06F12/02GK102521143SQ20111041875
公開日2012年6月27日 申請日期2011年12月14日 優(yōu)先權(quán)日2011年12月14日
發(fā)明者蒙磊 申請人:瑞斯康達(dá)科技發(fā)展股份有限公司