1. 程式人生 > >4.核心APC執行過程

4.核心APC執行過程

APC函式的執行與插入並不是同一個執行緒:

在A執行緒中向B執行緒插入一個APC,插入的動作是在A執行緒中完成的,但什麼時候執行則由B執行緒決定!,所以叫“非同步過程呼叫"

核心APC函式與使用者APC函式的執行時間和執行方式也有區別,我們本節課主要學習核心APC的執行過程。

執行點1:執行緒切換

SwapContext		//判斷是否有核心APC

KiSwapThread

KiDelicerApc		//執行核心APC函式

在SwapContext快結束的時候做了一個判斷,判斷的結果存到EAX中,然後返回。 在這裡插入圖片描述

一直到這裡才開始處理 在這裡插入圖片描述 在這裡插入圖片描述

執行點2:系統呼叫、中斷或者異常(_KiServiceExit)

當要執行使用者APC之前,先要執行核心APC。

在這裡插入圖片描述

KiDeliverApc函式執行流程

  1. 判斷第一個連結串列是否為空
  2. 判斷KTHREAD.ApcState.KernelApclnProgress是否為1
  3. 判斷是否禁用核心APC(KTHREAD.KernelApcDisable是否為1).
  4. 將當前KAPC結構體從連結串列中摘除
  5. 執行KAPC.KernelRoutine指定的函式釋放KAPC結構體佔用的空間
  6. 將KTHREAD.ApcState.KernelApclnProgress設定為1標識正在執行核心APC
  7. 執行真正的核心APC函式(KAPC.NormalRoutine)
  8. 執行完畢將KernelApcInProgress改為0

在這裡插入圖片描述

如果連結串列不為空,把4個要用的放到區域性變數裡 在這裡插入圖片描述

如果NormalRoutine不為空就跳到這(不知道NormalRoutine是什麼的去看《3.APC的掛入過程》) 在這裡插入圖片描述

9.下一個迴圈又跳回來 在這裡插入圖片描述

總結:

  1. 核心APC線上程切換的時候就會執行,這也就意味著,只要插入核心APC·很快就會執行。
  2. 在執行使用者APC之前會先執行核心APC
  3. 核心APC在核心空間執行,不需要換棧,一個迴圈全部執行完畢。