阅读:1832回复:2
为什么需要IRQL?
一直对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者是怎么样的关系? |
|
沙发#
发布于: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 恢复一些基本功能 从而 达到即使蓝屏也可以继续使用电脑的功能 |
|
板凳#
发布于:2007-10-02 13:42
自然科学的规律是上帝定的,人类发现,并使用。
计算机科学的规律是人定的, 我们接受,并使用。 |
|
|