日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

4.内核APC执行过程

發(fā)布時(shí)間:2025/3/20 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 4.内核APC执行过程 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

APC函數(shù)的執(zhí)行與插入并不是同一個(gè)線程:

在A線程中向B線程插入一個(gè)APC,插入的動(dòng)作是在A線程中完成的,但什么時(shí)候執(zhí)行則由B線程決定!,所以叫“異步過程調(diào)用"

內(nèi)核APC函數(shù)與用戶APC函數(shù)的執(zhí)行時(shí)間和執(zhí)行方式也有區(qū)別



執(zhí)行點(diǎn)1:線程切換

SwapContext(); //判斷是否有內(nèi)核APCKiSwapThread();KiDelicerApc(); //執(zhí)行內(nèi)核APC函數(shù)

在SwapContext快結(jié)束的時(shí)候做了一個(gè)判斷,判斷的結(jié)果存到EAX中,然后返回。

一直到這里才開始處理



執(zhí)行點(diǎn)2:系統(tǒng)調(diào)用、中斷或者異常(_KiServiceExit)

當(dāng)要執(zhí)行用戶APC之前,先要執(zhí)行內(nèi)核APC。

KiDeliverApc函數(shù)執(zhí)行流程

VOID KiDeliverApc (IN KPROCESSOR_MODE PreviousMode,//1:處理內(nèi)核apc和用戶apc。0:處理內(nèi)核apcIN PKEXCEPTION_FRAME ExceptionFrame,//異常結(jié)構(gòu)IN PKTRAP_FRAME TrapFrame)//陷阱幀//軟件中斷處理例程,只處理當(dāng)前線程的APC鏈表
  • 判斷第一個(gè)鏈表是否為空 (&KTHREAD->ApcState.ApcListHead[KernelMode])
  • 判斷KTHREAD.ApcState.KernelApcInProgress是否為1
  • 判斷是否禁用內(nèi)核APC(KTHREAD.KernelApcDisable是否為1).
  • 將當(dāng)前KAPC結(jié)構(gòu)體從鏈表中摘除
  • 執(zhí)行KAPC.KernelRoutine指定的函數(shù)釋放KAPC結(jié)構(gòu)體占用的空間
  • 將KTHREAD.ApcState.KernelApclnProgress設(shè)置為1標(biāo)識(shí)正在執(zhí)行內(nèi)核APC
  • 執(zhí)行真正的內(nèi)核APC函數(shù)(KAPC.NormalRoutine)
  • 執(zhí)行完畢將KernelApcInProgress改為0
  • 如果鏈表不為空,把4個(gè)要用的放到局部變量里

    如果NormalRoutine不為空就跳到這(不知道NormalRoutine是什么的去看APC的掛入過程)

    下一個(gè)循環(huán)又跳回來



  • 內(nèi)核APC在線程切換的時(shí)候就會(huì)執(zhí)行,這也就意味著,只要插入內(nèi)核APC很快就會(huì)執(zhí)行。
  • 在執(zhí)行用戶APC之前會(huì)先執(zhí)行內(nèi)核APC
  • 內(nèi)核APC在內(nèi)核空間執(zhí)行,不需要換棧,一個(gè)循環(huán)全部執(zhí)行完畢。
  • 總結(jié)

    以上是生活随笔為你收集整理的4.内核APC执行过程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。