windows核心分析索引目錄:
執行緒鍊錶與執行緒切換
1. 執行緒等待鍊錶與排程鍊錶
1)在xp作業系統上,其是全域性變數
kiwaitlisthead - 等待鍊錶
比如:執行緒呼叫了sleep()或者waitforsingleobject()等函式,就掛到這個鍊錶中。
kidispatcherreadylisthead - 排程鍊錶
其存在32個鍊錶,按不同排程級別來進行劃分。
作業系統所有執行緒:當前kcpr正在跑的+等待鍊錶+32個排程鍊錶。
2)win7作業系統及以上
其排程鍊錶與等待鍊錶其儲存於kprcb中,而不是全域性變數。
這裡要注意,如果要遍歷鍊錶,則在高版本上搜尋kprcb中的有關屬性。
2.執行緒切換的方式
1)建立乙個程序的時候,其處於就緒狀態;
2)時鐘中斷,或者系統呼叫api的時候,其他執行緒時間隨便到了,或者主動休眠,讓出cpu的權力,切換執行緒;
3)進入乙個等待狀態,堆疊記憶體換出到磁碟上;
4)執行緒的堆疊磁碟還如到記憶體;
5)換入完畢,然後在這個執行緒插入到就緒鍊錶中,根據有限級別,找到對應的鍊錶;
6)該執行緒就有一頂機率執行了。
3.程序切換逆向細節
其程序切換從 kiswapthread->kiswapcontext->swapcontext函式依次遞進,我們下面依次分析這幾個函式。
1)kiswapthread函式
可以看到,該函式的主要目的是找到就緒執行緒,先從kpcr中找,如果沒有則呼叫函式kifindreadythread從就緒鍊錶中找,如果仍沒有找到則切換空閒執行緒跑。
2)kiswapcontext函式
可以看出該函式的主要目的是先將堆疊儲存在暫存器中,之後準備好就緒執行緒和當前執行緒的_kthread以及kpcr結構體。
3)swapcontext函式
該函式是執行緒切換的核心函式,該函式雖然看起來龐大,但是只要把握五點即可:
① esp的切換,其是執行緒切換的核心,只要將esp切換就能把執行緒的堆疊切換掉,實現整個執行緒工作環境的切換。
② 三環下teb的切換,我們知道三環進零環fs由teb切換到thread,其原因是teb儲存在idt[7]中,kpcr儲存在idt[6]中,即切換fs指向即可(可以用od和windbg依次讀取fs暫存器驗證)。
③ 程序切換的同時會比較是否是同一執行緒,如果不是則完成執行緒的切換。
④ esp0指向的是trapframe結構,其儲存在tss.esp0中,三環進零環就是通過tss暫存器來找到有關位置的。
⑤ 執行緒切換後會判斷是否存在核心apc,如果有就去轉去執行。
程序切換與執行緒切換
原文 為了控制程序的執行,核心必須有能力掛起正在cpu上執行的程序,並恢復以前掛起的某個程序的執行。這種行為被稱為程序切換 process switch 任務切換 task switch 或上下文切換 content switch 程序切換分兩步 1.切換頁目錄以使用新的位址空間 2.切換核心棧和硬...
程序切換與執行緒切換
為了更好的了解上下文切換,需要我們了解虛擬記憶體的概念。虛擬記憶體是作業系統為每個程序提供的一種抽象,每個程序都有屬於自己的 私有的 位址連續的虛擬記憶體,當然我們知道最終程序的資料及 必然要放到物理記憶體上,那麼必須有某種機制能記住虛擬位址空間中的某個資料被放到了哪個物理記憶體位址上,這就是所謂的...
執行緒切換與程序切換以及開銷
為了更好的了解上下文切換,需要我們了解虛擬記憶體的概念。虛擬記憶體是作業系統為每個程序提供的一種抽象,每個程序都有屬於自己的 私有的 位址連續的虛擬記憶體,當然我們知道最終程序的資料及 必然要放到物理記憶體上,那麼必須有某種機制能記住虛擬位址空間中的某個資料被放到了哪個物理記憶體位址上,這就是所謂的...