Windows記憶體管理與結構體MEMORY_BASIC_INFORMATION

來源:互聯網
上載者:User
基於32位Windows,摘自http://blog.csdn.net/yeming81/archive/2008/01/16/2046193.aspx  1. 進程地址空間 軟體的進程運行於32位系統上,其定址位也是32位,能表示的空間是2的32 =4G,範圍從0x0000 0000~0xFFFF FFFF。 ·        NULL指標分區範圍:0x0000 0000~0x0000 FFFF作用:保護記憶體非法訪問例子:分配記憶體時,如果由於某種原因分配不成功,則返回null 指標0x0000 0000;當使用者繼續使用比如改寫資料時,系統將因為發生訪問違規而退出。        那麼,為什麼需要那麼大的地區呢,一個地址值不就行了嗎?我在想,是不是因為不讓8或16位的程式運行於32位的系統上呢?!因為NULL分區剛好範圍是16的進程空間。 ·        獨享使用者分區範圍:0x0001 0000~0x7FFE FFFF作用:進程只能讀取或訪問這個範圍的虛擬位址;超越這個範圍的行為都會產生違規退出。例子:        程式的二進位代碼中所用的地址大部分將在這個範圍,所有exe和dll檔案都載入到這個。每個進程將近2G的空間是獨享的。注意:如果在boot.ini上設定了/3G,這個地區的範圍從2G擴大為3G:0x0001 0000~0xBFFE FFFF。 ·        共用核心分區範圍:0x8000 0000~0xFFFF FFFF作用:這個空間是供作業系統核心代碼、裝置驅動程式、裝置I/O快取、非頁面記憶體池的分配、進程目表和頁表等。例子:       這段地址各進程是可以共用的。                                                                                                                                         注意:如果在boot.ini上設定了/3G,這個地區的範圍從2G縮小為1G:0xC000 0000~0xFFFF FFFF。       通過以上分析,可以知道,如果系統有n個進程,它所需的虛擬空間是:2G*n+2G (核心只需2G的共用空間)。 2. 進程地址空間與實際記憶體的映射 地址空間在運行中映射為實際的物理頁面。 ·        地區地區指的是上述地址空間中的一片連續地址。地區的大小必須是粒度(64k) 的整數倍,不是的話系統自動處理成整數倍。不同CPU粒度大小是不一樣的,大部分都是64K。地區的狀態有:空閑、私人、映射、映像。在你的應用程式中,申請空間的過程稱作保留(預訂),可以用VirtualAlloc;刪除空間的過程為釋放,可以用VirtualFree。        在程式裡預訂了地址空間以後,你還不可以存取資料,因為你還沒有付錢,沒有真實的RAM和它關聯。這時候的地區狀態是私人;預設情況下,地區狀態是空閑;當exe或DLL檔案被映射進了進程空間後,地區狀態變成映像;當一般資料檔案被映射進了進程空間後,地區狀態變成映射。 ·        實體儲存體器Windows各系列支援的記憶體上限是不一樣的,從2G到64G不等。理論上32位CPU,硬體上只能支援4G記憶體的定址;能支援超過4G的記憶體只能靠其他技術來彌補。順便提一下,Windows個人版只能支援最大2G記憶體,Intel使用Address Windows Extension (AWE) 技術使得定址範圍為236=64G。當然,也得作業系統配合。        記憶體配置的最小單位是4K或8K,一般來說,根據CPU不同而不同,後面你可以看到可以通過系統函數得到地區粒度和頁面粒度。 ·        頁檔案頁檔案是存在硬碟上的系統檔案,它的大小可以在系統屬性裡面設定,它相當於實體記憶體,所以稱為虛擬記憶體。事實上,它的大小是影響系統快慢的關鍵所在,如果實體記憶體不多的情況下。       每頁的大小和上述所說記憶體配置的最小單位是一樣的,通常是4K或8K。 ·        訪問屬性物理頁面的訪問屬性指的是對頁面進行的具體操作:可讀、可寫、可執行。CPU一般不支援可執行,它認為可讀就是可執行。但是,作業系統提供這個可執行檔許可權。PAGE_NOACCESSPAGE_READONLYPAGE_READWRITEPAGE_EXECUTEPAGE_EXECUTE_READPAGE_EXECUTE_READWRITE這6個屬性很好理解,第一個是拒絕所有操作,最後一個是接受收有操作;PAGE_WRITECOPYPAGE_EXECUTE_WRITECOPY這兩個屬性在運行同一個程式的多個執行個體時非常有用;它使得程式可以共用程式碼片段和資料區段。一般情況下,多個進程唯讀或執行頁面,如果要寫的話,將會Copy頁面到新的頁面。通過映射exe檔案時設定這兩個屬性可以達到這個目的。PAGE_NOCACHEPAGE_WRITECOMBINE這兩個是開發裝置驅動的時候需要的。PAGE_GUARD當往頁面寫入一個位元組時,應用程式會收到堆疊溢位通知,線上程堆棧時有用。 ·    映射過程進程地址空間的地址是虛擬位址,也就是說,當取到指令時,需要把虛擬位址轉化為物理地址才能夠存取資料。這個工作通過頁目和頁表進行。 頁目大小為4K,其中每一項(32位)儲存一個頁表的物理地址;每個頁表大小為4K,其中每一項(32位)儲存一個物理頁的物理地址,一共有1024個頁表。利用這4K+4K*1K=4.4M的空間可以表示進程的1024*1024* (一頁4K) =4G的地址空間。高10位用來找到1024個頁目項中的一項,取出頁表的物理地址後,利用中10位來得到頁表項的值,根據這個值得到物理頁的地址,由於一頁有4K大小,利用低12位得到單元地址,這樣就可以訪問這個記憶體單元了。        每個進程都有自己的一個頁目和頁表,那麼,剛開始進程是怎麼找到頁目所在的物理頁呢?答案是CPU的CR3寄存器會儲存當前進程的頁目物理地址。        當進程被建立時,同時需要建立頁目和頁表,一共需要4.4M。在進程的空間中,0xC030 0000~0xC030 0FFF是用來儲存頁目的4k空間。0xC000 0000~0xC03F FFFF是用來儲存頁表的4M空間。也就是說程式裡面訪問這些地址你是可以讀取頁目和頁表的具體值的(要工作在核心方式下)。有一點我不明白的是,頁表的空間包含了頁目的空間!        至於說,頁目和頁表是儲存在實體記憶體還是頁檔案中,我覺得,頁目比較常用,應該在實體記憶體的機率大點,頁表需要時再從頁檔案匯入實體記憶體中。        頁目項和頁表項是一個32位的值,當頁目項第0位為1時,表明頁表已經在實體記憶體中;當頁表項第0位為1時,表明訪問的資料已經在記憶體中。還有很多資料是否已經被改變,是否可讀寫等標誌。另外,當頁目項第7位為1時,表明這是一個4M的頁面,這值已經是物理頁地址,用虛擬位址的低22位作為位移量。還有很多:資料是否已經被改變、是否可讀寫等標誌。  3. 結構體MEMORY_BASIC_INFORMATION  typedef struct _MEMORY_BASIC_INFORMATION {
          PVOID BaseAddress;                  //查詢記憶體塊所佔的第一個頁面基地址
          PVOID AllocationBase;               //記憶體塊所佔的第一塊地區基地址,小於等於BaseAddress,
                                                         //也就是說BaseAddress一定包含在AllocationBase分配的範圍內
          DWORD AllocationProtect;            //地區被初次保留時賦予的保護屬性
          SIZE_T RegionSize;              //從BaseAddress開始,具有相同屬性的頁面的大小,
          DWORD State;           //頁面的狀態,有三種可能值:MEM_COMMIT、MEM_FREE和MEM_RESERVE,
                                            //這個參數對我們來說是最重要的了,從中我們便可知指定記憶體頁面的狀態了
          DWORD Protect;         //頁面的屬性,其可能的取值與AllocationProtect相同
          DWORD Type;        //該記憶體塊的類型,有三種可能值:MEM_IMAGE、MEM_MAPPED、MEM_PRIVATE
     } MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION; 引自:  http://pengwenjia.spaces.live.com/blog/cns!32E37CAE7606B8D4!203.entry
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.