DPC 延迟过程调用

dpclat.exe 立即下载

作者: JIURL
邮箱: thejiurl@gmail.com
主页: http://jiurl.blogsome.com/
      http://jiurl.yeah.net/

$ 前言

这篇文章应该写于 2005年4月13日,是写给自己备忘的研究文档,本来是根本没有打算放出来的。

$ DPC

deferred procedure call (DPC) 延迟过程调用

dpc 主要是为了减少处于高 IRQL 的硬件中断处理的时间。
由于低 IRQL 的硬件中断不能中断 高 IRQL 的硬件中断处理。
而可能有些硬件的中断处理代码量比较大,花的时间比较多,会造成其他硬件中断的响应会等的时间比较长。
很有可能就是因为 时钟中断处理,非常非常频繁,代码量也比较多,可能会比较大的影响到其他硬件中断的响应,至于硬件中断响应比较慢可能会对不同的硬件造成什么结果,有待研究。

$ DPC 队列

整个系统只有一个 DPC 队列,至少对单cpu的系统是如此,对于多cpu系统有可能是一个cpu一个,有待验证。

这个队列是个 LIST_ENTRY 链表。

链表头在 pcr 的 +800 struct _LIST_ENTRY DpcListHead。
链的深度在 pcr 的 +808 uint32 DpcQueueDepth。

所有的 dpc 都链在这个链上。

链上的每项是个 KDPC 结构。

struct   _KDPC (sizeof=32)
+00 int16    Type
+02 byte     Number
+03 byte     Importance
+04 struct   _LIST_ENTRY DpcListEntry
+04    struct   _LIST_ENTRY *Flink
+08    struct   _LIST_ENTRY *Blink
+0c function *DeferredRoutine
+10 void     *DeferredContext
+14 void     *SystemArgument1
+18 void     *SystemArgument2
+1c uint32   *Lock

$ DPC 的源头

所有的 DPC 都是在 IRQL >= DISPATCH_LEVEL 的代码中产生的。
也就是只有 IRQL 大于等于 DISPATCH_LEVEL 的代码使用 DPC。

DPC 都是在硬件中断服务例程(ISR)中,由硬件中断服务例程根据自己的需要,链入到 DPC 队列中的。
中断服务例程中调用 KeInsertQueueDpc 将 dpc 链入 dpc 队列,或者,中断服务例程直接操作 dpc 链表,将 dpc 链入。

KeInsertQueueDpc 除了将 dpc 链入链之外,还会调用 KiRequestSoftwareInterrupt(DISPATCH_LEVEL),如果调用是的 IRQL 高于 DISPATCH_LEVEL,会使得 dpc pending,等到 irql 降下来的时候得到执行。

如果是自己直接操作链来将dpc链入的话,也需要自己调用类似 KiRequestSoftwareInterrupt(DISPATCH_LEVEL) 的函数。

$ DPC 的执行

在硬件中断处理的最后,会调用 HalEndSystemInterrupt。
HalEndSystemInterrupt 中,会将 IRQL 降低,然后检查是否有 DPC pending,有的话,会调用 KiDispatchInterrupt 处理 dpc。

KiDispatchInterrupt 中调用 KiRetireDpcList 处理 dpc。

也就是说,当在硬件中断处理中加入一个 dpc,那么当这个硬件中断处理结束的时候,就会调用这个被加入的 DPC。

a:所有处理都放在isr中
b:处理分两部分,必须要做的放在isr中,剩下的放在dpc中,isr中使用dpc

a的处理代码一直执行下来,只可能被irql比它高的硬件中断中断。
b的isr一直执行下来,紧接着执行dpc。isr部分只能被irql比它高的硬件中断中断。dpc部分可被任何硬件中断中断。

$ DPC 不可能受到线程切换的影响

会不会 DPC 中的代码执行到一半,发生线程切换,或者线程抢占,CPU 转去执行什么线程?
答案是绝对不会。

这是由于负责线程切换,抢占的代码就是运行在 IRQL DISPATCH_LEVEL,而 IRQL 小于等于当前 IRQL 的中断不能发生。
所以运行 dpc 时,irql 为 DISPATCH_LEVEL,根本就不会发生线程切换,线程抢占之类的事情。

当然中断中,就更不会了。

$ KiDispatchInterrupt

DISPATCH_LEVEL 上执行的代码有两大种,
一种是各种 isr 加的 dpc,处理一个 dpc,也就是调用这个 dpc 中的 DeferredRoutine。
一种是关于线程调度的。

KiDispatchInterrupt 是和 dpc 相关的重要函数。
KiDispatchInterrupt 主要做以下工作:

{
从 pcr 中得到 dpc 链表头。
如果链表不空的话,调用 KiRetireDpcList 处理 dpc。也就是一个一个的调用dpc里的 DeferredRoutine。

检查 pcr 中的 QuantumEnd,看是否为0。不为0进行 QuantumEnd 的处理。
检查 pcr 中的 NextThread,看是否为0。不为0进行 更换新的线程的 处理。
}

由于 KiDispatchInterrupt 会在各种硬件中断处理的结束有可能得到调用,当硬件中断处理过程中使用dpc的情况下就会在中断处理结束的时候被调用。

如果有任何代码使用 DISPATCH_LEVEL RequestSoftwareInterrupt 的话,KiDispatchInterrupt 也可能被立即执行。

QuantumEnd 不为0的情况,目前只有一种情况引起,就是时钟中断处理中,将当前线程的 Quantum 减少后,发现当前线程 Quantum 用完,就会设置 QuantumEnd,并在 时钟中断 处理结束的时候,引起 KiDispatchInterrupt 执行。

NextThread 不为0的情况,是哪些情况下引起的,还待研究。

 

DPC硬件延迟测试 DPC Latency Checker v1.2.0 DPC Latency Checker : 官方网站,内有英文详细原理 http://www.thesycon.de/deu/latency_check.shtml 载点 http://www.thesycon.de/dpclat/dpclat.exe 用来测试电脑系统的DPC延迟时间。。值太大或者有高峰就可能会有停顿/爆音的问题。。 操作系统处理一些实时的数据(音频、视频的数据流)时如果DPC延迟过高,会产生数据丢失的问题(Drop-outs),有些主板的爆音问题也是由于一些设备驱动的DPC 延迟过高造成的。 单位为微秒,软件会自动给出系统是否适合处理实时数据的结果。 如果太高,如何解决:用windows performance toolkit来分析DPC latency,观察哪一个驱动造成问题。。过程好像比较复杂,没试过。。 个人手提电脑HP Compaq nw8440 Windows XP sp3 平均500微秒(us)以下。。偶尔会有2000以下的高峰。。无爆音问题,有很小的低噪。。 大家不妨试试,贴上电脑设备和操作系统。。 立即下载

相关推荐

dpclat 电脑 声卡 噪音 检测 绿色

dpclat 电脑 声卡 噪音 检测 绿色

LatencyMon:Windows DPC 延迟优化

玩游戏时帧数很高(FPS > 100),但画面偶尔会微卡一下?听音乐或看视频时,声音突然出现爆音(Crackling)或断续?鼠标移动时偶尔会有拖拽感?这通常不是硬件性能不足,而是DPC(Deferred Procedure Call)延迟过高导致的。简单来说:当某个驱动程序(如显卡或网卡)占用 CPU 时间过长,CPU 就无法及时处理其他任务(如音频流或鼠标输入),从而导致卡顿。优化完成后,观察 LatencyMon 的Stats完美状态(实时音频/专业用途)< 500 µs。

lihui261431的博客 1万+

霍尔式流量计背后的技术和算法

例如,在一项实验中,当流量低于最小操作范围(0.250 L/min)时,误差比其他流量大,但仍然在95%的精度范围内可接受。例如,在Honeywell电子学的测试中,使用30英寸水柱的压力计和热电偶测量气体特性,记录并计算实际和理论质量流量,以确定修正系数。霍尔式流量计的校准系数是通过一系列精确的测量和计算步骤确定的,以确保其测量结果的准确性和可靠性。霍尔式流量计的校准系数是通过严格的环境条件、精确的测量步骤和实验数据确定的。其中,Qs是标尺介质的流量,K是修正系数,Qm是用户介质的流量。

百态·数智思维 | 聚焦大数据、量化与未来AI 1233

DPC(延迟过程调用)的技术细节

-DPC(延迟过程调用)的细节 NTINSIDER,16卷,1期,1至2月2009 延迟过程调用(DPC)是一种Windows常用功能。用途是广泛和多样的,但最常用的是我们通常所说的“ISR完成”和WindowsTimer底层技术。    如果DPC常用,为什么还要写此篇?我们发现,大多数人并不真正了解DPC工作的底层实现细节。并且,事实证明,一个深入的理解,在选择选项创建D

kulala082的专栏 2532

如何使用3D高斯分布进行环境建模

使用3D高斯分布来进行建模,关键在于通过引入不确定性描述来提高建图的鲁棒性和精度。与传统点云表示相比,3D高斯分布提供了一种更为灵活和有效的方式来处理空间数据,能够通过协方差矩阵表示点的空间不确定性,帮助优化SLAM过程中的定位和地图更新。

JaydenQ的博客 2355

FPGA开发者必看:Xilinx PCIe IP核BAR地址配置避坑指南(附实例解析)

本文为FPGA开发者提供了Xilinx PCIe IP核中BAR地址配置的详细避坑指南。文章深入解析了32位与64位地址空间的选择逻辑、Pcie to AXI Translation参数的核心作用,并通过实例说明如何正确配置以避免地址映射错乱和数据访问失败。重点探讨了BAR空间类型、大小设定以及地址转换机制,帮助开发者构建清晰可靠的PCIe系统,是调试与优化PCIe设计的关键参考。

weixin_29252171的博客 424

Deferred Procedure Call Details(延迟过程调用详解)

Deferred Procedure Call Details(延迟过程调用详解)               (2011-02-26 14:03:53)转载▼ 标签: dpc 延迟过程调用 软件中断 it 分类: 我翻译滴文章^_^ Deferred Procedure Calls (DPCs) are a commonly used feature of Windows. Their us

killcpp的专栏 2194

GD32F105RBT6 keil工程模板

创建GD32F105RBT6的keil初始基础工程,未来的所有外设驱动都是基于这个基础工程进行扩展。

RMDYBW的博客 1926

Windows Internals学习:软件中断详解:DPC(延迟过程调用)机制

DPC通常是一个"跟中断相关"的函数,它的执行时机被安排在所有设备中断都已经被处理完之后。之所以叫"延迟(deferred)",是因为这类函数不会立刻执行,而是被先放进一个队列里,等合适的时机再拿出来跑。处理定时器到期(同时唤醒那些正在等待这个定时器的线程);在线程的时间片(quantum)用完后重新调度处理器(这里有个细节要注意:这个重新调度动作确实是在 DPC IRQL 上进行的,但并不是通过一个常规意义上的 DPC 对象来完成的,二者只是共用同一个 IRQL 级别)。

虾球 241

STK12与Python联合仿真(一):环境搭建

STK仿真python接口,安装与测试

qq_42635142的博客 1万+

从零开始安装 Windows 11 和 Ubuntu 22.04 双系统

本文详解Windows与Ubuntu 22.04双系统安装流程:需提前确认BIOS模式(UEFI/GPT或Legacy/MBR),关闭BitLocker加密、设备加密及快速启动;推荐Rufus/Ventoy制作启动盘。安装时需规划分区方案(建议单独划分EFI系统分区),注意引导器安装位置选择。双系统启动通过BIOS引导顺序管理,安装后需同步Windows与Linux系统时间。教程适配主流UEFI+GPT设备,强调操作前数据备份及Windows更新策略调整,避免兼容性问题。

萑澈的博客 3765

DPC延迟过程调用

每个设备对象中都含有一个KDPC对象,DEVICE_OBJECT中有一个内置的DPC对象 Dpc。当在驱动程序的AddDevice例程创建了设备对象后,如果需要用DPC例程就要在 AddDevice例程中调用IolnitimizeDpcRequest初始化这个内置DPC对象,同时注册 一个DPC例程。IolnitializeDpcRequest的~个参数为FDO设备对象,一个为指向DPC

漂飘渔人 2701

040、未来展望:MLIR与编译技术的演进方向

MLIR不是又一个编译框架,它更像是一套“元框架”——提供构建专用编译工具的能力。未来几年,我们会看到更多垂直领域(自动驾驶、射频信号处理、生物计算)出现基于MLIR的专用编译器,它们可能不会挂“MLIR”的名字,但内核都是这套可扩展的IR基础设施。不要等MLIR“成熟”再用,现在就该把它当成一把瑞士军刀,先挑刀口最锋利的那个功能(比如图优化、循环变换)用起来。编译技术的演进不再是学术界的独角戏,而是越来越贴近实际生产中的异构、动态、领域专用需求。

m0_50546716的博客 174

延迟过程调用

延迟过程调用,即 DPC。 这是一种机制,当上层请求下来,由于过多的操作步骤,为了使系统性能更好,使用一个完成调用例程,告诉上层“我完成了”,这样就可以处理下面的请求了,而系统会把剩下得处理过程加入到一个叫做DPC的队列中,等系统有空时,再来调用。这就是--延迟过程调用。 说白了,就是一种缓冲机制。 这是系统控制的。几乎每种现代操作系统都有这样的类似机制。 延时过程调用的应用延

Java技术博文 2185

真随机数与伪随机数

前面我们学习了LFSR,这个玩意落地到具体的应用是什么呢?没错是寄存器,这里在网络找到了几个回答,这里做个记录,下面一起来学习一下吧。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 1062

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

延迟过程调用/异步过程调用APC

延迟过程调用,即 DPC。 这是一种机制,当上层请求下来,由于过多的操作步骤,为了使系统性能更好,使用一个完成调用例程,告诉上层“我完成了”,这样就可以处理下面的请求了,而系统会把剩下得处理过程加入到一个叫做DPC的队列中,等系统有空时,再来调用。这就是--延迟过程调用。 说白了,就是一种缓冲机制。 异步过程调用APC 异步的概念和同步相对。当一个异步过程调用发出后,调

Java技术博文 1332

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

zircon的dpc机制

zircon中的dpc 机制由于减少系统中的线程,用户可以将要执行函数发给dpc dpc的入口函数如下: static void dpc_init(unsigned int level) { // initialize dpc for the main CPU dpc_init_for_cpu(); } dpc_init_for_cpu 会为当前cpu 创建一个dpc threa...

jason的笔记 2524

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

windows内核情景分析 --- DPC

DPC不同APC,DPC的全名是‘延迟过程调用’。 DPC最初作用是设计为中断服务程序的一部分。因为每次触发中断,都会关中断,然后执行中断服务例程。由于关中断了,所以中断服务例程必须短小精悍,不能消耗过多时间,否则会导致系统丢失大量其他中断。但是有的中断,其中断服务例程要做的事情本来就很多,那怎么办?于是,可以在中断服务例程中先执行最紧迫的那部分工作,然后把剩余的相对来说不那么重要的工作移入到D

maomao171314的专栏 4454

通过异步的方式处理IO和延迟过程调用

有时候一些高IRQL的代码需要执行一些低IRQL的代码。但是在高IRQL的情况下,低IRQL的代码是不能够执行的。DPC解决了这一问题。

静下心来,做好每一件事 165

dpc与线程切换

因为一则用户态的程序没办法干扰这个呼出流程,二则如果不能呼出任务管理器来终止进程或者呼出windbg等工具进行观察调试的话,其实排查的方法也跟windows卡死是一致的——触发scrolllock蓝屏。大部分代码运行在被动级别上,线程切换流程里的某个阶段和dpc的DeferredRoutine处理是运行在dpc级别上,硬件中断都更高。上文的90对应的函数i8042prt!同样是按键后的反应,为什么在ctrl+alt+del不能呼出的场景下,scrolllock蓝屏还能够触发,也是一个获取关键知识的方向。

u010607621的博客 1323

ISR和DPC

ISR:Interrupt Service Routines (中断服务例程 必须马上做的事情,比如硬件中断,响应鼠标点击 DPC:Deferred Procedure Call Details(延迟过程调用 可以推迟做的事情,比如大数据拷贝,U盘拷贝电影。 Windows中断请求级别 IRQL Interrupts Masked Off Driver Routines PAS

在线笔记 2261

DPC and APC

An asynchronous procedure call (APC) is a function that executes asynchronously. APCs are similar to deferred procedure calls (DPCs), but unlike DPCs, APCs execute within the context of a particular

882

[9]Windows内核情景分析 --- DPC

DPC不同APC,DPC的全名是‘延迟过程调用’。 DPC最初作用是设计为中断服务程序的一部分。因为每次触发中断,都会关中断,然后执行中断服务例程。由于关中断了,所以中断服务例程必须短小精悍,不能消耗过多时间,否则会导致系统丢失大量其他中断。但是有的中断,其中断服务例程要做的事情本来就很多,那怎么办?于是,可以在中断服务例程中先执行最紧迫的那部分工作,然后把剩余的相对来说不那么重要的工作移入到D...

jadeshu的博客 2612
上一篇: gzip原理与实现
下一篇: 对 MBCS 文本的 QuickSearch 搜索的误搜 节选
imquestion
博客等级 码龄25年 50粉丝 34原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值