1. 程式人生 > >Windows核心程式設計學習筆記--第13章

Windows核心程式設計學習筆記--第13章

試試渲染,最合適自己的講解方式:流程中穿插概念。

程式執行需經由記憶體執行。所以講講windows記憶體體系結構。

windows記憶體體系結構由虛擬地址空間和記憶體兩部分組成。

記憶體:

如果每個程式執行都直接佔用記憶體,那你開一個冰封王座豈不是要佔1G的記憶體?還能不能幹別的了。虛擬地址空間的設計簡直是神來之筆。

給每個程序分配一個4G(32位系統來說)的虛擬地址空間。程序直接操作虛擬地址空間,讀寫資料時,才給它調撥物理儲存器。

實體記憶體和虛擬記憶體關係:實體記憶體和虛擬記憶體對應。除OS外任何程式都不會直接訪問實體記憶體而是訪問虛擬記憶體。可把虛擬記憶體等同於實體記憶體。以後就只說記憶體,不再區分實體記憶體和虛擬記憶體。

頁面檔案和虛擬記憶體關係:可把虛擬記憶體等同於實體記憶體。改變頁面檔案大小可改變虛擬記憶體大小。詳細來說:頁面檔案只是改變了實體記憶體的大小,當然也改變了虛擬記憶體的大小。(猜測:實體記憶體和虛擬記憶體的對映在大小上是1:1的。)可禁用頁面檔案但不能禁用虛擬記憶體。

虛擬地址空間和實體地址空間對應:虛擬地址空間指的是程序的可用地址空間範圍。而實體地址空間指的是實際可用的記憶體空間範圍。

虛擬地址空間:

虛擬地址空間也是分割槽的,並不是所有都可供使用者使用。

系統建立程序並賦予它地址空間時,可用空間中的大部分都是閒置的或未分配的。要使用這部分地址空間,必須呼叫VirtualAlloc來分配其中的區域。分配區域的操作成為預訂。預訂地址空間時,系統會確保區域的起始地址正好是分配粒度的整數倍,區域大小正好是系統頁面大小的整數倍。(

分配粒度和系統頁面大小據CPU不同而不同。)VirtualFree來釋放分配的區域。

要使用所預定的地址空間,必須分配物理儲存器,並將儲存器對映到所預訂的區域。此過程稱為調撥物理儲存器。物理儲存器的調撥同預定區域一樣,也是以頁面為單位來進行。通過VirtualAlloc來調撥物理儲存器,VirtualFree來釋放物理儲存器

頁交換檔案:

如今OS能把磁碟空間當記憶體使用,就是讀寫速度比較慢。磁碟上的檔案一般稱為頁交換檔案。把記憶體上的一部分儲存到頁交換檔案中,並在應用程式需要時再將頁交換檔案中的對應部分載入記憶體。VirtualAlloc把物理儲存器調撥給地址空間區域時,該空間實際上是從硬碟上的頁交換檔案分配的。

不在頁交換檔案中維護的物理儲存器:

當執行一個程式時,系統會開啟該程式對應的.exe檔案並計算出應用程式的程式碼和資料的大小。然後系統會預訂一塊地址空間,並註明與該區域相關聯的物理儲存器就是.exe檔案本身。系統並沒有從頁交換檔案中分配空間,而是將.exe檔案的實際內容(或叫檔案映像)用作程式預訂的地址空間區域。這樣,不但載入程式快,而且頁交換檔案大小也合適。

當把一個程式位於硬碟上的檔案映像(即一個.exeDLL檔案)用作地址空間區域對應的物理儲存器時,稱這個檔案映像為記憶體對映檔案。當載入一個.exeDLL時,系統會自動預訂地址空間區域並把檔案映像對映到該區域,但系統也提供了一組函式,可讓開發人員把資料檔案對映到地址空間。

虛擬記憶體就是程式程式碼因不能直接訪問實體記憶體而間接訪問實體記憶體的機制。或者更具體點的這麼說:虛擬記憶體技術說白了就是先給程式預訂虛擬地址空間,再在需要時給虛擬地址空間調撥物理儲存器,這樣節省記憶體。

總彙: