Windows操作系統多核CPU內核線程管理方法
Windows 內核親緣性調度原理圖

圖 2 Windows 內核親緣性調度原理圖。
那么控制線程在指定CPU 上運行的突破口就是修改Windows 內核結構體KTHREAD 下的Affinity 域。然而Windows 內核結構被放在虛擬內存線性地址的高2G(不同版本Windows 下也可能是1G)地址空間,用戶模式下的應用程序是無法訪問這段內存空間的,所以必須編寫Windows 驅動程序,來訪問Windows 內核內存空間, 這也是本文將要描述的重點。
3 線程管理服務系統
整個系統的結構如圖3 所示。該系統由兩大部分組成,分別是內核模式下的管理服務系統設備驅動程序,和用戶模式下的管理服務系統應用程序。管理服務系統應用程序通過調用Win32 子系統API,向內核下的管理服務系統驅動程序傳遞IRP,內核收到IRP 后,跟據收到的IRP 的內部信息,執行相應的派遣函數,對相應內存進行讀寫,從而給管理服務系統應用程序提供可用的系統信息。
管理系統總體結構圖

圖3 管理系統總體結構圖。
3.1 內核模式下讀取系統信息
線程管理服務系統驅動程序中,讀取系統信息的方法用到了微軟沒有公開文檔的內核服務函數,ZwQuerySystemInformATIon,這個函數被封裝在ntdll.dll模塊中,通過鏈接ntdll.lib 可得到此函數地址。通過一個枚舉量SystemProcessInformaTIon 來得到進程線程相關信息,填入到第二個輸入參數SYSTEM_PROCESS_INFORMATION結構中, 這樣就獲得了當前系統關于進程線程的信息。
3.2 內核模式下枚舉系統進程線程
SYSTEM_PROCESS_INFORMATION結構中存儲了進程及其線程的所有相關信息,表1 列出了它的具體內容,包括結構內域的地址偏移, 數據類型和描述。
SYSTEM_PROCESS_INFORMATION的第一個DWORD型是下一個進程 SYSTEM_PROCESS_INFORMATION相對于當前結構地址的偏移量,可以通過地址偏移來遍歷所有的進程結構,當遇到某一個進程結構的0 x 0 0 0 0 處的DWORD 型值為0 時,說明這個結構體是系統內最后一個結構體。線程管理服務在它的派遣函數中通過這種方式遍歷所有進程,從中提取有用的信息,填入兩個自定義結構體中。如圖 4 所示,描述了一個具有兩個線程的進程的數據結構,首先在MY_PROCESS_INFO 結構中填入進程的相關信息,然后根據此進程所有的線程數,向系統申請足夠大的分頁內存空間,PVOID 型指針指向的是第一個線程結構所在的地址空間,然后向線程結構體中_MY_THREAD_INFO 中填入線程信息,再由線程結構體中的PVOID 型指針指向第二個線程結構體所在的地址空間,以此類推,最后一個線程結構體的PVOID型指針指向NULL。這樣一個過程描述了一個進程及其所屬的所有線程的枚舉過程,通過對所有進程的遍歷,可以得到系統中的一個完整的進程線程表,存在一段分頁內存中,這樣在應用程序中便可以得到這些信息。
表1 SYSTEM_PROCESS_INFORMATION 結構本文引用地址:http://www.104case.com/article/202482.htm
評論