




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、本文背景:在編程中,很多Windows或C+的內(nèi)存函數(shù)不知道有什么區(qū)別,更別談有效使用;根本的 原因是,沒有清楚的理解操作系統(tǒng)的內(nèi)存管理機制,本文企圖通過簡單的總結(jié)描述,結(jié)合實 例來闡明這個機制。本文目的:對Windows內(nèi)存管理機制了解清楚,有效的利用C+內(nèi)存函數(shù)管理和使用內(nèi)存。本文內(nèi)容:1.進程地址空間1.1地址空間32|64位的系統(tǒng)|CPU操作系統(tǒng)運行在硬件CPU上,32位操作系統(tǒng)運行于32位CPU上,64位操作系統(tǒng) 運行于64位CPU上;目前沒有真正的64位CPU。32位CPU 一次只能操作32位二進制數(shù);位數(shù)多CPU設(shè)計越復(fù)雜,軟件設(shè)計越簡單。軟件的進程運行于32位系統(tǒng)上,其尋址位也
2、是32位,能表示的空間是232=4G,范 圍從 0 x0000 00000 xFFFF FFFFoNULL指針分區(qū)范圍:0 x0000 00000 x0000 FFFF作用:保護內(nèi)存非法訪問例子:分配內(nèi)存時,如果由于某種原因分配不成功,則返回空指針0 x0000 0000 ;當(dāng)用戶繼 續(xù)使用比如改寫數(shù)據(jù)時,系統(tǒng)將因為發(fā)生訪問違規(guī)而退出。那么,為什么需要那么大的區(qū)域呢,一個地址值不就行了嗎?我在想,是不是因為 不讓8或16位的程序運行于32位的系統(tǒng)上呢?!因為NULL分區(qū)剛好范圍是16的進程空 間。獨享用戶分區(qū)范圍:0 x0001 00000 x7FFE FFFF作用:進程只能讀取或訪問這個范圍
3、的虛擬地址;超越這個范圍的行為都會產(chǎn)生違規(guī)退出。例子:程序的二進制代碼中所用的地址大部分將在這個范圍,所有exe和dll文件都加載 到這個。每個進程將近2G的空間是獨享的。注意:如果在boot.ini上設(shè)置了/3G,這個區(qū)域的范圍從2G擴大為3G: 0 x0001 00000 xBFFE FFFFo共享內(nèi)核分區(qū)范圍:0 x8000 00000 xFFFF FFFF作用:這個空間是供操作系統(tǒng)內(nèi)核代碼、設(shè)備驅(qū)動程序、設(shè)備I/O高速緩存、非頁面內(nèi)存池 的分配、進程目表和頁表等。例子:這段地址各進程是可以共享的。注意:如果在boot.ini上設(shè)置了/3G,這個區(qū)域的范圍從2G縮小為1G: 0 xC00
4、0 00000 xFFFF FFFFo通過以上分析,可以知道,如果系統(tǒng)有n個進程,它所需的虛擬空間是:2G*n+2G (內(nèi) 核只需2G的共享空間)。1.2地址映射區(qū)域區(qū)域指的是上述地址空間中的一片連續(xù)地址。區(qū)域的大小必須是粒度(64k)的整數(shù)倍,不是 的話系統(tǒng)自動處理成整數(shù)倍。不同CPU粒度大小是不一樣的,大部分都是64Ko區(qū)域的狀態(tài)有:空閑、私有、映射、映像。在你的應(yīng)用程序中,申請空間的過程稱作保留(預(yù)訂),可以用VirtualAlloc;刪除空間的過程為釋放,可以用VirtualFreeo在程序里預(yù)訂了地址空間以后,你還不可以存取數(shù)據(jù),因為你還沒有付錢,沒有真 實的RAM和它關(guān)聯(lián)。這時候的
5、區(qū)域狀態(tài)是私有;默認(rèn)情況下,區(qū)域狀態(tài)是空閑;當(dāng)exe或DLL文件被映射進了進程空間后,區(qū)域狀態(tài)變成映像;當(dāng)一般數(shù)據(jù)文件被映射進了進程空間后,區(qū)域狀態(tài)變成映射。物理存儲器Windows各系列支持的內(nèi)存上限是不一樣的,從2G到64G不等。理論上32位CPU,硬件 上只能支持4G內(nèi)存的尋址;能支持超過4G的內(nèi)存只能靠其他技術(shù)來彌補。順便提一下,Windows個人版只能支持最大2G內(nèi)存,Intel使用Address Windows Extension (AWE)技術(shù)使 得尋址范圍為236=64G。當(dāng)然,也得操作系統(tǒng)配合。內(nèi)存分配的最小單位是4K或8K,一般來說,根據(jù)CPU不同而不同,后面你可以看 到可
6、以通過系統(tǒng)函數(shù)得到區(qū)域粒度和頁面粒度。頁文件頁文件是存在硬盤上的系統(tǒng)文件,它的大小可以在系統(tǒng)屬性里面設(shè)置,它相當(dāng)于物理內(nèi)存, 所以稱為虛擬內(nèi)存。事實上,它的大小是影響系統(tǒng)快慢的關(guān)鍵所在,如果物理內(nèi)存不多的情 況下。每頁的大小和上述所說內(nèi)存分配的最小單位是一樣的,通常是4K或8K。訪問屬性物理頁面的訪問屬性指的是對頁面進行的具體操作:可讀、可寫、可執(zhí)行oCPU 一般不支持 可執(zhí)行,它認(rèn)為可讀就是可執(zhí)行。但是,操作系統(tǒng)提供這個可執(zhí)行的權(quán)限。PAGE_NOACCESSPAGE_READONLYPAGE_READWRITEPAGE_EXECUTEPAGE_EXECUTE_READPAGE_EXECUT
7、E_READWRITE這6個屬性很好理解,第一個是拒絕所有操作,最后一個是接受收有操作;PAGE_WRITECOPYPAGE_EXECUTE_WRITECOPY這兩個屬性在運行同一個程序的多個實例時非常有用;它使得程序可以共享代碼段和數(shù)據(jù)段。 一般情況下,多個進程只讀或執(zhí)行頁面,如果要寫的話,將會Copy頁面到新的頁面。通過 映射exe文件時設(shè)置這兩個屬性可以達到這個目的。PAGENOCACHEPAGE_WRITECOMBINE這兩個是開發(fā)設(shè)備驅(qū)動的時候需要的。PAGE_GUARD當(dāng)往頁面寫入一個字節(jié)時,應(yīng)用程序會收到堆棧溢出通知,在線程堆棧時有用。映射過程進程地址空間的地址是虛擬地址,也就是
8、說,當(dāng)取到指令時,需要把虛擬地址轉(zhuǎn)化為物理地 址才能夠存取數(shù)據(jù)。這個工作通過頁目和頁表進行。從圖中可以看出,頁目大小為4K,其中每一項(32位)保存一個頁表的物理地址;每個頁表 大小為4K,其中每一項(32位)保存一個物理頁的物理地址,一共有1024個頁表。利用這 4K+4K*1K=4.4M的空間可以表示進程的1024*1024* (一頁4K) =4G的地址空間。進程空間中的32位地址如下:高1 0位中1(3位低12位高10位用來找到1024個頁目項中的一項,取出頁表的物理地址后,利用中10位來得到頁 表項的值,根據(jù)這個值得到物理頁的地址,由于一頁有4K大小,利用低12位得到單元地址, 這樣就
9、可以訪問這個內(nèi)存單元了。每個進程都有自己的一個頁目和頁表,那么,剛開始進程是怎么找到頁目所在的物 理頁呢?答案是CPU的CR3寄存器會保存當(dāng)前進程的頁目物理地址。當(dāng)進程被創(chuàng)建時,同時需要創(chuàng)建頁目和頁表,一共需要4.4M。在進程的空間中, 0 xC030 00000 xC030 0FFF是用來保存頁目的4k空間。0 xC000 00000 xC03F FFFF是用來保存 頁表的4M空間。也就是說程序里面訪問這些地址你是可以讀取頁目和頁表的具體值的(要 工作在內(nèi)核方式下)。有一點我不明白的是,頁表的空間包含了頁目的空間!至于說,頁目和頁表是保存在物理內(nèi)存還是頁文件中,我覺得,頁目比較常用,應(yīng) 該在
10、物理內(nèi)存的概率大點,頁表需要時再從頁文件導(dǎo)入物理內(nèi)存中。頁目項和頁表項是一個32位的值,當(dāng)頁目項第0位為1時,表明頁表已經(jīng)在物理 內(nèi)存中;當(dāng)頁表項第0位為1時,表明訪問的數(shù)據(jù)已經(jīng)在內(nèi)存中。還有很多數(shù)據(jù)是否已經(jīng)被 改變,是否可讀寫等標(biāo)志。另外,當(dāng)頁目項第7位為1時,表明這是一個4M的頁面,這值 已經(jīng)是物理頁地址,用虛擬地址的低22位作為偏移量。還有很多:數(shù)據(jù)是否已經(jīng)被改變、 是否可讀寫等標(biāo)志。1.3 一個例子-編寫生成軟件程序exe軟件描述如下:Main ()1:定義全局變量2:處理函數(shù)邏輯(Load所需DLL庫,調(diào)用方法處理邏輯)3:定義并實現(xiàn)各種方法(方法含有局部變量)4:程序結(jié)束將程序編譯
11、,生成exe文件,附帶所需的DLL庫。exe文件格式exe文件有自己的格式,有若干節(jié)(section): .text用來放二進制代碼(exe或dll); .data用 來放各種全局?jǐn)?shù)據(jù)。.text指令 1: move a, b指令 2: add a, b.data數(shù)據(jù)1: a=2數(shù)據(jù)2: b=1這些地址都是虛擬地址,也就是進程的地址空間。運行exe程序建立進程:運行這個exe程序時,系統(tǒng)會創(chuàng)建一個進程,建立進程控制塊PCB,生成進程頁 目和頁表,放到PCB中。數(shù)據(jù)對齊:數(shù)據(jù)的內(nèi)存地址除以數(shù)據(jù)的大小,余數(shù)為0時說明數(shù)據(jù)是對齊的?,F(xiàn)在的編譯器 編譯時就考慮數(shù)據(jù)對齊的問題,生成exe文件后,數(shù)據(jù)基本
12、上是對齊的,CPU運行時,寄存 器有標(biāo)志標(biāo)識CPU是否能夠自動對齊數(shù)據(jù),如果遇到不能對齊的情況,或者通過兩次訪問 內(nèi)存,或者通知操作系統(tǒng)處理。要注意的是,如果數(shù)據(jù)沒有對齊,CPU處理的效率是很低的。文件映射:系統(tǒng)不會將整個exe文件和所有的DLL文件裝載進物理內(nèi)存中,同時它也不會裝 載進頁面文件中。相反,它會建立文件映射,也就是利用exe本身當(dāng)作頁面文件。系統(tǒng)將部 分二進制代碼裝載進內(nèi)存,分配頁面給它。假設(shè)分配了一個頁面,物理地址為0 x0232 FFF1。其中裝載的一個指令虛擬地址為 0 x4000 1001=0100 0000 00 0000 0000 01 0000 0000 0001。
13、一個頁面有 4K,系統(tǒng)會將指令保存 在低12位0 x0001的地址處。同時,系統(tǒng)根據(jù)高10位0 x0100找到頁目項,如果沒有關(guān)聯(lián)的 頁表,系統(tǒng)會生成一個頁表,分配一個物理頁;然后,根據(jù)中10位0 x0001找到表項,將物 理地址0 x0232 FFF1存進去。執(zhí)行過程:執(zhí)行時,當(dāng)系統(tǒng)拿到一個虛擬地址,就根據(jù)頁目和頁表找到數(shù)據(jù)的地址,根據(jù)頁目上的值可 以判斷頁表是在頁文件中還是在內(nèi)存中;如果在頁文件中,會將頁面導(dǎo)入內(nèi)存,更新頁目項。讀取頁表項的值后,可以判斷數(shù)據(jù)頁文 件中還是在物理內(nèi)存中;如果在頁文件中,會導(dǎo)入到內(nèi)存中,更新頁表項。最終,拿到了數(shù) 據(jù)。在分配物理頁的過程中,系統(tǒng)會根據(jù)內(nèi)存分配的狀況適當(dāng)淘汰暫時不用的頁面,如 果頁面內(nèi)容改變了(通過頁表項的標(biāo)志位),保存到頁文件中,系統(tǒng)會維護內(nèi)存與頁文件的 對應(yīng)關(guān)系。由于將exe文件當(dāng)作內(nèi)存映射文件,當(dāng)需要改變數(shù)據(jù),如更改全局變量的值時,利用 Copy-On-Write的機制,重新生成頁文件,將結(jié)果保存在這個頁文件中,原來的頁文件還是 需要
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 一年級下學(xué)期體育教學(xué)計劃
- 廠家招商加盟合同范例
- 《黃帝內(nèi)經(jīng)》讀書心得體會
- 廠家飯盒供貨合同范本
- 卡丁車購銷合同范本
- 冷庫空調(diào)保養(yǎng)合同范例
- 農(nóng)村建房木工合同范本
- 參加比賽用車合同范本
- app系統(tǒng)使用合同范本
- 出口貨物提供合同范本
- 2024年山東淄博市城市資產(chǎn)運營有限公司招聘筆試參考題庫含答案解析
- 酒店公共區(qū)域電梯安全使用培訓(xùn)
- 急性冠脈綜合征ACS課件
- 三角函數(shù)的誘導(dǎo)公式(一)完整版
- 零信任安全模型研究
- 中小學(xué)幼兒園安全風(fēng)險防控工作規(guī)范
- 正確認(rèn)識民族與宗教的關(guān)系堅持教育與宗教相分離
- 畜禽廢棄物資源化利用講稿課件
- 土地糾紛調(diào)解簡單協(xié)議書
- 服裝倉庫管理制度及流程
- 架子工安全教育培訓(xùn)試題(附答案)
評論
0/150
提交評論