wolfcom
驱动牛犊
驱动牛犊
  • 注册日期2007-06-03
  • 最后登录2007-10-17
  • 粉丝0
  • 关注0
  • 积分60分
  • 威望7点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
阅读:1830回复:2

为什么需要IRQL?

楼主#
更多 发布于:2007-10-01 22:15
一直对IRQL的形成有点疑惑

按照我的正常理解:  
一个中断由cpu通过IDT中的中断门或者陷阱门或任务 从而执行中断列程

那么IRQL起作用的地方 那么就应该是在中断列程这个地方
观察一下我电脑:

IDT主要由两大列程组成
Kei386EoiHelper + xxx
KeReleaseInStackQueuedSpinLockFromDpcLevel + xxx

为什么获取一个SpinLock 当前的IRQL必须  <= DISPATCH_LEVEL
     获取后 为什么要提高到DISPATCH_LEVEL
    
     在DISPATCH_LEVEL就不能有页故障?

DISPATCH_LEVEL 线程调度器失去作用 此时在同一个线程上

如果在DISPATCH_LEVE  也可能发生页故障 CPU也理所当然通过IDT找到中断列程
那么在中断列程上 难道就简单的判断了下IRQL 然后KeBugCheck?
难道就不能调用处理页故障的列程(APC_LEVEL级别)?


中断列程, IRQL, 线程调度 3者是怎么样的关系?
root60931
驱动大牛
驱动大牛
  • 注册日期2002-10-25
  • 最后登录2025-03-22
  • 粉丝2
  • 关注0
  • 积分1013分
  • 威望432点
  • 贡献值0点
  • 好评度311点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2007-10-02 13:42
自然科学的规律是上帝定的,人类发现,并使用。
计算机科学的规律是人定的, 我们接受,并使用。
好好学习,天天向上! root60931@gmail.com
wolfcom
驱动牛犊
驱动牛犊
  • 注册日期2007-06-03
  • 最后登录2007-10-17
  • 粉丝0
  • 关注0
  • 积分60分
  • 威望7点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-10-03 12:50

DISPATCH_LEVEL是一个分水玲
而硬件又是一个分水玲
然后系统拥有最高的权限

如果界限不明确 系统就会不稳定
所以软件方面  <=DISPATCH_LEVEL 是为了不跟硬件抢资源
给硬件中断提供机会
而一般硬件中断 >DISPATCH_LEVEL 由cpu来维护处理的顺序

最高的是系统功能的权限 诸如蓝屏... HIGH_LEVEL

可见这样分的原因是为了协调 硬件 系统 软件 三者之件的关系

为什么要有不分页池呢?
一部分是处理页故障本生代码的原因
另一部分 处理页故障需要时间 而此时的事件非常紧急
调用页故障处理会降低效率 尤其是跟硬件打交道的时候

比如一个达到的中断处在DIRQL 非常紧急 做了下处理后 变缓了  
接着降到DISPATCH_LEVEL吧 把机会留给其他紧急事件
但是此时还是要效率的 不处理页故障 强制规定 否则蓝屏
好了 已经处理完了 那么就老老实实的回到PASSIVE_LEVEL  
接受线程调度器(ntoskrnl.exe- >PS)的调度


为什么需要DPC(DISPATCH_LEVEL)?  此时没有线程调度(单个CPU就同步了)怎么办?
那么就用DPC派遣器了

如何处理中断对象?
那么就用中断调度派遣器

同步能力也比较重要(把当前的IRQL提到高一个比较硬件高的级别的 那么中断处理函数将会把
此是的中断保留下来 由中断调度派遣器来处理
或者干脆由硬件的方式cli 来达到名义不是 实际上是的HIGH_LEVEL) 此时的中断向量的保留由cpu
来决定)
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
可见蓝屏 从某中意义上来说可以通过外界的中断
执行你的中断列程 降低IRQL 恢复一些基本功能
从而
达到即使蓝屏也可以继续使用电脑的功能
游客

返回顶部