虛拟位址空間
2017/04/20

當處理器讀取或寫入記憶體位置時,它會使用虛拟位址。 在讀取或寫入操作過程中,處理器會将虛拟位址轉換為實體位址。 通過虛拟位址通路記憶體有以下優勢:
程式可以使用一系列連續的虛拟位址來通路實體記憶體中不連續的大記憶體緩沖區。
程式可以使用一系列虛拟位址來通路大于可用實體記憶體的記憶體緩沖區。 當實體記憶體的供應量變小時,記憶體管理器會将實體記憶體頁(通常大小為 4 KB)儲存到磁盤檔案。 資料或代碼頁會根據需要在實體記憶體與磁盤之間移動。
不同程序使用的虛拟位址彼此隔離。 一個程序中的代碼無法更改正在由另一程序或作業系統使用的實體記憶體。
程序可用的虛拟位址範圍稱為該程序的“虛拟位址空間” 。 每個使用者模式程序都有其各自的專用虛拟位址空間。 對于 32 位程序,虛拟位址空間通常為 2 GB,範圍從 0x00000000 至 0x7FFFFFFF。 對于 64 位程序,虛拟位址空間為 8 TB,範圍從 0x000'00000000 至 0x7FF'FFFFFFFF。 一系列虛拟位址有時稱為一系列“虛拟記憶體” 。
此圖說明了虛拟位址空間的一些重要功能。
該圖顯示了兩個 64 位程序的虛拟位址空間:Notepad.exe 和 MyApp.exe。 每個程序都有其各自的虛拟位址空間,範圍從 0x000'0000000 至 0x7FF'FFFFFFFF。 每個陰影塊都表示虛拟記憶體或實體記憶體的一個頁(大小為 4 KB)。 注意,Notepad 程序使用從 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 艾位元組),但實際上僅使用 16 艾位元組範圍的一小部分。 範圍從 0x000'00000000 至 0x7FF'FFFFFFFF 的 8 TB 用于使用者空間,範圍從 0xFFFF0800'00000000 至 0xFFFFFFFF'FFFFFFFF 的 248 TB 的部分用于系統空間。
使用者模式下運作的代碼可以通路使用者空間,但不能通路系統空間。 此限制可防止使用者模式代碼讀取或更改受保護的作業系統資料結構。 核心模式下運作的代碼既可以通路使用者空間,也可以通路系統空間。 即,核心模式下運作的代碼可以通路系統空間和目前使用者模式程序的虛拟位址空間。
核心模式下運作的驅動程式必須在直接從使用者空間位址中讀取或寫入這些位址時非常小心。 此方案說明了原因。
使用者模式程式發起從裝置讀取某些資料的請求。 程式提供緩沖區的起始位址以接收資料。
核心模式下運作的裝置驅動程式例程啟動讀取操作并将控制權傳回給其調用程式。
稍後,裝置中斷了目前正在運作的任何線程以顯示讀取操作完成。 中斷由此任意線程(屬于任意程序)上運作的核心模式驅動程式例程進行處理。
此時,驅動程式不得将資料寫入使用者模式程式在步驟 1 中提供的開始位址。 此位址位于發起請求的程序的虛拟位址空間中,該程序很可能與目前程序不同。
在使用者空間中,所有實體記憶體頁面都可以根據需要調出到磁盤檔案。 在系統空間中,某些實體頁面可以調出,而其他實體頁面則不能。 系統空間具有用于動态配置設定記憶體的兩個區域:分頁緩沖池和非分頁緩沖池。
分頁緩沖池中配置設定的記憶體可以根據需要調出到磁盤檔案。 非分頁緩沖池中配置設定的記憶體永遠無法調出到磁盤檔案。