能力值:
( LV2,RANK:10 )
|
-
-
2 楼
自己顶一下 等牛牛解答
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
苦命 顶~!!!!!!!!
|
能力值:
(RANK:260 )
|
-
-
4 楼
不了解内核,只能帮顶了。
|
能力值:
( 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上执行)。
|
|
|