文章編號: 188831 - 上次校閱: 2009年10月7日 - 版次: 11.0

如何使用 「 特殊集區 」 功能來隔離集區的傷害

系統提示本文適用於您使用的作業系統之外的作業系統。與您不相關的文章內容已停用。
全部展開 | 全部摺疊

結論

集區損毀可能導致許多最 evasive 問題與 Windows NT 傷害因為當核心模式元件將寫入至已配置的集區區以外的記憶體集區。藉由撰寫超過其配置的區域範圍的記憶體,很有可能的另一個區域配置可能是由另一個元件所擁有的記憶體是覆寫。 這個傷害可能完全無關的程式碼部分會造成問題,例如藍色畫面。讀取超出其配置區域的核心模式元件也可能會造成問題。

它由原始設備製造商 (OEM) 驅動程式或 Windows 中的問題所造成,是否集區損毀問題都是最難識別部份。通常,都可以看到變損毀傾印分析中如資料區域實際問題的徵狀得完全無關的程式碼區塊中的損毀,並造成問題。 直到現在,程式幾乎不可能找到損害記憶體的程式碼區段。

集區傷害的來源可以現在識別於指令導致資料庫損毀。新的記憶體管理公用程式,名為特殊的集區是隨附於 Windows NT 4.0 服務套件 4 (SP4)、 Windows 2000、 Windows XP,Windows Server 2003,Windows Vista 及 Windows Server 2008。「 特殊集區 」 公用程式識別損害藉由撰寫其配置區域以外的記憶體集區資料的核心模式元件。

附註不適用於 Windows Vista 及 Windows Server 2008 記憶體微調。但是 「 特殊集區 」 功能不會套用這些產品。

其他相關資訊

重要這個區段、 方法或任務包含告訴您如何修改登錄的步驟。然而,如果您不當修改登錄,可能會發生嚴重的問題。因此,執行這些步驟時請務必小心。為加強保護,修改登錄之前,請務必將它備份起來。以後您就可以在發生問題時還原登錄。如需有關如何備份和還原登錄的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
322756? (http://support.microsoft.com/kb/322756/ ) 如何備份和還原在 Windows 登錄


「 特殊集區 」 公用程式會透過符合下列準則的 ExAllocatePoolWithTag 要求每個集區配置的配置虛擬記憶體的兩個的頁面:
  • 配置要求必須是針對大小小於最大集區頁面將符合的配置。
  • 要求必須符合 PoolTag 規格在登錄中。
集區滿溢偵測的第一頁用來包含結尾的頁面配置。第二個頁面是守衛頁。集區不足偵測第一頁是守衛頁面。之後是包含頁面的起始配置的網頁。

滿溢偵測是最可能在常使用。滿溢偵測的要求的配置會先位於第一頁的末端,藉由從頁面結尾備份要求大小。配置大小接近於 8 位元組界限。在第一頁的第一個八個位元組的標頭寫入模式的索引鍵]、 [大小] 和 [集區標籤資訊。此模式也傳播整個頁面。因為最接近的 8 位元組界限上的位置配置,可能會多達 7 個 slop 位元組之後的配置。模式也會寫入至 slop 位元組之後的配置。

第二個頁面是守衛頁。守衛頁面標有無存取保護一個特殊分頁表項目 (PTE) 所組成。標示有無存取保護這第二頁,嘗試讀取或立即寫入第一頁結尾之外的任何程式碼會造成停止 0x0000000A 或 Stop 0x0000001E 錯誤會導致發生存取違規。 這可讓某人偵錯系統來找出確切會導致資料庫損毀的指令。

為備份檢查,以攔截撰寫配置結尾之外,但不是超過頁面結尾的 violators,可用集區要求期間驗證 slop 位元組配置的結尾 (ExFreePoolWithTag)。slop 位元組被比較中配置標頭,以判斷是否任何項目覆寫在 slop 位元組區域樣式。 如果仍無法運作驗證] 核取,發生停止 0x00000001A 錯誤。

這項檢查會找不一定是到確切會導致資料庫損毀的程式碼區塊。不過,它可以協助識別造成損害的元件。

若要以便 「 特殊集區 」 公用程式將下列機碼和值加入登錄中:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management


數值名稱: PoolTag
資料類型: REG_DWORD
資料: 集區標籤遮罩 | 配置大小遮罩 | 0
集區標籤遮罩是集區標記識別包含要在特殊集區中放置在集區的遮罩字元。這個遮罩必須以相反順序指定十六進位。也可能會包含這個遮罩 」 嗎? 」 到遮罩的單一字元或"*"從這裡標記的結尾的遮罩。 若,例如要監視所有的集區使用以 NT"開頭的集區標籤,指定 2A744E"(不含引號),用來表示"* tN 」。

下列表格列出多個範例。
   Pool to monitor   Character representation   Pool tag mask
   ----------------------------------------------------------               
   All pools         "*"                        0x2A
   N??s              "s??N"                     0x733F3F4E
				
配置大小遮罩規格會將所有的集區配置指定大小的放入特殊的集區。這也是以十六進位方式指定。 比方說如果的 32 個位元組的所有配置都放置在特殊集區,指定 0x20。

指定零 (0x0) 時 「 特殊集區 」 公用程式 」 未初始化。在另外 「 特殊集區 」 公用程式 」 未初始化如果 PoolTag 登錄值未定義在登錄中。
數值名稱: PoolTagOverruns
資料類型: REG_DWORD
資料: 1 | 0
1 表示之指定標記偵測到集區配置滿溢。配置是頁面結尾處,守衛頁面後面。

0 表示之標記偵測到集區配置不足。配置是位於頁起始處,守衛頁面是來自包含配置頁之前。

若要建立這些兩個登錄機碼的常見使用範例是,如下所示:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\ Memory Management


數值名稱: PoolTag
資料類型: REG_DWORD
資料: 0x2A

數值名稱: PoolTagOverruns
資料類型: REG_DWORD
資料: 1


附註Windows NT 「 終端機伺服器 4.0 您必須停用 KStackPool 當您使用特殊的集區。若要執行此動作要將新增下列登錄值:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management


數值名稱: EnableKStackPool
資料類型: REG_DWORD
資料: 0

1-一律啟用 KStack 集區
2-KStack 集區啟用電腦有 256 MB 或更多的記憶體 (預設)
如果您不要有 256 MB 或更多的記憶體的終端機伺服器電腦上進行這項變更,可能會收到 「 STOP 0x00000078 (PHASE0_EXCEPTION) 」 錯誤訊息。


附註如果沒有足夠的特殊分頁表項目 (PTE),「 特殊集區 」 功能可能不適用於 Windows Server 2003。在單一使用者終端機伺服器,包含多個 1 GB 的 RAM 及有記憶體管理微調的值設為預設值的電腦上通常會發生這個問題。在 64 位元版本的 Windows Server 2003 中,不會發生這個問題。

此問題的記憶體傾印檔案分析可能會包含下列資訊:
*** Virtual Memory Usage *** 
Physical Memory: 1015660 ( 4062640 Kb) 
Page File: \??\C:\Pagefile1\pagefile.sys 
Current: 4193280Kb Free Space: 4180856Kb 
Minimum: 4193280Kb Maximum: 4193280Kb 
Available Pages: 552680 ( 2210720 Kb) 
ResAvail Pages: 932179 ( 3728716 Kb) 
Locked IO Pages: 347 ( 1388 Kb) 
Free System PTEs: 187166 ( 748664 Kb) 
Free NP PTEs: 32765 ( 131060 Kb) 
Free Special NP: 117228 ( 468912 Kb) 
Modified Pages: 106 ( 424 Kb) 
Modified PF Pages: 98 ( 392 Kb) 
NonPagedPool Usage: 6599 ( 26396 Kb) 
NonPagedPool Max: 65536 ( 262144 Kb) 
PagedPool 0 Usage: 10697 ( 42788 Kb) 
PagedPool 1 Usage: 1240 ( 4960 Kb) 
PagedPool 2 Usage: 1239 ( 4956 Kb) 
PagedPool 3 Usage: 1265 ( 5060 Kb) 
PagedPool 4 Usage: 1231 ( 4924 Kb) 
PagedPool Usage: 15672 ( 62688 Kb) 
PagedPool Maximum: 90112 ( 360448 Kb) 
Shared Commit: 3866 ( 15464 Kb) 
Special Pool: 511 ( 2044 Kb) <-- very small
Shared Process: 5205 ( 20820 Kb) 
PagedPool Commit: 15672 ( 62688 Kb) 
Driver Commit: 2091 ( 8364 Kb) 
Committed pages: 439832 ( 1759328 Kb) 
Commit limit: 2023823 ( 8095292 Kb)

0: kd> dd nt!MmSpecialPoolRejected l8 
8057afe0 00000000 00000000 00b2e59a 00000000 <-- A DWORD value of 3 causes special pool PTE's shortage.
8057aff0 00000000 00000000 00000000 00000000

8057afd8 nt!MiSpecialPoolFirstPte = 0xc022af78
8057afd4 nt!MiSpecialPoolLastPte = 0xc022af78
您可以從分析配置 「 特殊集區大小,以確認問題。之所以在這種情況下發生這個問題,是因為下列特殊集區 PTE 值是相等:
  • MiSpecialPoolFirstPte
  • MiSpecialPoolLastPte
這個問題如果也可能會發生 MmSpecialPoolRejected 登錄項目的值是三個或更大。

若要解決這個問題,設定 PagedPoolSize 登錄項目,為小於所允許的分頁集區大小的值的值。比方說 PagedPoolSize 登錄項目設定為值 256 MB。如果想設定較大的值可用於 「 效能監視器 」 公用程式判斷電腦的需求,針對較大的分頁集區大小。

您可以使用下列值 PagedPoolSize 登錄項目:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management
針對沒有 Service Pack 的 Windows Server 2003:

數值名稱: PagedPoolSize
資料類型: REG_DWORD
資料: 10000000
基底: 十六進位

Windows Server 2003 與服務封包 1 (SP1) 安裝:

數值名稱: PagedPoolSize
資料類型: REG_DWORD
資料: FFFFFFFF
基底: 十六進位

附註之後請任何所述的登錄變更本文中重新啟動電腦,以使變更生效。

如果您啟用 「 特殊集區] 功能之後,電腦停止回應 (擱置),並且在啟動時收到錯誤訊息在藍色畫面上的,使用 [上次的良好設定] 選項來重新啟動電腦。 啟用 「 特殊集區 」 功能是不會寫入到上次已知的良好設定項目直到成功的登入後登錄中。

這篇文章中的資訊適用於:
  • Microsoft Windows Server 2003, Enterprise Edition (32-bit x86)
  • Microsoft Windows Server 2003, Standard Edition (32-bit x86)
  • Microsoft Windows XP Professional
  • Microsoft Windows 2000 Advanced Server
  • Microsoft Windows 2000 Server
  • Microsoft Windows NT Workstation 4.0 Developer Edition
  • Microsoft Windows NT 4.0 Service Pack 4
  • Windows Vista 商用進階版
  • Windows Vista 家用進階版
  • Windows Vista 旗艦版
  • Windows Server 2008 Standard
  • Windows Server 2008 Enterprise
  • Windows Server 2008 Datacenter
關鍵字:?
kbmt kbenv kbhowto kbqfe KB188831 KbMtzh
機器翻譯機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:188831? (http://support.microsoft.com/kb/188831/en-us/ )
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。