首页
社区
课程
招聘
[求助]关于DPC机制原理上问题
发表于: 2009-2-15 00:06 5283

[求助]关于DPC机制原理上问题

2009-2-15 00:06
5283
DPC执行过程是这样的

1 当一段具有高的IRQL代码想安排它的一些工作在低的IRQL下工作时,它增加一个DPC对象到系统DPC派遣队列的末尾,并且请求一个软中断,因为当前的IRQL高于DISPATCH_ LEVEL,这个中断不会马上执行,而是悬挂起来。

2. 最后,处理机的IRQL跌落到DISPATCH_ LEVEL以下,以前悬挂的中断被DPC派遣器执行服务。

3.   DPC派遣器使每个DPC对象从系统队列中出列,调用存储在DPC对象中的指针所指的函数,这时处理机的IRQL是在DISPATCH_ LEVEL。

4. 当DPC队列被清空时,DPC派遣器解除DISPATCH_ LEVEL软件中断。
我想问的是DPC的实现上
其第1步中说的软中断其对应ISR例程是不是就是DPC的派遣器的代码?

[课程]Linux pwn 探索篇!

收藏
免费 1
支持
分享
最新回复 (4)
雪    币: 210
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
自己顶一下 等牛牛解答
2009-2-15 13:49
0
雪    币: 210
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
苦命 顶~!!!!!!!!
2009-2-15 21:32
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
4
不了解内核,只能帮顶了。
2009-2-15 21:58
0
雪    币: 22
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
算不上是牛牛,不过,简单的说一下我的理解,你说的软中断是通过硬件抽象层函数 :HalRequestSoftwareInterrupt完成的,(当初NT设计的时候有意增强可移植性,对不同的硬件平台进行抽象),既然是硬件抽象层的函数,你就不可理解成一定是类似int 3那种硬件支持的软中断,NT将各种硬件PIC抽象成一个统一的虚拟的中断控制器,下面摘录了别人写的东西,我就不打字了,忘了出处,见谅。(其实,你干嘛真的要明白HalRequestSoftwareInterrupt的工作呢?框架思想理解对了就OK,不是吗?)

虚拟的中断控制器里,nt定义了32个软件中断级别,当硬件中断发
生的时候,hal将硬件中断映射成这32个软中断之一,并更新虚拟中断
控制器的内部状态保持和硬件中断控制器同步。从kernel往上到执行
体以及驱动程序,所有的代码也都是和这个虚拟出来的中断控制器打
交道,最大量使用的操作是,ke、ex或者driver通过操纵irql来控制
当前活动的优先级,使得低优先级的活动不至于干扰当前计算任务,
同时保持对高优先级计算任务的及时响应。于是,nt可以将不同的计
算任务分配到不同的优先级上,从而为高效使用cpu资源提供了相当
的灵活性。

nt做了大量的工作,保证这个虚拟中断控制器(pic)像硬件pic一样精
确而可靠的工作,这个虚拟pic的支持数据结构都位于PCR,也就是
processor control region中,PCR是hal和kernel共享的一个非常重
要的数据结构。

现在流行可编程设备,像8259之类的简单器件都可以从网上下载到free
的ip了,要了解它的工作原理或者把它变成软件比从前容易多了。在
当年,不要说实现一个虚拟的pic,就是能有这个想法的,大概也得
算是软硬通吃的牛人了。

作为一个比较粗糙的总结,我认为,理解了下面的功能,基本上就能
掌握nt的虚拟中断控制器的实现原理了。这个总结不是很好,在那些
熟悉硬件的看来,只能说是贻笑大方了。
*) interrupt request register
- 记录尚未被cpu处理的中断,以便cpu在适当的时候查询。
*) interrupt mask
- 屏蔽不重要的中断,在nt中通过irql实现
*) interrupt request recognizing
- nt在适当的时候会检查IRR,如果发现有比当前irql高的未
处理中断,则会立刻启动该中断的处理程序,这个检查的
过程我称为recognizing。recognizing发生在很多场合,KeLowerIrql
是最经常的一个,HalRequestSoftwareInterrupt也是一个。
*) interrupt routing \& dispatching
- 相当于硬件的中断向量表,nt也有个软件中断派发表,
SWInterruptTableHandlerTable,后面将要看到,在
向x86上,这个派发表和idt协同工作实现中断的派发。
*) interrupt acknowledgement

虚拟pic的状态也可以看成是硬件pic的状态的cache。如同memory
cache一样,虚拟pic的状态和硬件pic也不总是一致。事实上,在
提升irql的时候,nt采用lazy irql技术将对硬件imr的编程推迟到
当被屏蔽的中断到来的时候,这个策略和memory cache的lazy
write如出一辙。另外一个可以和这个类比的策略是nt的虚拟内存
的保留->提交两阶段分配。我记得在有个程序员的网站上看到,
这种将代码推迟到必要的时候才执行的思想,是优化代码的常见
方法。

这种将硬件中断虚拟化的设计思路很有大师气派,也确实达到了很好
的可移植性,可惜的是nt在这个映射的过程中,牺牲了对硬件中断优
先级的控制,后来成了nt在向实时系统转化的时候的最大障碍(另外
一个障碍是umode线程只能在passive level上执行)。
2009-2-16 11:03
0
游客
登录 | 注册 方可回帖
返回
//