天天看點

12、Windows API 記憶體管理(2)

4、程序的記憶體空間<?xml:namespace prefix = o />

1)程序虛拟位址空間的實作

    Windows系統中每個程序都有一個私有的虛拟位址空間,系統需要将每個程序的虛拟位址都映射到實體記憶體位址上。為了實作系統中每個程序都有一個私有的虛拟位址空間,系統為每一個程序都建立一個頁目錄( Directory)和一組頁表。每個程序的頁表是獨立的,而核心空間的頁表是所有程序共享的。

   在x86平台上,CR3寄存器辨別了頁目錄所在的實體位址。Windows系統上的第一個程序都有獨立的頁目錄,是以系統運作時,CR3寄存器中儲存的頁目錄位址是會變化的,其值為目前運作的程序的頁目錄位址。當系統要進行程序切換時,會将CR3寄存器中儲存的頁目錄位址設定為将要切換過去并開始運作的程序的頁目錄位址。Windows平台的每一個程序都有一個KPROCESS結構的資料塊,其中包括了其程序頁目錄的位址。

2)資料共享與保護

    有一些程序間共享的資料、系統的可執行代碼(系統DLL)等,在各個程序間都是一緻的,是以沒有必要在實體記憶體中為這些資料儲存多份,不同程序的虛拟記憶體分頁可以映射為同樣的實體記憶體分頁,這樣可以節省實體記憶體的使用。

    同時,為了保證這種在映射到相同實體記憶體頁上的記憶體分頁在程序上仍然是私有的,系統還提供了一些保護機制。如果某個程序将某個系統DLL加載入程序記憶體空間以後,對該DLL中的資料進行了寫操作,系統就會監視到該操作,并在資料寫入之前,将要寫入的程序虛拟記憶體分頁映射到另一個新的實體分頁,并将原分頁中系統DLL的内容複制到這個分頁中,程序間不共享這個新實體記憶體分頁,最後程序完成寫操作,将資料寫入這個新分頁中。這種對記憶體中系統DLL資料的寫入操作不會影響到其他程序,是以保護了各個程序中資料的獨立性,這種機制叫Copy-On-Write。如果系統确實需要在程序間共享資料,也可以對特定的頁面不使用Copy-On-Write。

12、Windows API 記憶體管理(2)

3)注意點

    開發人員隻需要了解以下内容。

(1)虛拟位址空間中的資料是分頁管理的。

(2)應用程式不用考慮系統中其他應用程式的記憶體使用情況,如占用了多少記憶體、占用了哪些記憶體等。

(3)虛拟位址并不是實體位址空間中的位址,不是資料在記憶體中真實存在的位址,作業系統會将程序的虛拟位址映射到真實的實體記憶體的位址。

(4)程序也不用考慮真實的實體記憶體有多大,隻需要了解可以使用2GB(一般情況下)的記憶體,作業系統負責轉換。

(5)如果系統中沒有足夠的實體記憶體供使用,那麼作業系統會将目前沒有使用的記憶體分頁“排程”到硬碟上儲存起來。頁面排程不會造成記憶體中的資料在虛拟位址空間中位址的改變,是以程序不需要知道記憶體分頁是如何排程的,不需要知道記憶體中儲存的資料是在記憶體中還是在硬碟上,隻需要知道其虛拟位址就可以了。

5、虛拟記憶體布局、記憶體的分工

    程序的虛拟記憶體空間分為兩個部分,低2GB(或3GB)由應用程式使用,高2GB(或1GB)由系統核心程式使用。

    系統核心的記憶體空間中包括驅動程式,系統核心可執行程式、用于記憶體管理的資料結構(頁目錄、頁表等),用于程序管理、線程排程的資料結構、各種中斷處理程式,系統緩存等。

    應用程式可使用的低位址空間中包括了應用程式的代碼、資料(全局變量等)、系統和使用者DLL的代碼、各線程的棧、堆等。

    棧和堆是兩種重要的内在管理形式。

    程序的每個線程都有自己的棧,棧與函數的調用、執行和傳回及局部變量的儲存相關,一般情況下,棧中儲存着函數的參數、傳回位址和局部變量,調用函數将參數入棧,調用指令将函數傳回位址入棧,被調用函數負責儲存調用函數的相關棧指針,為局部變量配置設定空間等,而堆是一種可以動态配置設定和釋放的記憶體,由堆管理器進行管理,使用者在程式中使用的記憶體配置設定函數都是通過堆進行配置設定的。

6、記憶體的保護屬性和存取權限

系統為每個記憶體分頁提供保護屬性和存取權限,記憶體的保護屬性和存取權限的最小機關是分頁,同一個分頁中的記憶體具有相同的保護屬性和存取權限。使用者位址空間中記憶體分頁有多種保護屬性和存取權限,如PAGE_EXECUTE等。

<a href="http://msdn.microsoft.com/en-us/library/aa366786%28VS.85%29.aspx">http://msdn.microsoft.com/en-us/library/aa366786%28VS.85%29.aspx</a>

7、相關API

12、Windows API 記憶體管理(2)
12、Windows API 記憶體管理(2)
12、Windows API 記憶體管理(2)

繼續閱讀