欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

一種具有內(nèi)存保護功能的內(nèi)存管理方法

文檔序號:6361878閱讀:196來源:國知局
專利名稱:一種具有內(nèi)存保護功能的內(nèi)存管理方法
技術(shù)領(lǐng)域
本發(fā)明涉及一種內(nèi)存管理方法;尤其是涉及通訊領(lǐng)域中支持內(nèi)存管理單元(MMUMemory Management Unit)的CPU上的內(nèi)存保護和管理。
背景技術(shù)
在通訊產(chǎn)品中,很多實時操作系統(tǒng)運行的代碼都是C代碼,而C代碼中指針是比較有特點的一種數(shù)據(jù)類型,它雖然能給C語言中代碼的設(shè)計帶來一定的靈活性,但同時也帶來了一些隱患。例如,在系統(tǒng)運行的過程中經(jīng)常出現(xiàn)系統(tǒng)故障,這種故障通常的表現(xiàn)是因某段內(nèi)存的內(nèi)容被修改而導(dǎo)致系統(tǒng)運行異常,可又無法定位是誰修改了這段內(nèi)存。然而只要使用指針,這種問題幾乎就是無法徹底解決的。因為對于指針來說,只要指向的內(nèi)存是可寫的,就可以任意更改所指的內(nèi)存中的內(nèi)容。為此人們可以做到的,僅是盡量縮小這種問題的定位范圍,以便更快地找到系統(tǒng)運行異常的原因。對于各種不同的實時操作系統(tǒng),人們最多想到的就是把一個系統(tǒng)中各個運行實體的訪問地址范圍隔離起來。
在通常的嵌入式系統(tǒng)中,對內(nèi)存幾乎是沒有保護的。如圖1所示,A區(qū)是指針的安全操作區(qū),本不應(yīng)該寫到B區(qū),但是由于A區(qū)和B區(qū)地址相連,在A區(qū)操作的指針不經(jīng)意地寫到了B區(qū),由于是無保護的情況,所以B區(qū)是可寫的,結(jié)果B區(qū)中的B1部分內(nèi)容被改寫了。這樣當系統(tǒng)需要讀取B區(qū)的內(nèi)容,如果在B1部分讀取,就讀到了臟數(shù)據(jù)到C區(qū),有可能導(dǎo)致系統(tǒng)異常。其中標號1代表寫操作,標號2代表讀操作。
所以系統(tǒng)可能經(jīng)常表現(xiàn)出各種各樣的無法定位的問題。比如說,某個變量突然變成了一個不期望的值,最后只能靠審查代碼,憑著經(jīng)驗來大致確定可能出錯的代碼,然后用一些數(shù)據(jù)結(jié)構(gòu)記錄一些信息,進行大量的分析,找到引發(fā)問題的原因,很明顯,這種方法的缺點就是錯誤定位周期長,延緩了產(chǎn)品開發(fā)進度。
當人們意識到系統(tǒng)中必須進行內(nèi)存保護之后,出現(xiàn)了在某些隔離內(nèi)存中寫入特殊值,在系統(tǒng)運行過程中,檢查這些隔離內(nèi)存的內(nèi)容是否被覆蓋,以判斷系統(tǒng)中是否有內(nèi)存越界訪問的問題。如圖2所示,在A區(qū)和B區(qū)之間增加了內(nèi)存保護帶C區(qū),C區(qū)是被設(shè)置為不可寫屬性的內(nèi)存區(qū),這樣當在A區(qū)操作的指針如果連續(xù)越界,就會寫到C區(qū),此時系統(tǒng)會檢測到這個非法操作,報出異常。用戶從B區(qū)讀取到D區(qū)的數(shù)據(jù)是正確的。這種事后分析的方法使得內(nèi)存越界訪問類型之問題的確定變的相對容易一些,但是其局限性也很大,最關(guān)鍵的問題是無法在第一時間捕獲到內(nèi)存越界操作,當然也無法準確定位修改特殊值的操作的位置。

發(fā)明內(nèi)容
本發(fā)明的目的在于,提供一種具有內(nèi)存保護功能的內(nèi)存管理方法,以在具有MMU功能的CPU上進行內(nèi)存保護及高效的內(nèi)存管理。本方法可以在不降低內(nèi)存訪問效率的基礎(chǔ)上,提供基于頁保護的內(nèi)存保護功能,并且能夠解決因保護內(nèi)存而引起的浪費內(nèi)存的問題。由于本方法基本上不降低系統(tǒng)運行效率,同時又不會產(chǎn)生內(nèi)存浪費,因此可以在設(shè)備實際的運行環(huán)境中發(fā)揮作用,在第一時間捕獲到內(nèi)存越界操作,并保留現(xiàn)場以幫助排錯。
本發(fā)明的技術(shù)方案為提供一種具有內(nèi)存保護功能的內(nèi)存管理方法,在具有MMU功能的CPU上進行內(nèi)存管理;在需要保護的內(nèi)存兩端添加保護頁;當有操作訪問到所述保護頁所在的區(qū)域時,實時操作系統(tǒng)確認所述操作為非法修改所述內(nèi)存的操作,并報告內(nèi)存訪問異常。所述保護頁的屬性為不可訪問。
本發(fā)明所述的方法包括以下步驟獲取一塊物理內(nèi)存,利用映射表的對應(yīng)關(guān)系,將該塊物理內(nèi)存映射至虛擬地址空間;其中通過所述的映射,使得在物理地址內(nèi)存空間中連續(xù)的內(nèi)存塊,在虛擬地址內(nèi)存空間中是不連續(xù)的。
本發(fā)明所述的方法包括以下步驟獲取一塊物理內(nèi)存,利用映射表的對應(yīng)關(guān)系,將該塊物理內(nèi)存映射至虛擬地址空間;其中通過所述的映射,使得物理地址內(nèi)存空間中不連續(xù)的內(nèi)存塊,在虛擬地址內(nèi)存空間中是連續(xù)的。
本發(fā)明的有益效果為原來在物理內(nèi)存中緊挨著的數(shù)據(jù),可以在虛擬地址中將其隔離開來,并且可以在CPU虛擬地址空間表達范圍允許的前提下,根據(jù)系統(tǒng)設(shè)計需要對不同的數(shù)據(jù)設(shè)置不同的保護帶的大小。內(nèi)存保護帶地址空間可以看作越界操作敏感區(qū),由于大部分的越界操作都是在數(shù)據(jù)資源所在區(qū)域邊界處發(fā)生的,所以在此處暴露越界的概率最大,當然,如果越界的指針越過了保護帶,進入了另一個可寫內(nèi)存區(qū)域,這種情況,仍然無法捕捉。另外,值得注意的是,內(nèi)存保護帶僅僅占用了虛擬地址空間,沒有占用系統(tǒng)可用內(nèi)存空間,所以內(nèi)存保護帶的大小,是不會造成內(nèi)存的浪費的。采用本發(fā)明所述方法,與現(xiàn)有技術(shù)相比,取得了突破性進步,達到了及時檢測到內(nèi)存訪問越界問題的效果,節(jié)省了系統(tǒng)可用內(nèi)存空間,提高了系統(tǒng)的穩(wěn)定性。


圖1為無保護的內(nèi)存越界訪問示意圖;圖2為基本MMU保護的內(nèi)存越界訪問示意圖;圖3為本發(fā)明中在基本MMU保護基礎(chǔ)上的內(nèi)存越界訪問示意圖;圖4為內(nèi)存保護總體流程圖;圖5為總體流程圖中初始化部分流程圖;圖6為總體流程圖中封裝虛擬地址空間基本操作接口部分流程圖;圖7為總體流程圖中系統(tǒng)數(shù)據(jù)資源保護流程圖;圖8為各級表項的索引過程以及虛擬地址到物理地址的轉(zhuǎn)換過程;圖9為中央處理單元CPUX86中頁目錄表項的定義格式;
圖10為CPUX86中頁表項的定義格式。
具體實施例方式
下面結(jié)合

本發(fā)明的
具體實施例方式在具有″頁″的概念的CPU中,頁表是一個不可缺少的重要元素,它和硬件尋址緊密相關(guān)。內(nèi)存保護的實現(xiàn)簡單的說,就是在需要保護的重要內(nèi)存兩端,添加若干保護頁,這些保護頁的屬性為不可訪問,當有操作訪問到保護頁所在區(qū)域,可認為該操作就有非法修改重要內(nèi)存的企圖,同時,實時操作系統(tǒng)可以很快的發(fā)現(xiàn)并報告內(nèi)存訪問異常,便于及時的發(fā)現(xiàn)異常隱患。為了減少系統(tǒng)內(nèi)存浪費,設(shè)計了一套虛擬內(nèi)存管理方案如下該設(shè)計是基于32位總線系統(tǒng)的,所以其虛擬地址空間是4G,但是通常,一個實時系統(tǒng)的物理內(nèi)存一般很難達到這么大。本發(fā)明就是充分利用了沒有實際物理內(nèi)存對應(yīng)的虛擬地址空間,將這部分虛擬地址空間管理起來,達到了既有效地保護了重要內(nèi)存,又降低了系統(tǒng)內(nèi)存的浪費。從系統(tǒng)中獲取一塊物理內(nèi)存,利用映射表的對應(yīng)關(guān)系,將這塊物理內(nèi)存映射至虛擬地址空間,由于程序指令的操作,都是按照虛擬地址進行的,所以程序中看似是對虛擬地址所指的內(nèi)存操作,實際上是對其映射的物理內(nèi)存操作。同時,通過這種映射方式,可以使得在物理地址內(nèi)存空間中連續(xù)的內(nèi)存塊,在虛擬地址內(nèi)存空間中是不連續(xù)的,同樣,也可以使得物理地址內(nèi)存空間中不連續(xù)的內(nèi)存塊,在虛擬地址內(nèi)存空間中是連續(xù)的。只有對映射了實際物理地址的虛擬地址的操作是有效的,而對未映射的虛擬地址的操作都是無效的。按照這種思路,保護帶的內(nèi)存大小,在虛擬地址空間中,是可以設(shè)置為多頁的,而且保護帶的內(nèi)存由于沒有與實際的物理內(nèi)存關(guān)聯(lián),所以是不消耗任何系統(tǒng)內(nèi)存的。在虛擬地址空間中,將映射了物理內(nèi)存的地址空間用來存放重要數(shù)據(jù),而在該地址空間兩端留有幾頁保護帶地址空間進行隔離。即使兩個重要數(shù)據(jù)塊在物理內(nèi)存空間中地址是連續(xù)的,由于在虛擬地址空間中,兩個重要的數(shù)據(jù)塊之間有保護帶,所以在虛擬地址空間中,地址是不連續(xù)的,這樣,程序中對一塊重要數(shù)據(jù)的操作,如果不小心越界,也不會破壞另一塊重要數(shù)據(jù)的內(nèi)容。這樣就起到了保護的作用。
為了便于開發(fā),可生成一套虛擬內(nèi)存操作接口,使得應(yīng)用無需關(guān)心底層細節(jié)而方便的使用虛擬內(nèi)存。另外,還擴展開發(fā)了一套對系統(tǒng)頁表操作的接口,可以方便的進行頁表的創(chuàng)建,刪除,切換。在多進程系統(tǒng)中,可以通過頁表對各個進程可見的內(nèi)存范圍進行控制,從而達到一個進程不可見另一個進程的私有數(shù)據(jù)。從某種角度上來說,也就是對進程的私有內(nèi)存區(qū)域進行了隔離和保護。
本發(fā)明核心步驟在于第一步進行必要的初始化工作。
1)獲取支持MMU的CPU中提供的進行地址映射操作必需的數(shù)據(jù)。
對于硬件上支持MMU的CPU,運行在其上的操作系統(tǒng)初始化工作主要是根據(jù)CPU的硬件尋址方式,為了能夠訪問已經(jīng)存在的物理地址,建立一套機制。比較典型的過程就是指定一個基址,而虛擬地址提供了偏移。尋址可以分為多級尋址,如果系統(tǒng)的尋址需要分為n(n>=1)級,系統(tǒng)就需要建立n級表進行尋址,第n-1級表提供第n級表的基地址,虛擬地址也需要分為n段,各段對應(yīng)于各級表的偏移,直至尋址到實際的物理內(nèi)存地址。需要獲取第一級表的基址,大部分的CPU會將其存放在一個特定的地址或者寄存器里,這個要參考CPU的硬件手冊。
2)確定系統(tǒng)中尚未映射物理地址的虛擬地址范圍。
目前使用的CPU大部分都是32位的系統(tǒng)總線,所以一個系統(tǒng)的虛擬地址空間的大小可達4G,而系統(tǒng)中尚未映射的物理地址的虛擬地址范圍根據(jù)硬件設(shè)計的不同而不同,主要取決于該CPU的內(nèi)存大小,另外還要考慮到在有些系統(tǒng)中,會將一些外部存儲器或者外部IO(輸入輸出)設(shè)備的訪問地址空間映射在CPU地址空間的情況。
3)建立組織和管理系統(tǒng)初始化時未映射物理地址的虛擬地址空間的數(shù)據(jù)結(jié)構(gòu)。
建立的數(shù)據(jù)結(jié)構(gòu)主要是用于將系統(tǒng)中未映射物理地址的虛擬地址空間組織起來。該數(shù)據(jù)結(jié)構(gòu)需要包含的信息a)所操作的虛擬地址空間的起始地址。
b)所操作的虛擬地址空間的大小。
c)所操作的虛擬地址空間的狀態(tài),用于表示虛擬地址空間是否被映射了實際的物理地址。由于各個CPU具有地址空間訪問屬性設(shè)置的最小單元,所以此處虛擬地址空間的狀態(tài)要可以表示包含虛擬地址空間中各個最小單元大小的虛擬地址的狀態(tài)。
第二步封裝對虛擬地址空間進行基本操作的接口。
1)需要封裝一套用于獲取各級表的表項的接口。
第1級表項的獲取是將第一步中獲取的第1級表的基址和虛擬地址中表示第1級表的偏移部分組合得到表項的地址,從該地址取出第1級表項。
第n(n>=2)級的表項是從第n-1級的表項中獲取第n級表的基址,再和虛擬地址中表示第n級表的偏移部分組合得到表項的地址,再從該地址獲取第n級表項。
2)需要封裝一套用于創(chuàng)建各級表項的接口。
由于對于支持MMU的CPU,其上運行的操作系統(tǒng)一般只是創(chuàng)建了和實際物理地址對應(yīng)的各級表項,而對于未使用的虛擬地址空間,是沒有相應(yīng)的各級表項的,這就需要進行創(chuàng)建。
第n(n>=1)級表項的創(chuàng)建是根據(jù)第n級表的基址和虛擬地址中第n級表項偏移,獲取第n級表項的位置,并在此位置上按照第n級表項的格式,填入第n+1級表的基址,并將表項設(shè)置成有效。此時,如果該表項對應(yīng)的第n+1級表不存在,需要申請一塊內(nèi)存用于第n+1級表的存放,并將此塊內(nèi)存的首地址作為第n+1級表的基址填入該表項中。
3)需要封裝一套用于對各級表項的各個域進行設(shè)置的接口。
第n(n>=1)級表的表項中的各個域的設(shè)置直接影響了第n級表項的有效性以及第n+1級表的訪問屬性。而對表項中各個域中的值進行設(shè)置的目的,也就是為了設(shè)置虛擬地址到物理地址的對應(yīng)關(guān)系。設(shè)置的過程根據(jù)虛擬地址中提供的各級表項的偏移和各級表的基址,索引到想要設(shè)置的表項,并將該表項中的域設(shè)置為期望的值。需要說明的是,各級表項中,各個域表達的含義根據(jù)CPU的不同會不同,所以設(shè)置的期望值應(yīng)當遵循各個CPU硬件手冊上的賦值規(guī)則。
a)虛擬地址到物理地址的映射操作。
第n(n>=1)級表項中通常包含指示第n+1級表的基址的信息,根據(jù)各級表的基址和虛擬地址提供的各級表項的偏移,級級關(guān)聯(lián)組成了虛擬地址到物理地址的映射關(guān)系,可以通過修改表項中基址域中的值來設(shè)定虛擬地址到物理地址的映射。通常最后一級表項中提供虛擬地址映射的物理地址所在最小單元的基址,簡單的做法,可以將最后一級表項中物理地址的基址設(shè)置為期望的物理地址所在最小單元的基址,進行虛擬地址到物理地址的映射。
b)虛擬地址到物理地址的解除映射操作。
第n(n>=1)級表項中通常包含第n級表項是否有效的信息,根據(jù)虛擬地址提供的各級表項的偏移,索引到最后一級表項,將該表項設(shè)置為無效,就可以解除虛擬地址到對應(yīng)的物理地址之間的映射關(guān)系。
c)虛擬地址對應(yīng)的物理地址的訪問屬性的設(shè)置。
第n(n>=1)級表項中通常包含第n+1級表的訪問屬性,根據(jù)虛擬地址提供的各級表項的偏移,索引到最后一級表項,該表項中包含虛擬地址對應(yīng)的物理地址所在最小單元大小的內(nèi)存的訪問屬性,通過對該屬性的設(shè)置,可以將內(nèi)存的訪問屬性設(shè)置為只讀、讀寫、只寫或者不可訪問。
第三步對系統(tǒng)中數(shù)據(jù)資源進行保護。
對系統(tǒng)中數(shù)據(jù)資源的保護可以看作兩個方面,一個是防止對其他數(shù)據(jù)的操作不當導(dǎo)致對數(shù)據(jù)資源本身的破壞,一個是防止數(shù)據(jù)資源本身的操作不當導(dǎo)致對其他數(shù)據(jù)的破壞。
1)創(chuàng)建一個管理虛擬地址數(shù)據(jù)對象。
該數(shù)據(jù)對象的數(shù)據(jù)類型就是第一步中建立的數(shù)據(jù)結(jié)構(gòu),用于記錄數(shù)據(jù)資源所在虛擬地址空間的起始地址,地址空間大小和地址空間中各單元是否映射了實際物理地址。
2)在系統(tǒng)未映射物理地址的虛擬地址空間中申請一塊地址空間。
申請的虛擬地址空間的起始地址應(yīng)該大于等于第一步中確定的系統(tǒng)中尚未映射物理地址的虛擬地址的起始地址。申請的虛擬地址空間的大小是數(shù)據(jù)資源所占內(nèi)存的大小+(2*預(yù)設(shè)保護帶大小),如果設(shè)申請的虛擬地址空間的大小為CurGetSize,數(shù)據(jù)資源所占內(nèi)存的大小為RealNeedSize,預(yù)設(shè)保護帶大小為ProtectSize,則有CurGetSize=RealNeedSize+2*ProtectSize。
由于對內(nèi)存屬性的設(shè)置只能對內(nèi)存大小為系統(tǒng)地址映射最小單元大小的整數(shù)倍的內(nèi)存空間進行,所以申請的地址空間的大小必須是系統(tǒng)地址映射的最小單元大小的整數(shù)倍,其中預(yù)設(shè)保護帶大小也應(yīng)該是系統(tǒng)地址映射的最小單元大小的整數(shù)倍。并在相應(yīng)管理虛擬地址數(shù)據(jù)對象中記錄申請得到的虛擬地址空間起始位置和地址空間大小記錄,并記錄該段虛擬地址為未映射物理地址狀態(tài)。
3)將數(shù)據(jù)資源所在虛擬地址空間和實際的物理地址空間進行映射。
從系統(tǒng)實際的物理地址空間申請一塊內(nèi)存,該內(nèi)存的大小需要大于等于數(shù)據(jù)資源所占內(nèi)存的大小,并且是系統(tǒng)地址映射最小單元大小的整數(shù)倍。數(shù)據(jù)資源所在虛擬地址空間起始地址取申請的虛擬地址空間起始地址向后偏移預(yù)設(shè)保護帶大小,從起始地址開始,映射數(shù)據(jù)資源所占內(nèi)存大小的虛擬地址空間到剛才從系統(tǒng)中申請的物理地址上。并在相應(yīng)的管理虛擬地址數(shù)據(jù)對象中記錄該段虛擬地址空間狀態(tài)為已經(jīng)映射了物理地址的狀態(tài)。
4)給用戶返回操作該數(shù)據(jù)資源的起始地址。
考慮到越界操作大部分是向后越界,返回給用戶操作該數(shù)據(jù)資源的起始地址可以是從映射了物理地址的虛擬地址空間的后邊界處向前偏移實際數(shù)據(jù)資源大小處的地址。
通過此種方式,原來在物理內(nèi)存中緊挨著的數(shù)據(jù),可以在虛擬地址中將其隔離開來,并且可以在CPU虛擬地址空間表達范圍允許的前提下,根據(jù)系統(tǒng)設(shè)計需要對不同的數(shù)據(jù)設(shè)置不同的保護帶的大小。
內(nèi)存保護帶地址空間可以看作越界操作敏感區(qū),由于大部分的越界操作都是在數(shù)據(jù)資源所在區(qū)域邊界處發(fā)生的,所以在此處暴露越界的概率最大,當然,如果越界的指針越過了保護帶,進入了另一個可寫內(nèi)存區(qū)域,這種情況,仍然無法捕捉。另外,值得注意的是,內(nèi)存保護帶僅僅占用了虛擬地址空間,沒有占用系統(tǒng)可用內(nèi)存空間,所以內(nèi)存保護帶的大小,是不會造成內(nèi)存的浪費的。
圖3是表示將A區(qū)映射到A1區(qū),B區(qū)映射到B1區(qū),可以看出本來物理地址相連的A區(qū)和B區(qū)經(jīng)過映射之后,在虛擬地址空間中的地址已經(jīng)不連續(xù)了,中間隔了一個C1區(qū),和圖2不同的是,C1區(qū)是沒有映射物理地址的內(nèi)存區(qū),當在A1區(qū)操作的指針連續(xù)越界的時候,就會寫到C1區(qū),此時,系統(tǒng)就會檢測到C1無法訪問,同樣也會報告系統(tǒng)異常。其中標號3代表映射方向。
圖8表示了各級表項的索引過程以及虛擬地址到物理地址的轉(zhuǎn)換過程。圖6中的各部分接口可以依據(jù)此圖,索引的相應(yīng)的表項,并通過修改表項中的值來實現(xiàn)各個接口的功能。
現(xiàn)以CPUX86為例,對技術(shù)方案的實施作進一步的詳細描述CPUX86中的尋址過程如下1、隱含尋址部分,這部分在系統(tǒng)初始化后,就已經(jīng)完成了,隱含尋址部分主要是通過以段選擇子為偏移,在描述表里索引到相應(yīng)的段選擇子,在段選擇子中獲取段基址。虛擬地址就作為段偏移,與段基址相加,獲得的值稱之為線性地址。此處的段基址,在系統(tǒng)中就是0,所以從數(shù)值上看,虛擬地址和線性地址是相等的,所以本例不對虛擬地址和線性地址加以區(qū)分。2、顯式尋址部分,這部分分成兩級實現(xiàn),就存在兩級表的概念,一級是頁目錄表,一級是頁表。頁目錄表提供了頁表的基址,頁表提供了物理地址的基址。虛擬地址的第22位到第31位是頁目錄表的索引,虛擬地址的第12位到第21位是頁表的索引,虛擬地址的第0位到第11位是物理地址偏移。
本例的運行環(huán)境是VxWorks操作系統(tǒng),第一步進行必要的初始化工作。
1)獲取支持MMU的CPU中提供的進行地址映射操作必需的數(shù)據(jù)。
CPUX86的第1級表是頁目錄表,頁目錄表的基址存放在頁目錄基礎(chǔ)寄存器(PDBRPage Directory Base Register)中,首先從該寄存器中讀取到頁目錄表的基址,以此作為以后索引表項和地址映射的基礎(chǔ),這里用PageDbase表示。
2)確定系統(tǒng)中尚未映射物理地址的虛擬地址范圍。
在單板上配置的是512M的內(nèi)存,并且沒有外設(shè)和外部存儲器需要映射到內(nèi)存的尋址空間中,所以取未映射物理地址的虛擬地址范圍的起始地址為0×20000000,起始地址用VirAddrStart表示。
3)建立組織和管理系統(tǒng)初始化時未映射物理地址的虛擬地址空間的數(shù)據(jù)結(jié)構(gòu)。
現(xiàn)定義一個雙向鏈表數(shù)據(jù)結(jié)構(gòu)如下typedef struct tagVmemRecord{WORD32 dwStartPage; /*本虛擬地址節(jié)點起始頁*/WORD32 dwPageNum;/*本虛擬地址節(jié)點的頁塊數(shù)*/BYTE*pbyPageState; /*本虛擬地址節(jié)點中頁狀態(tài)*/struct tagVmemRecord*ptPrev; /*后向指針*/struct tagVmemRecord*ptNext; /*后向指針*/
}TVmemRecord;其中pbyPageState可以表示dwPageNum個頁的狀態(tài)。PbyPageState指向一塊dwPageNum個字節(jié)的內(nèi)存空間,每個字節(jié)表示其中1頁大小的虛擬地址空間狀態(tài)(映射或者沒有映射實際物理地址)。
第二步封裝對虛擬地址空間進行基本操作的接口。
1)需要封裝一套用于獲取各級表的表項的接口。
比如獲取第二級表——頁表的表項,該接口輸入必須包含的信息頁目錄表的基址,虛擬地址。輸出就是頁表的表項。接口中實現(xiàn)如下取虛擬地址的第22位到第31位,作為頁目錄表的偏移PdOffset,從地址(PageDbase<<12|PdOffset)處獲取頁目錄表項PdEntry,從PdEntry中獲取頁表的基址PageTBase;取虛擬地址的第12位到第21位,作為頁表的偏移PtOffset,從地址(PageTBase<<10|PtOffset)處獲取頁表項。這里用GetPageTableEntry表示該接口。
2)需要封裝一套用于創(chuàng)建各級表項的接口。
比如創(chuàng)建第二級表——頁表的表項,前提是該頁表表項沒有相應(yīng)的內(nèi)存存放,一般是由于相應(yīng)頁表不存在導(dǎo)致,所以表項的創(chuàng)建,實際上就是完成表的創(chuàng)建。接口的輸入包含的信息頁目錄的基址,虛擬地址。根據(jù)虛擬地址。輸出就是新創(chuàng)建的頁表。接口的實現(xiàn)如下首先使用獲取表項的接口,獲取相應(yīng)的頁目錄表的表項,此時,此表項一定是無效的;在系統(tǒng)中申請一塊存放新頁表的內(nèi)存,并將申請的內(nèi)存起始地址(該地址一定要是頁邊界對齊的),起始地址的第12位到第31位作為頁表基址填入到頁目錄表項中,頁目錄表項定義的格式見圖9,將頁目錄表項中表示頁表存在的位P(Present)置1,其他各個域可以根據(jù)用戶的需求填入有效值。在新頁表的對應(yīng)于虛擬地址的頁表項處,根據(jù)用戶的需求,填入各個域的值,頁表項定義的格式見圖10,其中的P位表示虛擬地址是否有實際的物理地址對應(yīng),如果沒有,則需要將P位置為0。(頁基址Page Base Address;頁表基址Page-Table BaseAddress)
3)需要封裝一套用于對各級表項的各個域進行設(shè)置的接口。
接口的輸入包含信息頁目錄表基址,虛擬地址。接口的輸入就是用戶期望的表項,接口的實現(xiàn)如下根據(jù)頁目錄表基址和虛擬地址找到相應(yīng)的表項,根據(jù)CPUX86手冊中規(guī)定的表項的格式,根據(jù)用戶的需求,填入期望值。
第三步對系統(tǒng)中數(shù)據(jù)資源進行保護。
1)創(chuàng)建一個管理虛擬地址數(shù)據(jù)對象。
申明一個類型為TvmemRecord的數(shù)據(jù)對象,用tVmemRecord表示。
2)在系統(tǒng)未映射物理地址的虛擬地址空間中申請一塊地址空間。
根據(jù)數(shù)據(jù)資源的大小和預(yù)設(shè)的保護帶的大小,在大于等于VirtAddrStart的地方CurrentVAddr保留一塊空間,假設(shè)空間的大小為PageNum頁,將CurrentVAddr,PageNum記錄到tVmemRecord中,同時申請一塊PageNum個字節(jié)的內(nèi)存,賦給tVmemRecord的pbyPageState,并將頁的狀態(tài)都標志為未映射狀態(tài)。
3)將數(shù)據(jù)資源所在虛擬地址空間和實際的物理地址空間進行映射。
申請一塊存放數(shù)據(jù)資源的內(nèi)存,假設(shè)該物理內(nèi)存的地址為PhyAddr,將CurrentVAddr向后偏移一個預(yù)設(shè)保護帶的大小,假設(shè)為ProtectSize,根據(jù)虛擬地址(CurrentVAddr+ProtectSize),如果存在,則直接索引到相應(yīng)的表項,否則需要創(chuàng)建表項,將其中物理地址域填成PhyAddr的第12位到第31位,并置表項的P位為1,其他域的賦值略。
4)給用戶返回操作該數(shù)據(jù)資源的起始地址。
前面提到,申請的存放數(shù)據(jù)資源的內(nèi)存的大小(假設(shè)為CurGetSize)是大于等于實際數(shù)據(jù)資源所占內(nèi)存的大小(假設(shè)為RealNeedSize)的,將地址(CurrentVAddr+ProtectSize+CurGetSize-RealNeedSize)返回給用戶使用。
可見數(shù)據(jù)資源存放的位置,在虛擬地址空間中,其兩側(cè)是未映射物理地址的,而對于未映射物理地址的空間進行任何操作,操作系統(tǒng)會檢測出來,并立即作為異常報出。此時,對該數(shù)據(jù)資源從返回的地址開始進行寫操作,寫的范圍超過RealNeedSize,就可以看見操作系統(tǒng)報Page Fault異常。
采用本發(fā)明所述方法,與現(xiàn)有技術(shù)相比,取得了突破性進步,達到了及時檢測到內(nèi)存訪問越界問題的效果,節(jié)省了系統(tǒng)可用內(nèi)存空間,提高了系統(tǒng)的穩(wěn)定性等。
以上具體實施方式
僅用于說明本發(fā)明,而非用于限定本發(fā)明。
權(quán)利要求
1.一種具有內(nèi)存保護功能的內(nèi)存管理方法,是在具有內(nèi)存管理單元的CPU上進行內(nèi)存管理;其特征在于在需要保護的內(nèi)存兩端添加保護頁,所述保護頁的屬性為不可訪問;當有操作訪問到所述保護頁所在的區(qū)域時,實時操作系統(tǒng)確認所述操作為非法修改所述內(nèi)存的操作,并報告內(nèi)存訪問異常。
2.根據(jù)權(quán)利要求1所述的一種具有內(nèi)存保護功能的內(nèi)存管理方法,其特征在于,所述的在需要保護的內(nèi)存兩端添加保護頁是指在系統(tǒng)中獲取一塊物理內(nèi)存,利用映射表的對應(yīng)關(guān)系,將該塊物理內(nèi)存映射至虛擬地址空間;其中通過所述的映射,可使得在物理地址內(nèi)存空間中連續(xù)的內(nèi)存塊,在虛擬地址內(nèi)存空間中是不連續(xù)的。
3.根據(jù)權(quán)利要求1所述的一種具有內(nèi)存保護功能的內(nèi)存管理方法,其特征在于,所述的在需要保護的內(nèi)存兩端添加保護頁是指在系統(tǒng)中獲取一塊物理內(nèi)存,利用映射表的對應(yīng)關(guān)系,將該塊物理內(nèi)存映射至虛擬地址空間;其中通過所述的映射,可使得物理地址內(nèi)存空間中不連續(xù)的內(nèi)存塊,在虛擬地址內(nèi)存空間中是連續(xù)的。
4.根據(jù)權(quán)利要求2或3所述的一種具有內(nèi)存保護功能的內(nèi)存管理方法,其特征在于只有對映射了實際物理地址的虛擬地址的操作是有效的,而對未映射的虛擬地址的操作都是無效的。
5.根據(jù)權(quán)利要求2所述的一種具有內(nèi)存保護功能的內(nèi)存管理方法,其特征在于,在所述的虛擬地址空間中,將映射了物理內(nèi)存的地址空間用來存放數(shù)據(jù),而在該地址空間兩端留有保護帶地址空間進行隔離。
6.根據(jù)權(quán)利要求5所述的一種具有內(nèi)存保護功能的內(nèi)存管理方法,其特征在于,兩個數(shù)據(jù)塊在物理內(nèi)存空間中地址是連續(xù)的;在虛擬地址空間中所述兩個數(shù)據(jù)塊之間有保護帶,地址是不連續(xù)的。
7.根據(jù)權(quán)利要求6所述的一種具有內(nèi)存保護功能的內(nèi)存管理方法,其特征在于,所述保護帶的內(nèi)存大小在虛擬地址空間中是可以設(shè)置為多頁的,且保護帶的內(nèi)存不與實際的物理內(nèi)存映射。
8.根據(jù)權(quán)利要求6所述的一種具有內(nèi)存保護功能的內(nèi)存管理方法,其特征在于包括以下具體步驟步驟一對操作系統(tǒng)進行初始化,即獲取支持內(nèi)存管理單元的CPU中提供的進行地址映射操作的數(shù)據(jù);確定尚未映射物理地址的虛擬地址范圍;建立初始化時未映射物理地址的虛擬地址空間的數(shù)據(jù)結(jié)構(gòu);步驟二封裝對虛擬地址空間進行基本操作的接口,即封裝一套用于獲取各級表的表項的接口;封裝一套用于創(chuàng)建各級表項的接口;封裝一套用于對各級表項的各個域進行設(shè)置的接口;步驟三對系統(tǒng)中數(shù)據(jù)資源進行保護,即創(chuàng)建一個管理虛擬地址數(shù)據(jù)對象;在未映射物理地址的虛擬地址空間中申請一塊地址空間;將數(shù)據(jù)資源所在虛擬地址空間和實際的物理地址空間進行映射;給用戶返回操作該數(shù)據(jù)資源的起始地址。
9.根據(jù)權(quán)利要求8所述的一種具有內(nèi)存保護功能的內(nèi)存管理方法,其特征在于步驟一所述的獲取支持內(nèi)存管理單元的CPU中提供的進行地址映射操作必需的數(shù)據(jù)是指根據(jù)CPU的硬件尋址方式,獲取一個基址,而虛擬地址提供了偏移;所述尋址為多級尋址;步驟一所述的確定尚未映射物理地址的虛擬地址范圍是指需根據(jù)所述CPU的內(nèi)存大小、系統(tǒng)外部存儲器或者外部輸入輸出設(shè)備的訪問地址空間映射在CPU地址空間的情況來確定尚未映射物理地址的虛擬地址范圍;步驟一所述的建立初始化時未映射物理地址的虛擬地址空間的數(shù)據(jù)結(jié)構(gòu)是指將系統(tǒng)中未映射物理地址的虛擬地址空間組織起來;該數(shù)據(jù)結(jié)構(gòu)需要包含的信息所操作的虛擬地址空間的起始地址;所操作的虛擬地址空間的大?。凰僮鞯奶摂M地址空間的狀態(tài),該虛擬地址空間的狀態(tài)包含虛擬地址空間中各個最小單元大小的虛擬地址的狀態(tài);步驟二所述的封裝一套用于獲取各級表的表項的接口是指第n級的表項是從第n-1級的表項中獲取第n級表的基址,再和虛擬地址中表示第n級表的偏移部分組合得到表項的地址,再從該地址獲取第n級表項,其中n大于等或等于1;步驟二所述的需要封裝一套用于創(chuàng)建各級表項的接口是指第n級表項的創(chuàng)建是根據(jù)第n級表的基址和虛擬地址中第n級表項偏移,獲取第n級表項的位置,并在此位置上按照第n級表項的格式,填入第n+1級表的基址,并將表項設(shè)置成有效,此時如果該表項對應(yīng)的第n+1級表不存在,需要申請一塊內(nèi)存用于第n+1級表的存放,并將此塊內(nèi)存的首地址作為第n+1級表的基址填入該表項中;步驟二所述的需要封裝一套用于對各級表項的各個域進行設(shè)置的接口是指設(shè)置虛擬地址到物理地址的對應(yīng)關(guān)系,設(shè)置的過程為根據(jù)虛擬地址中提供的各級表項的偏移和各級表的基址,索引到預(yù)設(shè)的表項,并將該表項中的域設(shè)置為期望的值;步驟三所述的創(chuàng)建一個管理虛擬地址數(shù)據(jù)對象是指該數(shù)據(jù)對象的數(shù)據(jù)類型就是所述步驟1中建立的數(shù)據(jù)結(jié)構(gòu),用于記錄數(shù)據(jù)資源所在虛擬地址空間的起始地址,地址空間大小和地址空間中各單元是否映射了實際物理地址;步驟三所述的在系統(tǒng)未映射物理地址的虛擬地址空間中申請一塊地址空間是指申請的虛擬地址空間的起始地址應(yīng)該大于等于所述步驟1中確定的系統(tǒng)中尚未映射物理地址的虛擬地址的起始地址;申請的虛擬地址空間的大小滿足下式CurGetSize=RealNeedSize+2*ProtectSize;其中預(yù)設(shè)保護帶大小應(yīng)該是系統(tǒng)地址映射的最小單元大小的整數(shù)倍,并在相應(yīng)管理虛擬地址數(shù)據(jù)對象中記錄申請得到的虛擬地址空間起始位置和地址空間大小記錄,并記錄該段虛擬地址為未映射物理地址狀態(tài);步驟三所述的將數(shù)據(jù)資源所在虛擬地址空間和實際的物理地址空間進行映射是指從系統(tǒng)實際的物理地址空間申請一塊內(nèi)存,該內(nèi)存的大小需要大于等于數(shù)據(jù)資源所占內(nèi)存的大小,并且是系統(tǒng)地址映射最小單元大小的整數(shù)倍;數(shù)據(jù)資源所在虛擬地址空間起始地址取申請的虛擬地址空間起始地址向后偏移預(yù)設(shè)保護帶大小,從起始地址開始,映射數(shù)據(jù)資源所占內(nèi)存大小的虛擬地址空間到剛才從系統(tǒng)中申請的物理地址上;并在相應(yīng)的管理虛擬地址數(shù)據(jù)對象中記錄該段虛擬地址空間狀態(tài)為已經(jīng)映射了物理地址的狀態(tài);步驟三所述的給用戶返回操作該數(shù)據(jù)資源的起始地址是指返回給用戶操作該數(shù)據(jù)資源的起始地址可以是從映射了物理地址的虛擬地址空間的后邊界處向前偏移實際數(shù)據(jù)資源大小處的地址。
全文摘要
本發(fā)明提供一種具有內(nèi)存保護功能的內(nèi)存管理方法,在具有MMU功能的CPU上進行內(nèi)存管理;在需要保護的內(nèi)存兩端添加保護頁;當有操作訪問到所述保護頁所在的區(qū)域時,實時操作系統(tǒng)確認所述操作為非法修改所述內(nèi)存的操作,并報告內(nèi)存訪問異常。所述保護頁的屬性為不可訪問。本方法可以在不降低內(nèi)存訪問效率的基礎(chǔ)上,提供基于頁保護的內(nèi)存保護功能,并且能夠解決因保護內(nèi)存而引起的浪費內(nèi)存的問題。由于本方法基本上不降低系統(tǒng)運行效率,同時又不會產(chǎn)生內(nèi)存浪費,因此可以在設(shè)備實際的運行環(huán)境中發(fā)揮作用,在第一時間捕獲到內(nèi)存越界操作,并保留現(xiàn)場以幫助排錯。
文檔編號G06F12/16GK1581108SQ0313224
公開日2005年2月16日 申請日期2003年7月31日 優(yōu)先權(quán)日2003年7月31日
發(fā)明者王芳, 李賢平, 樊永寧 申請人:深圳市中興通訊股份有限公司南京分公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
洛阳市| 夹江县| 安陆市| 香港 | 石门县| 衡阳县| 兴仁县| 富民县| 商丘市| 新巴尔虎左旗| 阿拉善左旗| 临江市| 拉孜县| 黎平县| 扎囊县| 济源市| 叙永县| 荔浦县| 隆德县| 石河子市| 桦甸市| 临安市| 宁晋县| 安龙县| 汶川县| 彰武县| 新营市| 札达县| 海宁市| 射洪县| 治县。| 昌吉市| 阳高县| 泽州县| 图木舒克市| 广饶县| 水城县| 禄劝| 精河县| 常熟市| 时尚|