APC函数的执行与插入并不是同一个线程:

在A线程中向B线程插入一个APC,插入的动作是在A线程中完成的,但什么时候执行则由B线程决定!,所以叫“异步过程调用"

内核APC函数与用户APC函数的执行时间和执行方式也有区别



执行点1:线程切换

SwapContext();   //判断是否有内核APCKiSwapThread();KiDelicerApc();      //执行内核APC函数

在SwapContext快结束的时候做了一个判断,判断的结果存到EAX中,然后返回。

一直到这里才开始处理



执行点2:系统调用、中断或者异常(_KiServiceExit)

当要执行用户APC之前,先要执行内核APC。

KiDeliverApc函数执行流程

VOID KiDeliverApc (IN KPROCESSOR_MODE PreviousMode,//1:处理内核apc和用户apc。0:处理内核apcIN PKEXCEPTION_FRAME ExceptionFrame,//异常结构IN PKTRAP_FRAME TrapFrame)//陷阱帧//软件中断处理例程,只处理当前线程的APC链表
  1. 判断第一个链表是否为空 (&KTHREAD->ApcState.ApcListHead[KernelMode])
  2. 判断KTHREAD.ApcState.KernelApcInProgress是否为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是什么的去看APC的挂入过程)

下一个循环又跳回来



  1. 内核APC在线程切换的时候就会执行,这也就意味着,只要插入内核APC很快就会执行。
  2. 在执行用户APC之前会先执行内核APC
  3. 内核APC在内核空间执行,不需要换栈,一个循环全部执行完毕。

4.内核APC执行过程相关推荐

  1. (75)内核APC执行过程,分析 KiDeliverApc 函数

    一.内核APC执行过程 通过分析 SwapContext ,KiSwapContexgt , KiSwapThread ,我们得出一个结论:切换线程后会执行内核APC,调用的函数是 KiDeliver ...

  2. 5.用户APC执行过程

    当产生系统调用.中断或者异常,线程在返回用户空间前都会调用, _KiServiceExit函数,在_KiServiceExit会判断是否有要执行的用户APC,如果有则调用KiDeliverApc函数( ...

  3. linux进程上下文切换的具体过程,Linux实验三 结合中断上下文切换和进程上下文切换分析Linux内核一般执行过程...

    fork系统调?创建?进程,也就?个进程变成了两个进程,两个进程执?相同的代码,只是fork系统调?在?进程和?进程中的返回值不同. 打开linux-5.4.34/arch/x86/entry/sys ...

  4. linux内核make执行过程

    本篇基于上一篇<<linux内核make menuconfig执行过程>>基础上,追溯make执行过程. make 1. 与make menuconfig相同的部分 这部分内容 ...

  5. linux执行class文件_深入理解linux内核——可执行文件执行过程(2)

    接上篇.. 13.调用do_mmap()函数创建一个新线性区来对可执行文件正文段(即代码)进行映射.这个线性区的起始线性地址依赖于可执行文件的格式,因为程序的可执行代码通常是不可重定位的.因此,这个函 ...

  6. linux 文件可执行_深入理解linux内核——可执行文件执行过程(2)

    接上篇.. 13.调用do_mmap()函数创建一个新线性区来对可执行文件正文段(即代码)进行映射.这个线性区的起始线性地址依赖于可执行文件的格式,因为程序的可执行代码通常是不可重定位的.因此,这个函 ...

  7. Windows APC学习笔记(二)—— 挂入过程执行过程

    Windows APC学习笔记(二)-- 挂入过程&执行过程 基础知识 挂入过程 KeInitializeApc ApcStateIndex KiInsertQueueApc Alertabl ...

  8. LINUX内核分析第八周总结:进程的切换和系统的一般执行过程

    一.进程调度与进程切换 1.不同的进程有不同的调度需求 第一种分类: I/O密集型(I/O-bound) 频繁的进行I/O 通常会花费很多时间等待I/O操作的完成 CPU密集型(CPU-bound) ...

  9. Bochs调试Linux内核6 - 启动过程调试 - 跳到bootsect引导程序执行

    接此,​​​​​​Bochs调试Linux内核5 - 启动过程调试 - 认识Bootsect.S_bcbobo21cn的专栏-CSDN博客 看一下,0x00007c11 这里是重复执行串传送:而后一条 ...

最新文章

  1. 只做好CTR预估远不够,淘宝融合CTR、GMV、收入等多目标有绝招
  2. 如何从失焦的图像中恢复景深并将图像变清晰?
  3. 数据不够,是模型表现不佳的“借口”,还是真正的问题所在?
  4. NVL 和NVL2函数
  5. AJAXA进行分页(2)
  6. The Linux Command Line读书笔记(二)
  7. swot分析模板_什么是SWOT分析图?怎样绘制SWOT分析思维导图,这样操作很简单
  8. matlab ones函数_Matlab中相见恨晚的命令(持续更新)
  9. HashMap 的 7 种遍历方式与性能分析!
  10. mysql 修改这段长度_MySQL中使用group_concat()函数数据被截取(有默认长度限制),谨慎!...
  11. LongListSelector 控件 在 wp7 和wp8中的不同之处
  12. grub2与grub区别
  13. IT也要健康:帮助你保持健康的几个重要因素
  14. SitePoint播客#43:被动共享
  15. [史]《全球通史》上册——摘记
  16. Ubuntu 11.10文本文档乱码
  17. 用Python对微信好友进行简单统计分析
  18. 幻读与不可重复读区别
  19. 深入理解Python中的if语句
  20. 关于少儿编程编程语言的选择,python还是c++

热门文章

  1. Py之mglearn:python库之mglearn简介、安装、使用方法之详细攻略
  2. Excel:解决Excel表格每一行所有字段在一个单元格的情况
  3. 深入浅出统计学 第六章 排列与组合
  4. 自定义元类控制类的实例化行为
  5. Angular2.0 基础: Form
  6. Java学习手记2——多线程
  7. 给 Easyui Datagrid 扩展方法
  8. VB查询数据库之写入数据库——机房收费系统总结(三)
  9. /bin/sh^M:损坏的解释器: No such file or directory
  10. WINDOWS消息系统简洁图解