虛擬地址空間



虛擬地址空間

轉自--》》 http://msdn.microsoft.com/zh-cn/library/hh439648(v=vs.85).aspx

當處理器讀或寫入內存位置時,它會使用虛擬地址。作爲讀或寫操作的一部分,處理器將虛擬地址轉換爲物理地址。通過虛擬地址訪問內存有以下優勢:

  • 程序可以使用一系列相鄰的虛擬地址來訪問物理內存中不相鄰的大內存緩衝區。

  • 程序可以使用一系列虛擬地址來訪問大於可用物理內存的內存緩衝區。當物理內存的供應量變小時,內存管理器會將物理內存頁(通常大小爲 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. 用戶模式程序發起從設備讀取某些數據的請求。程序提供緩衝區的起始地址以接收數據。

  2. 在內核模式下運行的設備驅動程序例程啓動讀取操作並將控制權返回到其調用程序。

  3. 然後,設備中斷了當前運行的任何線程以顯示讀取操作完成。 中斷由在此任意線程上運行的內核模式驅動程序例程進行處理,該例程屬於任意進程。
  4. 此時,驅動程序不得將數據寫入用戶模式程序在步驟 1 中提供的開始地址。此地址位於發起請求的進程的虛擬地址空間,該進程可能很大程度上不同於當前進程。

頁面緩衝池和非頁面緩衝池

在用戶空間中,所有物理內存頁面都可以根據需要進行分頁至磁盤文件。在系統空間中,某些物理頁面可以分頁,而其他頁面不能。系統空間具有用於動態分配內存的兩個區域:頁面緩衝池和非頁面緩衝池。在 64 位 Windows 中,頁面緩衝池爲 128 GB 的虛擬地址,範圍從 0xFFFFA800'00000000 至 0xFFFFA81F'FFFFFFFF。非頁面緩衝池爲 128 GB 的虛擬地址,範圍從 0xFFFFAC00'00000000 至 0xFFFFAC1F'FFFFFFFF。

在頁面緩存池中分配的內存可以根據需要分頁至磁盤文件。在非頁面緩衝池中分配的內存永遠無法分頁至磁盤文件。

圖:比較頁面緩衝池中的內存分配與非頁面緩衝池中的內存分配


發佈了10 篇原創文章 · 獲贊 11 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章