免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2145 | 回复: 0
打印 上一主题 下一主题

LINUX的中断处理是否没有中断优先级的概念? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-05-10 14:58 |只看该作者 |倒序浏览

LINUX的中断处理是否没有中断优先级的概念?
今天看ULK3中断处理的章节。其中4.3章有如下描述:
Linux interleaves kernel control paths for two major reasons:
To improve the throughput of programmable interrupt controllers and device controllers. Assume that a device controller issues a signal on an IRQ line: the PIC transforms it into an external interrupt, and then both the PIC and the device controller remain blocked until the PIC receives an acknowledgment from the CPU. Thanks to kernel control path interleaving, the kernel is able to send the acknowledgment even when it is handling a previous interrupt.
To implement an interrupt model without priority levels. Because each interrupt handler may be deferred by another one, there is no need to establish predefined priorities among hardware devices. This simplifies the kernel code and improves its portability.
难道LINUX的中断处理系统里没考虑实现中断优先级吗?请了解的说一说
2008-3-25 20:58 zx_wing
原帖由 dengcainiao 于 2008-3-25 20:32 发表
今天看ULK3中断处理的章节。其中4.3章有如下描述:
Linux interleaves kernel control paths for two major reasons:
To improve the throughput of programmable interrupt controllers and device cont ...
确实没有,linux不像windows使用了软件中断优先级概念,solaris好像也有。
2008-3-25 21:13 dengcainiao
恩,solaris是有,我向熟悉solaris的人了解过了。感觉中断优先级应该是中断系统里挺重要的一个概念,不知道为什么LINUX忽略了。。。
2008-3-25 21:30 zx_wing
原帖由 dengcainiao 于 2008-3-25 21:13 发表
恩,solaris是有,我向熟悉solaris的人了解过了。感觉中断优先级应该是中断系统里挺重要的一个概念,不知道为什么LINUX忽略了。。。
软件优先级是否一定很高效我看不见得,呃,可能我还没想出来这种模型在哪种情况下具有优势。
至于为啥linux没有软件中断优先级,我认为是和linux中断模型有关。
linux处理中断没有使用像solaris中的中断线程那种模型,对于中断的处理都是尽力原则,也就是尽可能快的处理中断,毕竟中断是紧急事件。要注意的是linux本身是通用操作系统,所以在实时性方面就要弱一点(实时性是我目前唯一想到的软件中断优先级的好处,当然linux也有为了实时性而引入的软件中断优先级的patch)。引入软件中断优先级有个条件(个人认为是必须条件),就是中断处理的例程是可以被调度的,说白了就是中断处理应该具有进程/线程上下文,而linux不是这种模型。
此外,linux并非完全不考虑中断频繁而带来的对进程的不公平性,不是还有一个soft_irq嘛。当中断过多的时候,通过ksoftirq内核线程来处理中断,某种意义上就是软件中断优先级的概念,因为线程本身是有优先级的。所以我认为,linux使用的中断模型是:尽可能的处理中断,当中断过多时引入内核线程从而引入优先级的概念。
以上是个人意见,欢迎讨论:lol:
2008-3-25 22:06 dengcainiao
原帖由 zx_wing 于 2008-3-25 21:30 发表
软件优先级是否一定很高效我看不见得,呃,可能我还没想出来这种模型在哪种情况下具有优势。
至于为啥linux没有软件中断优先级,我认为是和linux中断模型有关。
linux处理中断没有使用像solaris中的中断线程 ...
多谢你的回答。我是这样理解你的观点的,即LINUX的中断处理程序提倡尽量的简短,快速执行。将中断处理过程中比较耗时的部分放入软中断部分实现。当然在软中断中是开中断的,这样可以允许处理新的中断。而solaris这种中断模型的中断服务程序是线程化的本身具备进程上下文,可被调度,因此可以用优先级的形式来加强中断处理的实时性。
  如果我对你的观点理解大概正确的话,我还有一些疑问。我对solaris的中断部分不是很熟悉,但我想solaris可以中断线程化的部分应该和LINUX的软中断相仿,最底层的中断处理程序应该也没有进程上下文,是不能被调度的。但是solaris中实现中断优先级应该就是在最底层的中断处理程序中,而指的不是可中断线程化的部分。所以我对于中断优先级要建立在中断线程化处理的中断模型下的这种观点有些疑问。
  另外,ksoftirqd内核线程主要的目的应该是避免频繁的执行软中断,例如网络驱动中软中断处理程序会自举,如果没有这种机制,用户进程将出现比较严重的饥饿现象。而该线程本身并没有进行任何中断处理,只在系统空闲时运行,检索是否有标记的软中断未被执行,若有则执行之。
[ 本帖最后由 dengcainiao 于 2008-3-25 22:11 编辑 ]
2008-3-25 22:19 zx_wing
原帖由 dengcainiao 于 2008-3-25 21:13 发表
恩,solaris是有,我向熟悉solaris的人了解过了。感觉中断优先级应该是中断系统里挺重要的一个概念,不知道为什么LINUX忽略了。。。
刚才又想了一下,LZ说的软件优先级可能和我上面的回复指的不是一个东西。你是问为啥没实现根据CPU定义的外部中断优先级来屏蔽低优先级中断吧?
IA架构的CPU都提供TPR寄存器来屏蔽低优先级的中断,x86的linux实现似乎确实没用。个人认为理由比较简单,就是允许中断嵌套。
如果使用TPR来控制中断优先级,举个例子:
例如优先级15的中断发生了,我们通过TPR把优先级小于15的中断都屏蔽了。但这样仅仅是让15优先级的中断先处理完而已,并且禁止了中断嵌套。而linux对大负荷的中断都是放到下半部去处理的,所以完全没有理由阻止中断嵌套,毕竟上半部处理是个很短的过程。
2008-3-25 22:24 zx_wing
原帖由 dengcainiao 于 2008-3-25 22:06 发表
多谢你的回答。我是这样理解你的观点的,即LINUX的中断处理程序提倡尽量的简短,快速执行。将中断处理过程中比较耗时的部分放入软中断部分实现。当然在软中断中是开中断的,这样可以允许处理新的中断。而sola ...
是的,LZ理解是对的。
你的疑问我在上面的帖子回复了,因为在上半部处理使用中断优先级的唯一结果就是阻止了中断嵌套,但这样有什么好处呢?我没想到。
此外对ksoftirqd论述是对的,它确实是为了在进程和中断间取平衡的而引入的,我的意思是由于ksoftirqd是线程,同样也引入了中断优先级的概念,进程优先级比它高,先执行就不会饥饿了嘛。呵呵,其实和都是一个道理。
2008-3-25 22:29 zx_wing
还有一个移植性的问题,假设有的CPU架构没有实现外部中断优先级概念,那么linux的维护就麻烦了,一个系统有几种机制。
而win和solairs本身就是对特定架构的操作系统,现在windows就只支持IA架构的CPU。
solaris移植到x86了,而x86正好又是有外部中断优先级的。
linux就不一样,支持那么多架构,而且可能会越来越多。
2008-3-25 22:30 dengcainiao
我对别的操作系统中断模型没多少了解。不清楚有没有操作系统实现中断处理程序是不区分上半部,下半部的?如果真是有哪个操作系统把所有的中断处理过程都放在一起处理,我想你说的那些原因就比较有道理了。但是就solarsi来说,我感觉它的线程化的中断处理过程应该类似与linux的软中断机制,实际上也是把完整的中断处理程序分成两块来做。如果我的感觉是正确的,那怎么解释solaris中实现的中断优先级呢?solaris12如果看到了这个帖子给解释一下solaris里的实现,是不是象我考虑的那样
[ 本帖最后由 dengcainiao 于 2008-3-25 22:33 编辑 ]
2008-3-25 22:31 dengcainiao
原帖由 zx_wing 于 2008-3-25 22:29 发表
还有一个移植性的问题,假设有的CPU架构没有实现外部中断优先级概念,那么linux的维护就麻烦了,一个系统有几种机制。
而win和solairs本身就是对特定架构的操作系统,现在windows就只支持IA架构的CPU。
solar ...
这个的确是这样,linux的这种中断模型确实有很好的移植性。
2008-3-25 22:35 zx_wing
原帖由 dengcainiao 于 2008-3-25 22:30 发表
我对别的操作系统中断模型没多少了解。不清楚有没有操作系统实现中断处理程序是不区分上半部,下半部的?如果真是有哪个操作系统把所有的中断处理过程都放在一起处理,我想你说的那些原因就比较有力了。但是就s ...
solaris上下半部的问题我也问过solaris12,它确实有上半部。
至于下半部嘛,我想和linux不同的地方在于,linux执行完上半部后紧接着马上就执行下半部,这就是所谓的尽可能快的处理中断。只有中断过多时下半部才推后。
我估计solaris的处理是,上半部执行完后,就把这个中断的下半部放到一个内核线程里,至于这个下半部什么时候执行,就要等到该线程被调度到了。
所以我认为solaris中的软件中断优先级的概念,主要应该在于这个中断处理线程的优先级。
2008-3-25 22:51 zx_wing
原帖由 dengcainiao 于 2008-3-25 22:30 发表
我对别的操作系统中断模型没多少了解。不清楚有没有操作系统实现中断处理程序是不区分上半部,下半部的?如果真是有哪个操作系统把所有的中断处理过程都放在一起处理,我想你说的那些原因就比较有道理了。但是就 ...
>>如果真是有哪个操作系统把所有的中断处理过程都放在一起处理,我想你说的那些原因就比较有道理了。

这话我没理解到。我认为正好和你说的相反,在上半部没有实现中断优先级正是因为linux的中断处理是分上下部分的。如果把中断处理放在一起,恰恰需要实现中断优先级。
试想一下,一个高优先级中断还没处理完,就被低优先级中断打断了,而低优先级中断频繁发生,会导致高优先级中断得不到处理,不正需要屏蔽低优先级中断吗?
而linux中断分两部分,所以高优先级中断不怕被打断,因为低优先级中断的上半部处理会马上完成。注意,在中断嵌套的时候linux只处理中断的上半部哦,在进行下半部之前有个判断如下:
if (!in_interrupt() && local_softirq_pending())
  invoke_softirq();
所以高优先级的中断是不怕被低优先级中断打断的。
2008-3-25 23:11 dengcainiao
>>如果真是有哪个操作系统把所有的中断处理过程都放在一起处理,我想你说的那些原因就比较有道理了。
这话我没理解到。我认为正好和你说的相反,在上半部没有实现中断优先级正是因为linux的中断处理是分上下部分的。如果把中断处理放在一起,恰恰需要实现中断优先级。
试想一下,一个高优先级中断还没处理完,就被低优先级中断打断了...................................
可能我没说清楚,其实我要表达的意思就是你后边解释的。我也认为中断优先级对那些不分上下部的中断处理程序更有意义。问题是象solaris这样的操作系统它实际上是把中断处理程序分开处理的,想必它实际的上半部处理也如LINUX一样是十分短小精悍的。即使在这种情况下它仍然实现了中断优先级,这无疑使代码复杂度增加了很多,不了解solaris等操作系统是出于什么考虑增加这种机制的?
2008-3-25 23:14 dengcainiao
另外,我感觉solaris中应该不是所有设备的中断处理程序都可以用线程化的中断处理程序来实现下半部,类似时钟中断这样的中断处理程序我想应该不会用中断线程化来处理
2008-3-25 23:15 zx_wing
原帖由 dengcainiao 于 2008-3-25 23:11 发表
>>如果真是有哪个操作系统把所有的中断处理过程都放在一起处理,我想你说的那些原因就比较有道理了。
这话我没理解到。我认为正好和你说的相反,在上半部没有实现中断优先级正是因为linux的中断处理是分上下 ...
那就等solaris12同志来解释一下solaris中的软件中断优先级到底是指:CPU规定的中断优先级还是中断处理线程的优先级
2008-3-25 23:16 zx_wing
原帖由 dengcainiao 于 2008-3-25 23:14 发表
另外,我感觉solaris中应该不是所有设备的中断处理程序都可以用线程化的中断处理程序来实现下半部,类似时钟中断这样的中断处理程序我想应该不会用中断线程化来处理
LZ考虑的很深入啊,赞一个!:em09:
应该是不行,至少linux的中断线程化的patch对于时钟这样的中断是不能被线程化的。
2008-3-26 08:13 Solaris12
原帖由 zx_wing 于 2008-3-25 21:30 发表
软件优先级是否一定很高效我看不见得,呃,可能我还没想出来这种模型在哪种情况下具有优势。
至于为啥linux没有软件中断优先级,我认为是和linux中断模型有关。
linux处理中断没有使用像solaris中的中断线程 ...
你说的我非常赞同, 目前Solaris, Freebsd, windows都支持中断线程:
1. 中断优先级和中断线程化有关, 因为中断线程成为调度实体, 所以必须要有优先级的概念.
2. 中断线程化主要是为了实时性的支持.
BTW, Linux不是有patch可以支持中断线程化吗?
2008-3-26 08:21 Solaris12
原帖由 zx_wing 于 2008-3-25 22:19 发表
刚才又想了一下,LZ说的软件优先级可能和我上面的回复指的不是一个东西。你是问为啥没实现根据CPU定义的外部中断优先级来屏蔽低优先级中断吧?
IA架构的CPU都提供TPR寄存器来屏蔽低优先级的中断,x86的linux ...
Solaris应该是逻辑上支持中断嵌套的, 这个需要通过中断线程来实现. 当然这块代码我并没有仔细看过, 不知道是不是如你所说. 我的结论来自于用kernel debugger调试时观察的现象.
Solaris中断处理时, 会设置CPU的PIL, 这个就指示了当前CPU可以被哪些级别的中断打断.
看来我有空的时候可以看看这块的实现了.
[ 本帖最后由 Solaris12 于 2008-3-26 08:26 编辑 ]
2008-3-26 08:21 dengcainiao
软件优先级和中断线程化相关这点我也认同。但是我觉得象solaris这样的操作系统实现中断优先级(这里指的不是软件优先级)和中断线程化没什么关系,更像是为驱动程序实现中断处理程序提供更大的空间,可以允许部分比较特殊的硬件实现中断处理程序完全的原子执行。而中断线程化中提到的优先级应该是一个更宽泛的优先级概念,里边包含的含义应该跨越了中断本身,还涉及到和进程的优先级比较。我觉得这两者还是有区别的。这只是我自己的考虑,不对的地方希望大家指点。
2008-3-26 08:31 Solaris12
原帖由 zx_wing 于 2008-3-25 22:29 发表
还有一个移植性的问题,假设有的CPU架构没有实现外部中断优先级概念,那么linux的维护就麻烦了,一个系统有几种机制。
而win和solairs本身就是对特定架构的操作系统,现在windows就只支持IA架构的CPU。
solar ...
似乎不可以对优先级编程的系统不多. 目前Solaris支持SPARC, x86, 还有powerpc, 还有IBM的某些大型主机.
Solaris设置CPU PIL的函数似乎来自于早期某个版本的UNIX.
Solaris12
原帖由 zx_wing 于 2008-3-25 22:24 发表
是的,LZ理解是对的。
你的疑问我在上面的帖子回复了,因为在上半部处理使用中断优先级的唯一结果就是阻止了中断嵌套,但这样有什么好处呢?我没想到。
此外对ksoftirqd论述是对的,它确实是为了在进程和中 ...
这点我非常同意, Solaris里写驱动程序, 根本没有上下半部的概念.
但实际上, Solaris在dispatch中断之前, 会有一个短暂的上半部, 但它不在驱动程序里实现.
再加上中断线程的有优先级,可以按优先级调度, 因此驱动的处理就简单多了.
2008-3-26 08:38 Solaris12
原帖由 dengcainiao 于 2008-3-25 23:14 发表
另外,我感觉solaris中应该不是所有设备的中断处理程序都可以用线程化的中断处理程序来实现下半部,类似时钟中断这样的中断处理程序我想应该不会用中断线程化来处理
Solaris的中断优先级有16个级别, 时钟中断也是线程化的.时钟中断以上的中断, 例如处理器间中断不是线程化的.
2008-3-26 08:41 Solaris12
原帖由 zx_wing 于 2008-3-25 23:15 发表
那就等solaris12同志来解释一下solaris中的软件中断优先级到底是指:CPU规定的中断优先级还是中断处理线程的优先级
这个都做到了:
1. 有一个PIL(processor interrupt level)来规定CPU的中断优先级
2. 中断线程优先级主要是为线程调度用的,可以映射到整个系统的调度优先级上.
2008-3-26 08:44 Solaris12
原帖由 zx_wing 于 2008-3-25 23:16 发表
LZ考虑的很深入啊,赞一个!:em09:
应该是不行,至少linux的中断线程化的patch对于时钟这样的中断是不能被线程化的。
这个在Solaris上有点特殊:
Solaris上对时钟编程, 是一个高优先级中断, 即没有线程实体. 这个中断里会遍历一个树结构, 真正的系统时间片处理是注册在树结构上的.
每个tick到来,这个真正意义上的时钟中断处理是线程方式执行的, 在整个系统线程中,优先级最高.
2008-3-26 08:49 dengcainiao
原帖由 Solaris12 于 2008-3-26 08:34 发表
这点我非常同意, Solaris里写驱动程序, 根本没有上下半部的概念.
但实际上, Solaris在dispatch中断之前, 会有一个短暂的上半部, 但它不在驱动程序里实现.
再加上中断线程的有优先级,可以按优先级调度,  ...
这样说的话想来用来做中断处理的线程优先级应该普遍高于普通线程,而在中断线程内部再进行优先级细分,这样才能保证中断执行的实时性。这种处理方式其实也达到了软中断的主要目的,并且有更细的粒度,感觉比linux的实现要好一些。不过对于这种模型还有些想不通的地方,如果有设备很频繁的触发驱动,而该设备的中断线程的优先级又比较高(例如网卡,SCSI?不知道是否准确)会不会引起用户进程的饥饿?
[ 本帖最后由 dengcainiao 于 2008-3-26 08:51 编辑 ]
2008-3-26 08:54 dengcainiao
另外solaris12,你所说的solaris中实现的中断优先级指的是中断线程化后的中断线程优先级吗??还是硬件中断本身的优先级?
2008-3-26 09:59 Solaris12
原帖由 dengcainiao 于 2008-3-26 08:54 发表
另外solaris12,你所说的solaris中实现的中断优先级指的是中断线程化后的中断线程优先级吗??还是硬件中断本身的优先级?
我前面回复了, 硬件和中断线程的优先级是对应的.
2008-3-26 10:03 Solaris12
原帖由 dengcainiao 于 2008-3-26 08:49 发表
这样说的话想来用来做中断处理的线程优先级应该普遍高于普通线程,而在中断线程内部再进行优先级细分,这样才能保证中断执行的实时性。这种处理方式其实也达到了软中断的主要目的,并且有更细的粒度,感觉比l ...
极端情况下, 中断过度频繁会导致用户进程饥饿.
在UP系统上,比较难解决.
在SMP系统上, 中断dispacher 会对中断计数, 达到门限值后, 触发一个内核抢占, 把用户线程从那个中断所在CPU上偷到其它CPU上.
2008-3-26 10:11 dengcainiao
原帖由 Solaris12 于 2008-3-26 09:59 发表
我前面回复了, 硬件和中断线程的优先级是对应的.
你的意思是说中断线程的优先级是参照硬件优先级设计的.是否说在执行高优先级的中断线程时要将低优先级的中断屏蔽掉?
2008-3-26 10:16 Solaris12
原帖由 dengcainiao 于 2008-3-26 10:11 发表
你的意思是说中断线程的优先级是参照硬件优先级设计的.是否说在执行高优先级的中断线程时要将低优先级的中断屏蔽掉?
是这样的, 低优先级无法中断高优先级中断.
Solaris把中断控制器的处理抽象出一套通用方法, setspl就是做你说的屏蔽处理的
x86的具体实现, 可以查看apic代码的实现:
usr/src/uts/i86pc/io/pcplusmp/apic.c
/*
* Mask all interrupts below or equal to the given IPL
*/
static void
apic_setspl(int ipl)
{
...............
}
我也没有好好看过这块的代码, 所以再细节我也帮不了你了.
[ 本帖最后由 Solaris12 于 2008-3-26 10:24 编辑 ]
2008-3-26 10:23 dengcainiao
呵呵,看来我一开始的思路有问题。我总以为solaris的中断线程化只是实现后半部的一种手段。现在看来solaris整个中断服务程序都是线程化的。
2008-3-26 14:28 zx_wing
原帖由 Solaris12 于 2008-3-26 08:41 发表
这个都做到了:
1. 有一个PIL(processor interrupt level)来规定CPU的中断优先级
2. 中断线程优先级主要是为线程调度用的,可以映射到整个系统的调度优先级上.
>>有一个PIL(processor interrupt level)来规定CPU的中断优先级
这个PIL是如何实现和使用的呢?
2008-3-26 15:20 dengcainiao
我猜想PIL应该是标识当前CPU中断优先级的,不知道具体实现使用什么,或者是寄存器或者是针对每CPU的一个变量。猜测应该是在发生中断并被CPU处理时,以当前中断的优先级更新PIL,并以此做为标准来判断是否响应当前中断,超过该优先级的中断才被系统相应。
[ 本帖最后由 dengcainiao 于 2008-3-26 15:21 编辑 ]
2008-3-26 15:24 zx_wing
原帖由 dengcainiao 于 2008-3-26 15:20 发表
我猜想PIL应该是标识当前CPU中断优先级的,不知道具体实现使用什么,或者是寄存器或者是针对每CPU的一个变量。猜测应该是在发生中断并被CPU处理时,以当前中断的优先级更新PIL,并以此做为标准来判断是否响应当 ...
那就是IA架构CPU TPR寄存器的功能嘛。
但这有什么好处呢?前面已经说过了,这样做的唯一用处就是减少了中断嵌套,因为低优先级的中断被屏蔽了
2008-3-26 15:30 dengcainiao
我刚才搜索了一下PIL的东西,没什么太大的收获,回头具体的可以让solaris12来讲一下。但粗略感觉我上边的猜想是错误的,好像PIL仅仅是个数值。solaris的中断处理是线程化的,当每种中断发生时对应的中断线程优先级应该是用PIL来描述的,并根据PIL计算出来的。这个PIL或许对应CPU规定的硬件中断优先级,应该是一组静态的值。solaris12有空帮忙解释解释
[ 本帖最后由 dengcainiao 于 2008-3-26 15:32 编辑 ]
2008-3-27 09:20 human3000
linux 软中断.....也是依靠一个内核线程处理的么....硬处理只作快速简单的处理,软中断.....不就是按照优先级排的一个数组么
2008-3-27 09:28 human3000
还有内核线程的优先级一般都比较低(主要是为了提高性能)
ksoftirq也是, 我在想如果写一个FIFO优先级别的进程,不放cpu....系统不铁定挂掉
至少我从CFS之前的调度系统里看是这样
2008-3-27 09:50 Solaris12
原帖由 dengcainiao 于 2008-3-26 15:30 发表
我刚才搜索了一下PIL的东西,没什么太大的收获,回头具体的可以让solaris12来讲一下。但粗略感觉我上边的猜想是错误的,好像PIL仅仅是个数值。solaris的中断处理是线程化的,当每种中断发生时对应的中断线程优先 ...
PIL和中断线程优先级一一对应, 范围从0-15, 其中10以上的PIL没有对应的中断线程.
中断线程在per-cpu的中断线程池里, 每个CPU共有10个.
cpu_1 -> intr_thread_list
|
cpu_2 -> intr_thread_list
...............
cpu_n -> intr_thread_list
2008-3-28 10:18 motalelf
按道理讲,应该是一种没有优先级的模型。
但是实现中,和理论上,似乎有点区别。
要实现无优先级的模型,有两种比较可能的手段:
1)初始化(A)PIC时,使用某种设置手段,使将来产生中断时,取消优先级的比较。
2)初始化(A)PIC时,使用的是一种有优先级的模型。但当中断到来时,马上EOI并且mask。另优先级的判断名存实亡。
APIC可能无法实现1),它只能设置当前CPU不理会某个定值以下优先级的中断,这个寄存器似乎叫TRP?
但即使TRP设置为0,CPU的的当前优先级也是max(TRP,当前中断)。所以不仅需要TRP设置为0,还要马上EOI & mask。这样才能做到CPU的优先级总是0,从而实现无优先级模型。
对于IO-APIC产生的level中断,并不是马上EOI & mask,而是在处理完上半部分后,才发出EOI。所以在处理上半部分时,是不是有优先级的??
而且这里似乎有些问题,对于level中断,CPU在发EOI给local APIC时,local APIC应转发给IO-APIC一个EOI。但某些APIC上有bug,local APIC并不转发给IO-APIC这个EOI。
linux为避免这个bug,在发给local APIC一个EOI后,根本不报local APIC会转发给IO-APIC一个EOI的希望,直接操作IO-APIC上的LVT,首先edge & mask,然后level & unmask,相当于手工给了IO-APIC一个EOI。
这里没考虑这条中断线已经被设置为IRQ_DISABLE的情况,一律edge & mask,然后level & unmask。
2008-3-28 10:23 albcamus
原帖由 motalelf 于 2008-3-28 10:18 发表
按道理讲,应该是一种没有优先级的模型。
但是实现中,和理论上,似乎有点区别。
要实现无优先级的模型,有两种比较可能的手段:
1)初始化(A)PIC时,使用某种设置手段,使将来产生中断时,取消优先级的 ...
是TPR。  这个仲裁机制相当复杂, 手册目前还没看完, 似乎还有ABR、PPR等等?
此外, 现在的linux内核已经, 至少, 设置TPR了, 我在代码里看到过。
关于ACK和EOI等, 我开个新贴。motalelf
它的仲裁机制应该是:
1) 每CPU有一个固定的优先级,它将不会理会这个定值以下的中断。
2) CPU正在处理的中断,有一个优先级,在EOI之前,CPU也不会理会这个优先级以下的中断
CPU的当前优先级就应该是1)与2)中的最大者。
估计你指的TPR可能是1),它总是会将这个值设置为0。
2008-3-28 11:45 zx_wing
原帖由 albcamus 于 2008-3-28 10:23 发表
是TPR。  这个仲裁机制相当复杂, 手册目前还没看完, 似乎还有ABR、PPR等等?
此外, 现在的linux内核已经, 至少, 设置TPR了, 我在代码里看到过。
关于ACK和EOI等, 我开个新贴。
换个帖也好,linux不使用TPR的优先级功能。
没有优先级功能,只有中断平衡功能
2008-3-29 04:52 zhu616
国际私法
*** 作者被禁止或删除 内容自动屏蔽 ***
2008-4-1 23:30 mustang88
:em14: :em14:
2008-4-5 02:38 sudy
原帖由 zx_wing 于 2008-3-26 15:24 发表
那就是IA架构CPU TPR寄存器的功能嘛。
但这有什么好处呢?前面已经说过了,这样做的唯一用处就是减少了中断嵌套,因为低优先级的中断被屏蔽了
IPL是一个Solaris抽象的概念,map到sparc上时,是sparc内部的一个控制寄存器,map到IA32上时,是TPR
BTW,如果系统没有APIC,只有PIC,也是可以实现IPL的吧,mask PIC就行了?
这个东东的好处对OS而言就是对中断优先级的抽象啦
2008-4-5 03:12 sudy
回复 #45 sudy 的帖子
关于中断优先级(IRQL),我觉得应该从两个方面来看:OS和硬件。两者相互联系,又相互区别:)
先从OS来看吧,为什么要IRQL呢,直接的好处就是抽象啰,不管你硬件是什么样子,我都可以抽象出一个中断优先级来。经典的例子就是Windows了,从NT4.0起就有这个东东了吧?优先级一共有32个,从0~31,数字越大优先级越高,依次是Passive,APC,DPC,Device n, clock, ipi,high。有了这个抽象之后呢,kernel开发者就幸福啦,到某个优先级,我直接raise/low就可以了。
在从硬件的角度来看,外部设备产生的中断是否有优先级,或者优先级是否可以编程,这些都是在中断控制器上实现的吧,比如PIC,设备的终端优先级就是固定了的吧,timer的中断就是最高的。
那剩下的就是怎样将OS抽象出来的IRQL map到硬件上去,这就是HAL要做的事情啦。举最简单的例子,怎样将windows的32个中断优先级map到PIC上:首先是device这一级的中断优先级和PIC上设备IRQ号对应,剩下的就是如何处理低于硬件中断的irql和高于硬件中断的irql了。对低于硬件中断的irql(passive,apc,dpc),能想到的方法就是中断优先级队列了(hmm,这个跟linux的 softirq/tasklet比较像了哇),对高于硬件中断的irql呢,那就mask掉所有的硬件中断,然后在排队就实现了吧。这也说明IRQL不一定就是在APIC下才能实现了。BTW:在nt4.0的年代已经有apic了吗(不清楚。。。)?还有一个问题就是,APIC里面一定要添加TPR吗?按照前面的推理,不用TPR,直接mask中断呢?有了TPR之后呢,或许只是方便了使用(不知道对不对,大胆假设。。)
从上面的分析,可以得出Linux里面并没有像windows那样完整的关于IRQL的东东。
个人愚见,欢迎板砖。。。:em02:
2008-4-5 12:17 zx_wing
原帖由 sudy 于 2008-4-5 02:38 发表
IPL是一个Solaris抽象的概念,map到sparc上时,是sparc内部的一个控制寄存器,map到IA32上时,是TPR
BTW,如果系统没有APIC,只有PIC,也是可以实现IPL的吧,mask PIC就行了?
这个东东的好处对OS而言就是对 ...
多谢指教。
通过mask中断线是可以提供和TPR一样的功能。但TPR也不仅仅是mask低优先级中断的功能,还有决定当前CPU处理中断优先级的功能。
此外,前面已经说了,这种mask低优先级中断的功能对linux来说用处不大,linux本身的前后半部的中断处理可以很好的响应中断嵌套。
2008-4-5 14:26 sudy
原帖由 zx_wing 于 2008-4-5 12:17 发表
多谢指教。
通过mask中断线是可以提供和TPR一样的功能。但TPR也不仅仅是mask低优先级中断的功能,还有决定当前CPU处理中断优先级的功能。
此外,前面已经说了,这种mask低优先级中断的功能对linux来说用处不 ...
指教谈不上,共同学习啦
关于mask低优先级的问题,现在的OS中,windows的DPC,linux的BH,其运行时的优先级都低于外部硬件中断,所以看起来mask低优先级从这个意义上讲是没有什么意义。但如果有一天linux将bh的优先级高于某个硬件中断优先级的时候,TPR就有用了。。。TPR这种东东至少提供了一种可能性吧,可以方便的实现IRQL
2008-4-6 12:27 zx_wing
原帖由 sudy 于 2008-4-5 14:26 发表
指教谈不上,共同学习啦
关于mask低优先级的问题,现在的OS中,windows的DPC,linux的BH,其运行时的优先级都低于外部硬件中断,所以看起来mask低优先级从这个意义上讲是没有什么意义。但如果有一天linux将b ...
TPR倒并非无用,至少windows就用它。
只是在当前linux的中断模型下,它的用处不大。从现在的PC架构来看,后半部处理高于前半部的优先级可能性不大。对于优先级特别高的中断例如时钟完全可以关中断执行。所以只有在SMP情况下,充分使用中断re-directing功能时,TPR的效用才能真正发挥。



本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/49221/showart_683435.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP