4.核心APC執行過程
阿新 • • 發佈:2018-12-17
APC函式的執行與插入並不是同一個執行緒:
在A執行緒中向B執行緒插入一個APC,插入的動作是在A執行緒中完成的,但什麼時候執行則由B執行緒決定!,所以叫“非同步過程呼叫"
核心APC函式與使用者APC函式的執行時間和執行方式也有區別,我們本節課主要學習核心APC的執行過程。
執行點1:執行緒切換
SwapContext //判斷是否有核心APC
KiSwapThread
KiDelicerApc //執行核心APC函式
在SwapContext快結束的時候做了一個判斷,判斷的結果存到EAX中,然後返回。
一直到這裡才開始處理
執行點2:系統呼叫、中斷或者異常(_KiServiceExit)
當要執行使用者APC之前,先要執行核心APC。
KiDeliverApc函式執行流程
- 判斷第一個連結串列是否為空
- 判斷KTHREAD.ApcState.KernelApclnProgress是否為1
- 判斷是否禁用核心APC(KTHREAD.KernelApcDisable是否為1).
- 將當前KAPC結構體從連結串列中摘除
- 執行KAPC.KernelRoutine指定的函式釋放KAPC結構體佔用的空間
- 將KTHREAD.ApcState.KernelApclnProgress設定為1標識正在執行核心APC
- 執行真正的核心APC函式(KAPC.NormalRoutine)
- 執行完畢將KernelApcInProgress改為0
如果連結串列不為空,把4個要用的放到區域性變數裡
如果NormalRoutine不為空就跳到這(不知道NormalRoutine是什麼的去看《3.APC的掛入過程》)
9.下一個迴圈又跳回來
總結:
- 核心APC線上程切換的時候就會執行,這也就意味著,只要插入核心APC·很快就會執行。
- 在執行使用者APC之前會先執行核心APC
- 核心APC在核心空間執行,不需要換棧,一個迴圈全部執行完畢。