虛擬位址空間
處理器在讀取或寫入記憶體位置時使用虛擬位址。 在這些作業期間,處理器會將虛擬位址轉譯為實體位址。
使用虛擬位址存取記憶體有數個優點:
程式可以使用連續的虛擬位址範圍來存取實體記憶體中的大型非連續記憶體緩衝區。
程式可以使用一系列虛擬位址來存取大於可用物理記憶體的記憶體緩衝區。 當物理記憶體不足時,記憶體管理員會將實體記憶體的頁面儲存 (通常大小為 4 KB,) 磁碟檔案。 系統會視需要在實體記憶體與磁碟之間移動數據或程式代碼的頁面。
不同進程所使用的虛擬位址會隔離。 一個進程中的程式代碼無法改變另一個進程或操作系統所使用的實體記憶體。
進程可用的虛擬位址範圍稱為進程的 虛擬位址空間。 每個使用者 模式進程 都有自己的私人虛擬位址空間。
32 位進程通常會在 2 GB 範圍內的虛擬位址空間0x00000000到0x7FFFFFFF。
64 位 Windows 上的 64 位進程在 128 TB 的範圍內具有虛擬位址空間,0x000『000000000 到 0x7FFF』FFFFFFFF。
虛擬位址的範圍有時稱為 虛擬記憶體範圍。 如需詳細資訊,請參閱 記憶體和地址空間限制。
下圖說明虛擬位址空間的一些重要功能。
此圖顯示兩個64位進程的虛擬位址空間:Notepad.exe 和 MyApp.exe。 每個進程都有自己的虛擬位址空間,範圍從 0x000『00000000 到 0x7FF』FFFFFFFF。 每個著色區塊都代表虛擬或實體記憶體大小) 4 KB 的一頁 (。 記事本程式使用三個連續的虛擬位址頁面,從 0x7F7『93950000 開始。 不過,這三個連續的虛擬位址頁面會對應至實體記憶體中的非連續頁面。 此外,這兩個進程都會使用從0x7F7『93950000 開始的虛擬記憶體頁面,但這些虛擬頁面會對應至不同的實體記憶體頁面。
用戶空間和系統空間
Notepad.exe 和 MyApp.exe 等進程會在使用者模式中執行。 核心作業系統元件和許多驅動程式會以更特殊許可權的核心模式執行。 如需處理器模式的詳細資訊,請參閱 使用者模式和核心模式。
每個使用者模式進程都有自己的私人虛擬位址空間,但所有在核心模式中執行的程式代碼都會共用稱為 系統空間的單一虛擬位址空間。 使用者模式進程的虛擬位址空間稱為 用戶空間。
在 32 位 Windows 中,可用的虛擬地址空間總計為 2^32 個字節, (4 GB) 。 通常,較低的 2 GB 會用於用戶空間,而上限 2 GB 則用於系統空間。
在 32 位 Windows 中,您可以在開機時間指定 (,) 超過 2 GB 可供用戶空間使用。 不過,這表示系統空間可用的虛擬位址較少。 您可以將用戶空間的大小增加為 3 GB,只保留 1 GB 的系統空間。 若要增加用戶空間的大小,請使用 BCDEdit /set increaseuserva。
在 64 位 Windows 中,虛擬位址空間的理論數量是 2^64 個字節, (16 個 exabytes) ,但實際上只會使用 16 個 exabyte 範圍的一小部分。
在使用者模式中執行的程式代碼可以存取用戶空間,但無法存取系統空間。 此限制可防止使用者模式程式代碼讀取或改變受保護的作業系統數據結構。 在核心模式中執行的程式代碼可以存取使用者空間和系統空間。 也就是說,在核心模式中執行的程式代碼可以存取系統空間和目前使用者模式進程的虛擬位址空間。
在核心模式中執行的驅動程式在用戶空間中直接讀取或寫入位址時,必須小心。 下列案例說明原因。
使用者模式程式會起始從裝置讀取某些數據的要求。 程式會提供緩衝區的起始位址來接收數據。
在核心模式中執行的裝置驅動程式例程會啟動讀取作業,並將控制權傳回給其呼叫端。
稍後,裝置會中斷目前正在執行的線程,以指出讀取作業已完成。 核心模式驅動程式例程會處理屬於任意進程的這個任意線程上的中斷。
此時,驅動程式不得將數據寫入步驟 1 中提供的使用者模式程式起始位址。 此位址位於起始要求之進程的虛擬位址空間中,這可能與目前進程不同。
分頁集區和非分頁集區
在用戶空間中,所有實體記憶體頁面都可以視需要分頁到磁碟檔案。 在系統空間中,某些實體頁面可以分頁,而其他頁面則無法分頁。 系統空間有兩個區域可動態配置記憶體:分頁集區和非分頁集區。
分頁集區中配置的記憶體可以視需要分頁分頁至磁碟檔案。 在非分頁集區中配置的記憶體永遠不會分頁至磁碟檔案。