Win32 核心 DPC 设计思想和实现思路浅析[2]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 flier_lu 的 blog



    而在keinsertqueuedpc函数中判断是否发出dpc中断请求时,也需要做更复杂的逻辑判断。
    对dpc对象目标处理器就是当前处理器的情况,可以和前面单处理器时一样处理,直接发送dpc中断请求;但对于dpc对象目标处理器是其他处理器的情况,就必须使用kiipisend函数发送ipi(interprocessor interrupt)中断,通知目标处理器执行动作。此ipi中断是介于系统掉电中断(power_level)和时钟中断之间的特殊irql,专门用于在多处理器情况下协调多个处理器的工作。
    此外就是在多处理器情况下,各种对dpc队列的操作都需要用此处理器控制块的dpc队列自旋锁保护起来,避免同步问题。

    由此我们可以看到,实际上dpc队列是每个处理器一个的,我们完全可以将某个dpc对象绑定到某个处理器上,实现类似线程亲缘性(thread affinity)的效果,优化在多处理器环境下的性能。但这同时也带来一个问题,就是isr程序可以和dpc回调函数同时被调用,某种程度上也造成了开发复杂度的增加,具体处理方法请参考ddk中相关文档。

    kernel-mode driver architecture\design guide\servicing interrupts\dpc objects and dpcs

本文关键:Win32,kernel,DPC
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top