<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
依據(jù)本人日前提交的《ISA服務(wù)異常診斷思路與步驟》中描述的診斷思路,今天連同客戶方工程師對ISA故障進行了再次調(diào)試。時間為10點至18點。
今天計劃如下調(diào)試工作:
1. 繼續(xù)進行數(shù)據(jù)包分析、采用更加專業(yè)的網(wǎng)絡(luò)分析工具及數(shù)據(jù)包分析軟件、檢測在ISA通信過程中是否存在異常信源、特殊結(jié)構(gòu)數(shù)據(jù)包、攻擊攜帶的淹沒數(shù)據(jù)報、重點對PSP軟件采用的協(xié)議與信令進行元數(shù)據(jù)分析,考量以上內(nèi)容中可能出現(xiàn)的對ISA服務(wù)失敗的誘因。
2. 再次對之前診斷過程中存在疑慮的問題進行剖析、對Cache、DNS、防火墻系統(tǒng)策略與用戶策略的一致性問題、ISA內(nèi)核dump參數(shù)進行確認。
3. 確認SYN攻擊是否是造成ISA服務(wù)失敗的主要原因。
4.
以上步驟如不湊效、重新安裝Windows、重新部署ISA并導入原有配置及策略。
實際調(diào)試進展
1. 今天上網(wǎng)用戶為5用戶、會話數(shù)為175個、經(jīng)過對數(shù)據(jù)包抓包、分析
采用wireshark1.0.1軟件進行數(shù)據(jù)包分析、在進行數(shù)據(jù)包分析過程中、系統(tǒng)再次失敗,數(shù)據(jù)包分析中發(fā)現(xiàn)ISA通訊中存在大量的WinSocket請求、其中這些請求中AFD數(shù)據(jù)塊大量重復產(chǎn)生、查看每個會話中數(shù)據(jù)報文內(nèi)容、我們可以分析到存在以下問題:
l WinSocket請求較多、雖然Socket鏈接本身是正常的,但是問題出在,許多Socket連接在會話結(jié)束后,該連接占用的系統(tǒng)資源沒有被正常釋放掉、由于Socket連接會消耗操作系統(tǒng)的核心轉(zhuǎn)儲資源,如非分頁文件池、windows核心態(tài)系統(tǒng)緩存、windows用戶態(tài)系統(tǒng)緩存、上位內(nèi)存區(qū)域等重要資源,因此此請求需要進一步分析連接請求的釋放存在哪些異常。
l TCP半連接數(shù)非常多、這些半連接數(shù)在整個網(wǎng)絡(luò)當中有相當一部分是由05016用戶發(fā)出的,經(jīng)過查看ISA日志、由迅雷進程引起。通過分析迅雷的原理、迅雷軟件本身具備P2P性質(zhì)、而且每個迅雷的版本采用的P2P方式都有不同、有的采用隨機端口、有的采用高位端口、有的走UDP協(xié)議、有的走HTTP的80端口、因此對于迅雷不宜采用ISA策略的限制方式,而應該考慮限制迅雷進程的帶寬與流量。
l 分析部分數(shù)據(jù)包、數(shù)據(jù)包內(nèi)容中有異常數(shù)據(jù),在一個數(shù)據(jù)會話中,我們可以看到
0000140000001D4669FF866BD7E17338.......Fi..k..s8
7E086870F25CA3CB7F56140000005000~.hp./...V....P.
00001000000030304530344342363332......00E04CB632
3030352E6578650F0000003232312E32005.exe....221.2
33392E3137302E31313600050C00000F39.170.116......
0000003232312E3233392E3137302E31...221.239.170.1
3136520000001000000030303044383716R.......000D87
354434454638303030300F000000473A5D4EF80000....G:
003232312E3233332E3231382E313738.221.233.218.178
00050C00000F0000003232312E323333.........221.233
2E3231382E3137385500000010000000.218.178U.......
3030443046383341373932463030303000D0F83A792F0000
73662E6578650F0000003231392E3132sf.exe....219.12
382E3230352E31333800050C00000F008.205.138.......
00003231392E3132382E3230352E3133..219.128.205.13
384E00000010000000303030433736308N.......000C760
存在多個數(shù)據(jù)轉(zhuǎn)發(fā)源、進一步分析還是迅雷的問題,看來要防止如何將這種不斷增長的源控制在一個正常的非分頁文件池大小內(nèi)才是關(guān)鍵。
2. 非分頁文件池問題
非分頁文件池是操作系統(tǒng)中內(nèi)存管理的非常重要的一部分。其管理機制如下:
Windows2000/XP內(nèi)存管理器位于Ntoskrnl.exe文件中,硬件抽象層中沒有內(nèi)存管理器的任何部分。
內(nèi)存管理器是完全可重入的,支持多進程并發(fā)執(zhí)行。
內(nèi)存管理器組成部分:
1) 一組執(zhí)行體系統(tǒng)服務(wù)程序:用于虛擬內(nèi)存的分配、回收和管理。
2) 一個轉(zhuǎn)換無效和訪問錯誤陷阱處理程序:用于解決硬件檢測到的內(nèi)存管理異常,并代表進程將虛擬頁面裝入內(nèi)存。
3) 運行在六個不同的核心態(tài)系統(tǒng)線程上下文中的幾個關(guān)鍵組件:
——工作集管理器:優(yōu)先級16,每秒鐘被平衡集管理器(一個內(nèi)核創(chuàng)建的系統(tǒng)線程)調(diào)用一次。
——進程/堆棧交換程序:優(yōu)先級23,完成進程和內(nèi)核線程堆棧的換入和換出操作。
——已修改頁面寫入器:優(yōu)先級17,將修改鏈表上的臟頁寫回到適當?shù)捻撐募?
——映射頁面寫入器:優(yōu)先級17,將映射文件中臟頁寫回磁盤。
——廢棄段線程:優(yōu)先級18,負責系統(tǒng)高速緩存和頁面文件的擴大和縮小。
——零頁線程:優(yōu)先級0,將空閑鏈表中的頁面清零。
地址空間的布局:
Win32環(huán)境下,32位的地址空間轉(zhuǎn)化為4GB的虛擬內(nèi)存。默認情況下,將一半(2GB)分配給用戶進程,另一半(2GB)分配給操作系統(tǒng)。
Windows2000/XPAdvancedServer版本和Windows2000/XPDataCenter版本支持一個引導選項(Boot.ini中通過/3GB標識激活),允許用戶擁有3GB地址空間,留1GB給操作系統(tǒng)。
對于要訪問整個3GB地址空間的進程,進程映像文件必須在映像頭設(shè)置IMAGE-FILE-LARGE-ADDRESS-AWARE標識,否則系統(tǒng)將保留第3個GB的地址空間。可以通過指定鏈接標識/LARGEADDRESSAWARE來設(shè)置該標識。如果與此鏈接程序開關(guān)相鏈接,則可以使用3GB用戶方式地址空間。
2GBWindows2000/XP用戶地址空間分布
——NULL指針分配的分區(qū):0x0~0xFFFF
——進程私有地址空間:0x10000~0x7FFEFFFF
——64KB拒絕訪問區(qū)域:0x7FFF0000~0x7FFFFFFF,阻止線程跨過用戶/系統(tǒng)邊界傳送緩沖區(qū)。
Windows2000/XP用戶地址空間系統(tǒng)變量
——MmHighestUserAddress:描述最高用戶地址(對于x862GB用戶空間為0x7FFEFFFF)
——MmUserProbeAddress:描述最高用戶地址+1
性能計數(shù)器:Windows2000/XP中可利用性能計數(shù)器得到系統(tǒng)虛擬內(nèi)存的使用信息,和單個進程地址空間的使用情況。
x86系統(tǒng)地址空間分布
——0x80000000~0x9FFFFFFF:引導系統(tǒng)(Ntoskrnl.exe和Hal.dll)和非分頁緩沖池初始部分的系統(tǒng)代碼。
——0xA0000000~0xA3FFFFFF:系統(tǒng)映射視圖(如Win32k.sys)或者會話空間。
——0xA4000000~0xBFFFFFFF:附加系統(tǒng)頁表項(PTE)或附加系統(tǒng)高速緩存。
——0xC0000000~0xC03FFFFF:進程頁表和頁目錄,描述虛擬地址映射的結(jié)構(gòu)。
——0xC0400000~0xC07FFFFF:超空間和進程工作集列表。
——0xC0800000~0xC0BFFFFF:未使用區(qū)域,不可訪問。
——0xC0C00000~0xC0FFFFFF:系統(tǒng)工作集鏈表,描述系統(tǒng)工作集的工作集鏈表數(shù)據(jù)結(jié)構(gòu)。
——0xC1000000~0xE0FFFFFF:系統(tǒng)高速緩存,用來映射在系統(tǒng)高速緩存中打開的文件的虛擬空間。
——0xE1000000~0xEAFFFFFF:分頁緩沖池,可分頁系統(tǒng)內(nèi)存堆。
——0xEB000000~0xFFBDFFFF:系統(tǒng)頁表項和非分頁緩沖池。
——0xFFBE0000~0xFFFFFFFF:系統(tǒng)性故障轉(zhuǎn)儲信息和硬件抽象層(HAL)使用區(qū)域。
會話空間:用來映射一個用戶的會話信息。
——進程創(chuàng)建時,會將會話空間映射到屬于該進程會話的頁面。
——會話是由進程和其他系統(tǒng)對象組成,每個會話有私有的GUI數(shù)據(jù)結(jié)構(gòu),以及Win32子系統(tǒng)進程(Csrss.exe)和登錄進程(Winlogon.exe)的拷貝。
——會話管理器進程(Smss.exe)負責創(chuàng)建新的會話。
地址轉(zhuǎn)換機制
用戶應用程序以32位虛擬地址方式編址,每個虛擬地址與一個稱作“頁表項”(PTE)的結(jié)構(gòu)有關(guān),它包含了虛擬地址映射的物理地址。
1. 虛擬地址變換
x86系統(tǒng)利用二級頁表結(jié)構(gòu)實現(xiàn)虛擬地址向物理地址的變換。
x86系統(tǒng)中,32位虛擬地址分成三個部分:頁目錄索引(10bit)、頁表索引(10bit)、字節(jié)索引(12bit)。
虛擬地址變換的基本步驟:
——內(nèi)存管理的硬件設(shè)備定位當前進程的頁目錄;
——頁目錄索引指出頁目錄項在頁目錄中的位置,頁目錄項中的頁框號描述了映射虛擬地址所需頁表的位置;
——頁表索引指出頁表項在頁表中的位置,頁表項描述了虛擬頁面在物理內(nèi)存的位置;
——當頁表項指向的頁面有效時,字節(jié)索引指明物理頁內(nèi)所需數(shù)據(jù)的地址;若所指頁面無效,則交由內(nèi)存管理器的故障處理程序處理。
2. 頁目錄
每個進程都有一個單獨的頁目錄,用來映射進程所有頁表的位置,其物理地址被保存在核心進程(KPROCESS)塊中。
進程切換時,操作系統(tǒng)設(shè)置一個專用的CPU寄存器來通知硬件設(shè)備新進程頁目錄所在地址。
頁目錄是由頁目錄項(PDE)組成,每個頁目錄項4字節(jié)。x86中,描述4GB虛擬地址空間需要1024張頁表,因此頁目錄索引10位。
3. 進程頁表與系統(tǒng)頁表
進程頁表是每個進程私有的,而系統(tǒng)頁表被所有進程共享。
當進程創(chuàng)建時,系統(tǒng)空間的頁目錄項初始化為指向現(xiàn)存的系統(tǒng)頁表,但各個進程的系統(tǒng)空間不完全相同。當系統(tǒng)頁表更新時,內(nèi)存管理器不會立刻更新所有進程頁目錄,而是當進程訪問新的虛擬地址時才更新進程頁目錄。
性能監(jiān)視器中的空閑系統(tǒng)頁表項計數(shù)器表示了可用系統(tǒng)頁表項的數(shù)目,也可在HKLM/SYSTEM/CurrentControlSet/Control/SessionManager/MemoryManagement/SystemPages中設(shè)置需要的頁表項數(shù)量。
4. 頁表項
有效的頁表項有兩個主要的域:
(1)包含數(shù)據(jù)的物理頁面的頁框號,或內(nèi)存中某頁面的物理地址的頁框號;
(2)一些描述頁的狀態(tài)和保護限制的標志位。
——訪問位:某頁首次被讀寫時,置為“1”
——修改位:某頁首次被寫時,置為“1”
——寫位:為0時,對應頁只讀,為1時,對應頁可讀寫
——多處理器的x86系統(tǒng)中,有個附加的由軟件實現(xiàn)的寫位,用來表示某頁已經(jīng)被一個運行在多個處理器上的線程寫入。
x86中(非PAE系統(tǒng)),映射4GB地址空間需要1024張頁表,每個頁表含1024個頁表項,每個頁表項4字節(jié),因此頁表索引為10bit。
5. 快表TLB
x86提供了關(guān)聯(lián)存儲器數(shù)組形式的高速緩存,稱為快表。它是一個向量,其存儲單元能被同時讀取并與目標值比較。
快表中每個項的標志符部分保存了虛擬地址的一部分,數(shù)據(jù)部分保存了物理頁號及對應頁的保護類型和狀態(tài)。
將常用的虛擬地址記錄在快表項中,減少了對內(nèi)存的訪問,加快了虛擬地址到物理地址的變換。
如果一個虛擬地址不在快表中,它可能仍在內(nèi)存中,需要對內(nèi)存多次訪問來找到它。當一個頁表項由無效變?yōu)橛行r,內(nèi)存管理器會調(diào)用內(nèi)核例程將新頁表項裝入快表,x86中,裝入快表不需要軟件干預。
首先介紹兩個與內(nèi)存分配相關(guān)的數(shù)據(jù)結(jié)構(gòu)(虛擬地址描述符和區(qū)域?qū)ο螅缓蠼榻B三種管理應用程序內(nèi)存的方法。
1. 虛擬地址描述符
虛擬地址描述符(VAD)用來描述哪些虛擬地址已經(jīng)在進程地址空間中被保留。對個進程,內(nèi)存管理器都維持一棵虛擬地址描述信息樹,用來描述進程地址空間狀態(tài)。
當進程保留地址空間,或映射一個內(nèi)存區(qū)域時,就創(chuàng)建一個VAD來保存分配請求所提供的信息。當線程首次訪問一個地址時,需找到一個包含被訪問地址的VAD,利用所得信息填充頁表項。
2. 區(qū)域?qū)ο?
區(qū)域?qū)ο笤赪in32中也稱文件映射對象,表示可以被兩個或多個進程共享的內(nèi)存塊,也可被映射到頁文件或外存文件。
主要作用
——將可執(zhí)行映像裝入內(nèi)存
——訪問高速緩存文件中的數(shù)據(jù)
——將文件映射到進程地址空間,不必進行文件I/O
每個打開文件都有一個單獨的區(qū)域?qū)ο笾羔樈Y(jié)構(gòu),由三個32位指針組成:指向數(shù)據(jù)控制區(qū)域的指針、指向共享的高速緩存映射的指針、指向映像控制區(qū)域的指針。
CreatFileMapping函數(shù)可以創(chuàng)建區(qū)域?qū)ο螅籓penFileMapping打開有名字的區(qū)域;可通過句柄繼承或句柄復制訪問區(qū)域?qū)ο螅辉O(shè)備驅(qū)動程序可使用ZwOpenSection,ZwMapViewOfSection,ZwUnmapOfSection函數(shù)操縱區(qū)域?qū)ο蟆?
3. 以頁為單位的虛擬內(nèi)存分配方式
適合于大型對象或結(jié)構(gòu)數(shù)組
進程地址空間的頁面有三種狀態(tài):空閑、被保留、被提交;保留和提交功能是通過Win32VirtualAlloc和VirtualAllocEx函數(shù)實現(xiàn)的。
應用程序可以同時進行保留和提交,也可以先保留地址空間,當需要時再向地址空間提交物理頁面,這樣可以減少內(nèi)存的使用。
VirtualFree或VirtualFreeEx函數(shù)用來回收頁面或釋放地址空間。回收的內(nèi)存仍然被保留,而釋放的內(nèi)存是空閑的。
4. 內(nèi)存映射文件
適合于大型數(shù)據(jù)流文件以及多個進程之間的數(shù)據(jù)共享
內(nèi)存映射文件用來保留一個地址區(qū)域,并將磁盤文件提交給該區(qū)域,用于3個目的
——加載和執(zhí)行.exe和.dll文件,可節(jié)省應用程序啟動所需時間
——訪問磁盤數(shù)據(jù)文件,減少文件I/O
——實現(xiàn)多個進程間的數(shù)據(jù)共享
利用區(qū)域?qū)ο髮崿F(xiàn)這些功能,因為區(qū)域?qū)ο罂梢枣溄拥酱蜷_的磁盤文件(映射文件),或已提交的內(nèi)存(提供共享內(nèi)存)。
進程要訪問非常大的區(qū)域?qū)ο螅梢酝ㄟ^調(diào)用MapViewOfFile函數(shù)映射區(qū)域?qū)ο蟮囊徊糠郑▍^(qū)域視圖),并指定映射范圍。
5. 堆功能
內(nèi)存堆的應用程序內(nèi)存管理方法適合于大量的小型內(nèi)存申請
堆是保留的地址空間中一個或多個頁組成的區(qū)域,可由堆管理器進一步劃分和分配
堆管理器用來分配和回收可變內(nèi)存,其函數(shù)位于Ntdll.dll和Ntoskrnl.exe中。
進程啟動時有一個缺省堆,通常為1MB,它在進程生命周期中不能被釋放;而HeapCreat函數(shù)創(chuàng)建的私有堆可以用HeapDestroy來釋放。
從缺省堆中分配內(nèi)存時,先調(diào)用GetProcessHeap函數(shù)得到句柄,再調(diào)用HeapAlloc和HeapFree來分配和回收內(nèi)存塊。
系統(tǒng)初始化時,創(chuàng)建了兩種動態(tài)大小的內(nèi)存緩沖池來分配系統(tǒng)內(nèi)存,ExAllocatePool函數(shù)可從緩沖池中分配和回收內(nèi)存:
——非分頁緩沖池:由長駐物理內(nèi)存的系統(tǒng)虛擬地址區(qū)域組成。
——分頁緩沖池:系統(tǒng)空間中可以被分頁和換出的虛擬內(nèi)存區(qū)域。
兩種非分頁緩沖池:一般情況下使用;4頁緩沖池在非分頁緩沖池已漫且不允許分配失敗時使用。
分頁緩沖池:單處理器系統(tǒng)3個,多處理器系統(tǒng)5個
分頁/非分頁緩沖池初始大小依賴于系統(tǒng)物理內(nèi)存大小,可設(shè)置HKLM/SYSTEM/CurrentControlSet/Control/SessionManager/MemoryManagement的NonpagedPoolSize和PagedPoolSize值改變緩沖池大小。
快速內(nèi)存分配機制——后備鏈表:僅包含固定長度的塊,因此不必查找適合分配大小的空閑內(nèi)存。
若后備鏈表為空時,必須從分頁或非分頁緩沖池中進行分配。可使用ExInitializeNpagedLookasideList和ExInitializePagedLookasideList函數(shù)按照頻繁分配的數(shù)據(jù)結(jié)構(gòu)大小創(chuàng)建后備鏈表。
對無效頁面的一次訪問稱為缺頁錯誤,由內(nèi)存管理故障處理程序解決。
1. 四個基本類型的無效頁表項
頁文件:所需頁沒有駐留在內(nèi)存,而是駐留在頁文件中,并引發(fā)頁面調(diào)入操作。
請求零頁:所需頁是零頁面,此時會給進程工作集添加一個由零初始化的頁。
轉(zhuǎn)換:所需頁面在內(nèi)存中的后備鏈表、修改鏈表或修改尚未寫入鏈表。此時從鏈表中刪除此頁,并添加到工作集。
未知:頁表項為0,或頁表不存在。此時需檢查VAD以確定虛擬地址是否被提交。
2. 一個特例——原型頁表項
區(qū)域?qū)ο蟮谝淮伪粍?chuàng)建時,同時創(chuàng)建原型頁表項,它用于實現(xiàn)頁面共享。
當共享頁面為有效時,進程頁表項和原型頁表項都指向包含數(shù)據(jù)的物理頁。
當共享頁面無效時,進程頁表項指向原型頁表項,而原型頁表項描述被訪問的頁面的狀態(tài)(活動/有效、轉(zhuǎn)換、修改尚未寫入、請求零頁、頁文件、映射文件6種)
3. 頁面調(diào)入I/O
當必須向文件(頁或映射文件)發(fā)出讀操作來解決缺頁問題時,將產(chǎn)生頁面調(diào)入I/O。
頁面調(diào)入I/O操作是同步的,線程會一直等待I/O完成。
當進行調(diào)頁I/O時,進程中的其他線程仍可以同時處理缺頁錯誤,因此在I/O結(jié)束時頁面調(diào)度程序必須識別如下情況:沖突頁錯誤、頁面從虛擬地址空間中被刪除、頁面保護限制發(fā)生變化、原型頁表項引發(fā)錯誤。
4. 沖突頁錯誤
同一進程中的另一線程或另一進程也對正在被調(diào)入的頁面產(chǎn)生缺頁錯誤,稱為沖突頁錯誤。
頁面調(diào)度程序檢測到?jīng)_突頁錯誤時,會對頁框號數(shù)據(jù)庫項中的特定事件發(fā)出等待操作。當I/O完成后,第一個獲得頁框號數(shù)據(jù)庫鎖的線程負責執(zhí)行完成頁面調(diào)入操作。
5. 頁文件
虛擬存儲器在磁盤上的部分稱為頁文件。內(nèi)存=物理內(nèi)存+頁文件。
性能計數(shù)器可以檢查被提交的進程私有內(nèi)存使用情況,但無法確切知道一個進程提交的私有內(nèi)存中有多少常駐內(nèi)存,多少在頁文件中。
Windows2000/XP最多支持16個頁文件。
系統(tǒng)啟動時,會話管理器進程讀取頁文件鏈表,并檢查HKLM/SYSTEM/CurrentControlSet/Control/SessionManager/MemoryManagement/PagingFiles打開頁文件,如果沒有,則創(chuàng)建一個缺省的20MB頁文件。系統(tǒng)運行期間不能刪除打開的頁文件。
系統(tǒng)進程為每個頁文件都維持一個打開的句柄,Ntdll.dll中的NtCreatePagingfile系統(tǒng)服務(wù)程序可增加一個新頁文件。
工作集即在物理內(nèi)存中保持的虛擬頁面的子集,分進程工作集和系統(tǒng)工作集。
1. 頁面調(diào)度策略
取頁策略:內(nèi)存管理器利用請求式頁面調(diào)度算法及簇方式將頁面裝入內(nèi)存。當缺頁中斷時,將出錯頁面和它附近的一些頁面裝入內(nèi)存,這樣可減少讀取外存的次數(shù)。
置頁策略:當線程收到頁錯誤時,內(nèi)存管理器要使用“置頁策略”來確定在物理內(nèi)存中放置虛擬頁面的最佳位置。
如果當頁錯誤發(fā)生時物理內(nèi)存已滿,“置頁策略”要決定哪一個虛擬頁面必須從內(nèi)存中刪去來為新的頁面騰出空間。多處理器系統(tǒng)中,采用局部先進先出(FIFO)策略,而單處理器系統(tǒng)中,采用最近最久未使用(LRU)替換策略。
2. 工作集管理
系統(tǒng)初始時,所有進程缺省的工作集最大最小值相同。有“增大調(diào)度優(yōu)先級”權(quán)限的進程可用SetProcessWorkingSet函數(shù)來更改缺省值,但不能超過內(nèi)核變量MmMaximumWorkingSetSize中的最大值。
當物理內(nèi)存變得很低時,工作集管理器自動修剪工作集,以增加可用空閑內(nèi)存數(shù)量。
有一系列內(nèi)核控制變量描述工作集擴展和修剪,但這些值是確定的,不能被注冊值調(diào)整。
3. 平衡集管理器和交換程序
系統(tǒng)初始化時創(chuàng)建平衡集管理器,用來對工作集進行調(diào)整。工作集管理器也是運行在平衡集管理器線程環(huán)境下的一個例程。
平衡集管理器等待兩個事件對象
——1秒周期計時器到期后產(chǎn)生事件,并經(jīng)歷以下4步
平衡集管理器每被喚醒4次就喚醒交換程序;檢查后備鏈表,必要時調(diào)整其深度;尋找處于CPU饑餓狀態(tài)而需提高其優(yōu)先級的線程;調(diào)用工作集管理器。
——內(nèi)部工作集管理器事件,即工作集需要調(diào)整時
交換程序:即KeSwapProcessOrStack例程,用來尋找一段時間內(nèi)一直處于等待狀態(tài)的線程,將其內(nèi)核堆棧轉(zhuǎn)移以收回物理內(nèi)存。
4. 系統(tǒng)工作集
系統(tǒng)工作集用來管理操作系統(tǒng)中可分頁的代碼和數(shù)據(jù),其中可駐留5種頁面:系統(tǒng)高速緩存頁面;分頁緩沖池;Ntoskrnl.exe中可分頁的代碼和數(shù)據(jù);設(shè)備驅(qū)動程序中可分頁的代碼和數(shù)據(jù);系統(tǒng)映射視圖。
系統(tǒng)工作集最大最小值是在系統(tǒng)初始化時計算的,基于物理內(nèi)存數(shù)量和系統(tǒng)是professional或server。
頁框號數(shù)據(jù)庫用來描述物理內(nèi)存中各頁面的狀態(tài),有效頁表項指向頁框號數(shù)據(jù)庫中的項,頁框號數(shù)據(jù)庫項又指回此頁表。原型頁框號指回原型頁表項。
頁面可處于活動、過渡、后備、修改、修改不寫入、空閑、零初始化和損壞不可用8種狀態(tài),除活動和過渡之外,其余6種組成了鏈表。
1. 動態(tài)頁鏈表
當需要一個零初始化的頁面時,首先訪問零頁鏈表,若為空,則從空閑鏈表中選取一頁并零初始化,若也為空,則從后備鏈表中選取一頁并零初始化。
——零頁鏈表是由零頁線程(優(yōu)先級為0)從空閑鏈表中移過來的,當空閑鏈表中有8個或8個以上頁時激活零頁線程。
當不需要零初始化頁面時,首先訪問空閑鏈表,若為空,則訪問后備鏈表。
當進程放棄一個頁面時,如果頁面未修改過,則加入后備鏈表;如果修改過,則加入修改鏈表。
進程撤銷時,將所有私有頁面加入空閑鏈表。對頁文件支持的區(qū)域最后一次訪問結(jié)束時,頁面加入空閑鏈表。
當修改頁鏈表太大,或零初始化和后備鏈表的大小低于最小值時,喚醒“修改頁面寫回器”線程,將頁面寫回外存,并將頁面移入后備鏈表。
2. 修改頁面寫回器
由兩個系統(tǒng)線程組成,優(yōu)先級都為17
——MiModifiedPageWriter:將修改頁寫回頁文件
——MiMappedPageWriter:將修改頁寫入映射文件
觸發(fā)修改頁面寫回器的事件
——修改頁面數(shù)量大于內(nèi)核變量MmModifiedPageMaximum指定值
——可利用頁數(shù)量小于內(nèi)核變量MmMinimumFreePages指定值
——MiMappedPagesTooOldEvent事件:該事件在預定的數(shù)秒后(缺省為300秒,可用注冊值修改)產(chǎn)生,將映射頁面寫入外存
若頁面寫入外存時正在被另一線程共享,則I/O完成后不會將此頁移入后備鏈表。
3. 頁框號數(shù)據(jù)結(jié)構(gòu)
頁框號數(shù)據(jù)庫項是定長的,不同頁框號類型,包含的域也不同(參見圖4-28)
幾個基本的域
——頁表項地址:指向此頁頁表項的虛擬地址
——訪問計數(shù):對此頁的訪問數(shù)量
——類型:該頁框號表示的頁面狀態(tài)(8種)
——標識:包含修改狀態(tài)、原型頁表項、奇偶校驗錯誤、正在讀取或?qū)懭氲刃畔ⅰ?
——初始頁表項的內(nèi)容
——頁表項的頁框號:指向該頁面頁表項的頁表頁的物理頁號
1. 鎖內(nèi)存
可以通過兩種方式將頁面鎖在內(nèi)存中
——設(shè)備驅(qū)動程序調(diào)用核心態(tài)函數(shù)MmProbeAndLockPages,MmLockPagableCodeSection,mLockPagableDataSection,LockPagableSectionByHandle。解鎖之前鎖定的頁面一直在內(nèi)存中。
——Win32應用程序調(diào)用VirtualLock函數(shù)鎖住工作集中頁面,但不能防止調(diào)頁。
2. 分配粒度
系統(tǒng)按照分配粒度定義的整型邊界對齊每個保留的進程地址空間區(qū)域,系統(tǒng)分配粒度值可通過GetSystemInfo函數(shù)找到,目前為64KB。
保留地址空間時,保證區(qū)域大小是系統(tǒng)頁大小倍數(shù)。
3. 內(nèi)存保護機制
4種基本方式
——所有系統(tǒng)范圍內(nèi)核心態(tài)組件使用的數(shù)據(jù)結(jié)構(gòu)和緩沖池只能在核心態(tài)下訪問,用戶線程不能訪問。
——每個進程有獨立私有的地址空間,其他進程的線程不能訪問。(與其他進程共享頁面或另一進程具有對進程對象的虛擬內(nèi)存讀寫權(quán)限時除外)
——除虛擬到物理地址轉(zhuǎn)換的隱含保護外,還提供一些硬件內(nèi)存保護措施。
——利用共享內(nèi)存區(qū)域?qū)ο蟮拇嫒】刂票恚ˋCL)將對共享內(nèi)存的訪問限制在適當權(quán)限的進程中。
4. 寫時復制
當進程映射區(qū)域?qū)ο蟮膶憰r復制視圖時,內(nèi)存管理器直到頁面修改時才進行復制,而不是在映射視圖的同時,這樣可以節(jié)約物理內(nèi)存。
5. 地址窗口擴充
地址窗口擴充(AWE)函數(shù)集可使進程能夠訪問更多的物理內(nèi)存,步驟如下:
——分配要使用的物理內(nèi)存:AllocateUserPhysicalPages函數(shù)(需鎖內(nèi)存頁面的權(quán)限)
——創(chuàng)建一個虛擬地址空間作為窗口用來映射分配好的物理內(nèi)存:VirtualAlloc函數(shù)和MEM_PHYSICAL標識
——將內(nèi)存映射到窗口:MapUserPhysicalPages或MapUserPhysicalPagesScatter函數(shù)
AWE函數(shù)分配和映射內(nèi)存的限制
——頁面不能在進程間共享
——同一物理頁面不能映射到同一進程的多個虛擬地址上
——頁保護可讀/寫
6. 物理地址擴展
物理地址擴展(PAE)的內(nèi)存映射模式允許訪問64GB物理內(nèi)存。
物理地址擴展模式下,虛擬地址劃分為4個域:頁目錄指針索引(2bit)、頁目錄索引(9bit)、頁表索引(9bit)、頁內(nèi)字節(jié)偏移(12bit)。
物理地址擴展模式之所以能對更大范圍的內(nèi)存編址,是因為頁目錄項和頁表項都由32位擴展到了64位。
我們了解了原理后,通過修改windows的內(nèi)存管理配置可以有效調(diào)節(jié)非分頁文件池的問題。修改方法由于不同的操作系統(tǒng)版本、應用系統(tǒng)、硬件配置(CPU、內(nèi)存)等不一致、因此此問題不具備操作方法的可復制性,需單獨對待。了解原理最重要。建議參考微軟windows開發(fā)實驗室的核心團隊出版的書籍:《深入解析windows操作系統(tǒng)》。
截至到2008年9月22日,經(jīng)過調(diào)試后的ISA01已經(jīng)穩(wěn)定運行了一個星期,沒有出過服務(wù)失敗問題,至此、ISA問題已經(jīng)解決。
經(jīng)驗與總結(jié):
總結(jié)
由于ISA系統(tǒng)封裝了windows的TCP/IP協(xié)議棧、因此,ISA故障會由多個方面引起、網(wǎng)絡(luò)、操作系統(tǒng)、策略、配置、參數(shù)、ISA后臺數(shù)據(jù)庫。所以在進行ISA診斷的時候需要2個必備條件、而這2個必備條件不具備導致了先前許多公司與技術(shù)工程師束手無策。
n 經(jīng)歷ISA服務(wù)失敗的前后、保留現(xiàn)場進行線索收集
n 具備對網(wǎng)絡(luò)、交換機、windows操作系統(tǒng)、IT基礎(chǔ)服務(wù)(DNS、AD、路由)、ISA策略、SQLServer數(shù)據(jù)庫、網(wǎng)絡(luò)安全與攻擊防御、編程水平(WindowsSDK、DDK、T-SQL、C++)的全面掌握。
u 熟悉網(wǎng)絡(luò)、交換機、路由器;這里對應到網(wǎng)絡(luò)性能診斷、需要熟悉網(wǎng)絡(luò)協(xié)議、網(wǎng)絡(luò)服務(wù)工具、設(shè)備調(diào)試。對網(wǎng)絡(luò)造成的ISA故障進行排除。
u 熟悉windows操作系統(tǒng)原理;重點掌握windows內(nèi)存管理、對winsocket封裝熟悉、否則無法發(fā)現(xiàn)此ISA系統(tǒng)的罪魁非分頁文件池錯誤進行鑒別,更加無法修正了。
u 熟悉IT基礎(chǔ)服務(wù)(DNS、AD、router);這里對應到對DNS服務(wù)、AD服務(wù)正常運行,排除由此帶來的ISA問題的嫌疑。
u ISA策略與配置;解決ISA問題、當然要熟悉ISA,ISA原理本身就是網(wǎng)絡(luò)安全范疇、ISA方面的技能就是安裝、配置、策略了,因此這是必備技能。
u SQLServer數(shù)據(jù)庫;由于ISA內(nèi)置的SQLSERVER數(shù)據(jù)庫的精簡版MSDE,MSDE本身也有內(nèi)存、系統(tǒng)緩存等問題需要進行檢查與排除、所以務(wù)必要可以掌握OSQL的命令行使用。
u 網(wǎng)絡(luò)安全與攻擊防御;診斷中發(fā)現(xiàn)有SYN攻擊、如何去減少、一定要對網(wǎng)絡(luò)安全基礎(chǔ)知識有了解、否則也就無法去了解怎么配置改善SYN攻擊。
u 編程水平:
l WindowsSDK:許多命令行工具都存在于WindowsResourceKitTools、WindowsSupportTools、SDK中、而且在上述SYN攻擊代碼中使用了VC++編程的代碼大量調(diào)用了SDK中提供的API
l WindowsDDK:查看非分頁文件池大小務(wù)必使用DebuggingToolsforWindows(x86)、WinDbg,DDK本身是windows的內(nèi)核驅(qū)動編程工具,因此要熟悉DDK命令、C++語言
l T-SQL:MSDE作為ISA后臺數(shù)據(jù)庫使用、在我上次提交的21280錯誤的排錯方法中,使用SQL語言調(diào)整MSDE的性能中使用到。
l C++;SDK/DDK中使用的API都以C++方式提供、而且在我的參考文獻《深入解析windows操作系統(tǒng)》中描述的內(nèi)存管理原理也是用C++語言來描述的,因為原理復雜、所以采用程序原語表述更加容易理解。
系統(tǒng)的診斷是多維度的,不能ISA出了狀況就只關(guān)注ISA,IT系統(tǒng)是一個有機的系統(tǒng)整體、需要多維度的檢查、這樣的思路與結(jié)論才是準確的。
需要依靠多種診斷工具和軟件、但是不能完全依賴軟件報出的結(jié)果。盡量采用微軟原廠的工具來診斷。
原理的分析是最關(guān)鍵的,了解了原理才知道使用什么工具、尋找什么文獻幫助、尋求哪方面的技術(shù)支持。
建議
v 建立完善的ISA監(jiān)控預警機制、逐步把服務(wù)質(zhì)量與ISA性能管理結(jié)合在一起。
v 使用迅雷、電驢等P2P用戶的情況嚴重、這些軟件無法使用策略等手段來禁止、所以需要進行技術(shù)手段與管理手段結(jié)合的方式來進行:技術(shù)手段建議可以在ISA前端部署一套網(wǎng)絡(luò)流量/上網(wǎng)行為管理系統(tǒng)、配合終端的桌面管理系統(tǒng),有效進行IT基礎(chǔ)環(huán)境的專責管理。管理手段建議可以和流程、人員、稽考結(jié)合在ITIL整體來體現(xiàn)、這樣一切結(jié)果都是流程化、統(tǒng)一化、避免了主觀評判與管理因素。
v 購買正版ISA、獲取微軟原廠服務(wù)支持。雖然技術(shù)支持可以尋求武漢本地公司和個人來解決、但是知識庫沒有在客戶方得到沉淀和積累、這樣對于每個類似此次問題無法從項目中得到知識庫建設(shè)的增長、自身IT人員技術(shù)水平也難以得到提升、更談不上有效的績效水平管理。
v ITIL管理不是口頭的,需要有每個子系統(tǒng)都與之接洽的大局觀與思路、從流程、人員、知識庫、服務(wù)監(jiān)督、服務(wù)響應、考核等方面來建設(shè)。我可以安排客戶參觀ITIL與運維做的比較好的成功案例客戶供借鑒參考,如神龍、武鋼、華中電網(wǎng)、東風有限等。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
