如何對應到處理序位址空間的 RAM 配接器

文章翻譯 文章翻譯
文章編號: 189327 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

結論

當您對應大量的介面卡記憶體時,可能會收到下列其中一種徵狀:
  • 無法使用的系統 PTE (NO_MORE_SYSTEM_PTES)。
  • 沒有足夠的連續的處理序位址空間。
本文將告訴您:
  • 為什麼會發生這些問題
  • 如何解決它們
  • 兩種方法可以將介面卡的記憶體對應至處理序位址空間

其他相關資訊

分頁表項目 (PTE) 的簡介

在 Windows NT 系統執行每個處理程序有 4 GB 虛擬位址範圍從 0x00000000 0xFFFFFFFF 供其使用。這個,上方的 2 GB 位址範圍從 0x8000000 0xFFFFFFFF 是通用於所有在系統中執行的處理程序並它稱為核心或系統的地址空間]。較低的區域範圍從 0x00000000 0x7FFFFFFF 稱為使用者位址空間。

處理程序觀點虛擬位址的每個項目在概念上參考到的實體記憶體位元組。它有責任的虛擬記憶體管理員 (VMM) 和處理器記憶體管理單位 (MMU) 轉換或對應到相對應的實體位址的每一個虛擬位址一起。VMM 執行對應相除 RAM 成固定大小頁面框架建立頁面資料表來儲存這些頁面] 框架的相關資訊和對應它們。每一個 PTE 代表一個頁面框架,且包含 VMM 找不到一頁所需的資訊。

在 x x86 型系統上,使用 4 KB 分頁大小,對應 2 GB 位址空間所需的 PTE 最大數目會是 524,288 (2 GB/4 KB)。在典型系統上此空間用,如下所示:
  • 最大為 50,000 PTE (大約 195 MB 位址空間) 會保留供一般用途使用。
  • 其餘部分用於對應系統快取、 超空間、 分頁集區、 未分頁集區、 損毀傾印區域等等。
這個 PTE 集區的大小自動決定在系統啟動系統中根據實體記憶體數量。這個集區會夾在分頁集區和也會隨著以及系統中的實體記憶體數量的未分頁集區之間。

系統會使用這些 PTE 建立核心執行緒堆疊、 載入裝置驅動程式 (與他們 DLL),來對應系統虛擬位址空間的 I/O 傳輸或呼叫端的 MmMapIoSpace/MmMapLockedPages/MmGetSystemAddressForMdl/MmAllocateNonCachedMemory,以及其他雜項用途。這個系統 PTE 集區可以會變得大量使用,而嚴重分散。這表示您的驅動程式可能無法從系統 PTE 集區取得連續的虛擬位址空間不足,無法在任何時候即使總地址中它仍然剩餘的空間可能不夠大。

這也表示如果您的驅動程式完全使用系統 PTE 集區,系統的其他部分會降級,甚至結果中不被建立的執行緒,系統停車格和完全 Bug 檢查 (因為某些驅動程式會呼叫配置-系統記憶體以 MustSucceed 參數集)。

您必須非常小心,使用此集區僅對應時。使用配接器您真正需要系統的 RAM 部份從任何處理序] 內容來存取,並將對應只量您需要的。如果您不真正需要存取它所有的系統模式,再對應整個配接器範圍。

重要: Unmap 記憶體,只要在右邊的處理序內容中完成。否則,系統用完 PTE,它將 Bug 核取。您可以增加預設數目的 PTE 計算基礎上總系統記憶體-最大值為藉由新增數字 (等於 [增加的 [頁數]) 到在登錄:
   HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager
   \Memory Management\SystemPages
				
您可以也監視目前可用 「 可用系統分頁表項目 」 使用 「 效能監視器。

注意: 介面卡的記憶體頁面不會用於頁面取代。它們都對應到處理序的位址空間的即使程序是閒置或出完全交換。

以下是兩個最常用的方式,來對應介面卡的記憶體。第一個方法會將記憶體對應直接將處理序的使用者-空間和第二個方法對應到處理序的系統空間,並選擇性地到使用者空間。這兩種方法需要實體的記憶體是連續的。 因為的 PTE 的限制您可能無法對應大量的記憶體系統空間中。但是,您可能可以對應到使用者空間,如果它不是分散,或用完。

區段物件方法

在 Windows NT 4.0 DDK (可透過 MSDN 專業成員資格] 中取得) 會顯示如何執行這項對應中沒有範例 (MAPMEM)。以下是項技巧的大綱:

  1. 取得已翻譯的實體位址的介面卡記憶體 (HalTranslateBusAddress)。
  2. 開啟一個區段控點 (ZwOpenSection),以實體記憶體裝置 \Device\PhysicalMemory。
  3. 參考物件控制代碼 (ObReferenceObjectByHandle) 防止被刪除。
  4. 對應記憶體 (ZwMapViewOfSection)。
您從 [ZwMapViewOfSection 取得的虛擬位址才會對應程序的內容中有效。如果您想要存取您的驅動程式延緩的程序呼叫 (DPC) 中的記憶體或插斷服務常式 (ISR) 執行在任意程序的內容中,您也應該對應系統位址空間 (使用下一個方法) 中的記憶體。unmap 中相同記憶體 ZwUnMapViewOfSection 之前它對應的處理序內容結束。

注意: 在一般,它可以是危險使用 ZwMapViewOfSection 使用 \Device\PhysicalMemory,除非您已經擁有實體的頁面。 頁面不屬於它幾乎永遠原因記憶體損毀因為擁有者可以變更頁面的屬性會將對應的驅動程式釋放這些網頁,並進行其他變更。 磁碟機應對應只屬於其本身之記憶體。此外,是嚴格不合法實體位址同時有兩個不同的屬性對應 (快也就是取對 noncached 的對 writecombined)。 這麼做會造成處理器 TLB 損毀和無法預期的結果。

上 WindowsXP,ZwMapViewOfSection 函式會傳回 STATUS_CONFLICTING_ADDRESSES 錯誤,如果驅動程式嘗試同時具有衝突的屬性相同的實體位址對應。

MmMapIoSpace 方法

這個方法會顯示如何對應在處理序系統位址空間和處理序使用者位址空間中的記憶體。
  1. 取得介面卡的記憶體 (HalTranslateBusAddress) 已翻譯的實體位址。
  2. 對應記憶體到未分頁的系統位址空間,如下所示:
          SystemVirtualAddress = MmMapIoSpace(PhysicalAddress, SizeofMemory,
             CacheEnable);
    					
  3. 配置一個 Mdl:
          Mdl = IoAllocateMdl(SystemVirtualAddress, SizeOfMemory, FALSE, FALSE,
             NULL);
  4. 建置來描述記憶體分頁 MDL:
          MmBuildMdlForNonPagedPool(Mdl);
  5. 對應到處理程序的記憶體的使用者空間使用 MmMapLockedPages。 因為之間 pre SP4 和張貼 SP4 發行版本的 Windows NT 這個函式的傳回值中有不一致,使用下列陳述式讓這個程式碼與所有版本的 Windows NT 相容:
          UserVirtualAddress = (PVOID)(((ULONG)PAGE_ALIGN(MmMapLockedPages(Mdl,
             Mode))) + MmGetMdlByteOffset(Mdl));
    					
如需詳細資訊按一下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項:
199311資訊: MmMapLockedPages 傳回實際的虛擬位址中 SP4
這個方法的優點是您取得可用於任何處理程序的內容 (例如 DPC 和 ISR) 的 SystemVirtualAddress 及可由使用者模式應用程式在其內容中對應的 UserVirtualAddress。

如果您將對應到系統位址空間您應該 unmap,如下所示:
MmUnmapIoSpace(SystemVirtualAddress, SizeofMemory);
				
如果您將對應到使用者位址空間您應該 unmap,如下所示在處理程序對應之記憶體的內容中執行時只:
MmUnmapLockedPages(UserVirtualAddress, Mdl); 

Finally, free the MDL by calling:

IoFreeMdl(Mdl);
				

?考

如需詳細資訊,請參閱 Windows NT 4.0 DDK 說明文件或 」 內部 Windows NT 「 由 Helen Custer (Microsoft 按 1993)。

屬性

文章編號: 189327 - 上次校閱: 2005年3月7日 - 版次: 1.2
這篇文章中的資訊適用於:
  • Microsoft Win32 Device Driver Kit for Windows NT 4.0
關鍵字:?
kbmt kbhowto kbkmode KB189327 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:189327
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。
依現狀不再更新的知識庫內容免責聲明
本文旨在說明 Microsoft 不再提供支援的產品。因此,本文係依「現狀」提供,不會再更新。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com