免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: dengcainiao
打印 上一主题 下一主题

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

论坛徽章:
0
31 [报告]
发表于 2008-03-26 10:23 |只看该作者
呵呵,看来我一开始的思路有问题。我总以为solaris的中断线程化只是实现后半部的一种手段。现在看来solaris整个中断服务程序都是线程化的。

论坛徽章:
0
32 [报告]
发表于 2008-03-26 14:28 |只看该作者
原帖由 Solaris12 于 2008-3-26 08:41 发表


这个都做到了:

1. 有一个PIL(processor interrupt level)来规定CPU的中断优先级
2. 中断线程优先级主要是为线程调度用的,可以映射到整个系统的调度优先级上.

>>有一个PIL(processor interrupt level)来规定CPU的中断优先级

这个PIL是如何实现和使用的呢?

论坛徽章:
0
33 [报告]
发表于 2008-03-26 15:20 |只看该作者
我猜想PIL应该是标识当前CPU中断优先级的,不知道具体实现使用什么,或者是寄存器或者是针对每CPU的一个变量。猜测应该是在发生中断并被CPU处理时,以当前中断的优先级更新PIL,并以此做为标准来判断是否响应当前中断,超过该优先级的中断才被系统相应。

[ 本帖最后由 dengcainiao 于 2008-3-26 15:21 编辑 ]

论坛徽章:
0
34 [报告]
发表于 2008-03-26 15:24 |只看该作者
原帖由 dengcainiao 于 2008-3-26 15:20 发表
我猜想PIL应该是标识当前CPU中断优先级的,不知道具体实现使用什么,或者是寄存器或者是针对每CPU的一个变量。猜测应该是在发生中断并被CPU处理时,以当前中断的优先级更新PIL,并以此做为标准来判断是否响应当 ...

那就是IA架构CPU TPR寄存器的功能嘛。
但这有什么好处呢?前面已经说过了,这样做的唯一用处就是减少了中断嵌套,因为低优先级的中断被屏蔽了

论坛徽章:
0
35 [报告]
发表于 2008-03-26 15:30 |只看该作者
我刚才搜索了一下PIL的东西,没什么太大的收获,回头具体的可以让solaris12来讲一下。但粗略感觉我上边的猜想是错误的,好像PIL仅仅是个数值。solaris的中断处理是线程化的,当每种中断发生时对应的中断线程优先级应该是用PIL来描述的,并根据PIL计算出来的。这个PIL或许对应CPU规定的硬件中断优先级,应该是一组静态的值。solaris12有空帮忙解释解释

[ 本帖最后由 dengcainiao 于 2008-3-26 15:32 编辑 ]

论坛徽章:
0
36 [报告]
发表于 2008-03-27 09:20 |只看该作者
linux 软中断.....也是依靠一个内核线程处理的么....硬处理只作快速简单的处理,软中断.....不就是按照优先级排的一个数组么

论坛徽章:
0
37 [报告]
发表于 2008-03-27 09:28 |只看该作者
还有内核线程的优先级一般都比较低(主要是为了提高性能)
ksoftirq也是, 我在想如果写一个FIFO优先级别的进程,不放cpu....系统不铁定挂掉


至少我从CFS之前的调度系统里看是这样

论坛徽章:
0
38 [报告]
发表于 2008-03-27 09:50 |只看该作者
原帖由 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

论坛徽章:
0
39 [报告]
发表于 2008-03-28 10:18 |只看该作者
按道理讲,应该是一种没有优先级的模型。

但是实现中,和理论上,似乎有点区别。

要实现无优先级的模型,有两种比较可能的手段:
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。

论坛徽章:
0
40 [报告]
发表于 2008-03-28 10:23 |只看该作者
原帖由 motalelf 于 2008-3-28 10:18 发表
按道理讲,应该是一种没有优先级的模型。

但是实现中,和理论上,似乎有点区别。

要实现无优先级的模型,有两种比较可能的手段:
1)初始化(A)PIC时,使用某种设置手段,使将来产生中断时,取消优先级的 ...


是TPR。  这个仲裁机制相当复杂, 手册目前还没看完, 似乎还有ABR、PPR等等?

此外, 现在的linux内核已经, 至少, 设置TPR了, 我在代码里看到过。

关于ACK和EOI等, 我开个新贴。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP