Windows操作系統(tǒng)多核CPU內(nèi)核線程管理方法
Windows 內(nèi)核親緣性調(diào)度原理圖
圖 2 Windows 內(nèi)核親緣性調(diào)度原理圖。
那么控制線程在指定CPU 上運(yùn)行的突破口就是修改Windows 內(nèi)核結(jié)構(gòu)體KTHREAD 下的Affinity 域。然而Windows 內(nèi)核結(jié)構(gòu)被放在虛擬內(nèi)存線性地址的高2G(不同版本W(wǎng)indows 下也可能是1G)地址空間,用戶模式下的應(yīng)用程序是無法訪問這段內(nèi)存空間的,所以必須編寫Windows 驅(qū)動(dòng)程序,來訪問Windows 內(nèi)核內(nèi)存空間, 這也是本文將要描述的重點(diǎn)。
3 線程管理服務(wù)系統(tǒng)
整個(gè)系統(tǒng)的結(jié)構(gòu)如圖3 所示。該系統(tǒng)由兩大部分組成,分別是內(nèi)核模式下的管理服務(wù)系統(tǒng)設(shè)備驅(qū)動(dòng)程序,和用戶模式下的管理服務(wù)系統(tǒng)應(yīng)用程序。管理服務(wù)系統(tǒng)應(yīng)用程序通過調(diào)用Win32 子系統(tǒng)API,向內(nèi)核下的管理服務(wù)系統(tǒng)驅(qū)動(dòng)程序傳遞IRP,內(nèi)核收到IRP 后,跟據(jù)收到的IRP 的內(nèi)部信息,執(zhí)行相應(yīng)的派遣函數(shù),對(duì)相應(yīng)內(nèi)存進(jìn)行讀寫,從而給管理服務(wù)系統(tǒng)應(yīng)用程序提供可用的系統(tǒng)信息。
管理系統(tǒng)總體結(jié)構(gòu)圖
圖3 管理系統(tǒng)總體結(jié)構(gòu)圖。
3.1 內(nèi)核模式下讀取系統(tǒng)信息
線程管理服務(wù)系統(tǒng)驅(qū)動(dòng)程序中,讀取系統(tǒng)信息的方法用到了微軟沒有公開文檔的內(nèi)核服務(wù)函數(shù),ZwQuerySystemInformATIon,這個(gè)函數(shù)被封裝在ntdll.dll模塊中,通過鏈接ntdll.lib 可得到此函數(shù)地址。通過一個(gè)枚舉量SystemProcessInformaTIon 來得到進(jìn)程線程相關(guān)信息,填入到第二個(gè)輸入?yún)?shù)SYSTEM_PROCESS_INFORMATION結(jié)構(gòu)中, 這樣就獲得了當(dāng)前系統(tǒng)關(guān)于進(jìn)程線程的信息。
3.2 內(nèi)核模式下枚舉系統(tǒng)進(jìn)程線程
SYSTEM_PROCESS_INFORMATION結(jié)構(gòu)中存儲(chǔ)了進(jìn)程及其線程的所有相關(guān)信息,表1 列出了它的具體內(nèi)容,包括結(jié)構(gòu)內(nèi)域的地址偏移, 數(shù)據(jù)類型和描述。
SYSTEM_PROCESS_INFORMATION的第一個(gè)DWORD型是下一個(gè)進(jìn)程 SYSTEM_PROCESS_INFORMATION相對(duì)于當(dāng)前結(jié)構(gòu)地址的偏移量,可以通過地址偏移來遍歷所有的進(jìn)程結(jié)構(gòu),當(dāng)遇到某一個(gè)進(jìn)程結(jié)構(gòu)的0 x 0 0 0 0 處的DWORD 型值為0 時(shí),說明這個(gè)結(jié)構(gòu)體是系統(tǒng)內(nèi)最后一個(gè)結(jié)構(gòu)體。線程管理服務(wù)在它的派遣函數(shù)中通過這種方式遍歷所有進(jìn)程,從中提取有用的信息,填入兩個(gè)自定義結(jié)構(gòu)體中。如圖 4 所示,描述了一個(gè)具有兩個(gè)線程的進(jìn)程的數(shù)據(jù)結(jié)構(gòu),首先在MY_PROCESS_INFO 結(jié)構(gòu)中填入進(jìn)程的相關(guān)信息,然后根據(jù)此進(jìn)程所有的線程數(shù),向系統(tǒng)申請(qǐng)足夠大的分頁內(nèi)存空間,PVOID 型指針指向的是第一個(gè)線程結(jié)構(gòu)所在的地址空間,然后向線程結(jié)構(gòu)體中_MY_THREAD_INFO 中填入線程信息,再由線程結(jié)構(gòu)體中的PVOID 型指針指向第二個(gè)線程結(jié)構(gòu)體所在的地址空間,以此類推,最后一個(gè)線程結(jié)構(gòu)體的PVOID型指針指向NULL。這樣一個(gè)過程描述了一個(gè)進(jìn)程及其所屬的所有線程的枚舉過程,通過對(duì)所有進(jìn)程的遍歷,可以得到系統(tǒng)中的一個(gè)完整的進(jìn)程線程表,存在一段分頁內(nèi)存中,這樣在應(yīng)用程序中便可以得到這些信息。
表1 SYSTEM_PROCESS_INFORMATION 結(jié)構(gòu)本文引用地址:http://m.butianyuan.cn/article/202482.htm linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
評(píng)論