免费注册 查看新帖 |

Chinaunix

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

linux 中断处理问题(中断嵌套) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-25 11:14 |只看该作者 |倒序浏览
linux 中断处理问题(中断嵌套):

情景描述:  
     假设有3个中断int0,int1,int2;中断int0的优先级高于int1;中断int1的优先级高于int2;
  问题:
     当cpu正在处理中断int1的时候,有3种嵌套情况发生
     1. 如果是int0的中断发生请求,则先处理int0,之后再回来处理int1   
     2. 如果是int1中断再次发生,因为是同级中断嵌套,这个时候还是处理原来的int1,但是第二次发生的int1是被丢弃了???还是会被保持,直到得到处理???
                 3. 如果是int2中断发生请求,这个时候int2是否会保持状态,然后等int1处理完后再处理此时的int2????
                 
说明:
    我对 1 的情况没有疑问;主要就是2,3的时候;中断状态是否能够保持的问题不太清楚;麻烦哪位兄弟姐妹帮哈忙哈 嘿嘿 谢谢

论坛徽章:
0
2 [报告]
发表于 2008-01-25 16:44 |只看该作者
中断处理器有一个中断优先级
CPU里面也有一个中断优先级
两种中断优先级的处理方式是完全不一样的,独立运作,覆盖范围也不同。

论坛徽章:
0
3 [报告]
发表于 2008-01-25 17:35 |只看该作者
如果没有记错的话,中断应该有一个位图,表示是否有中断待处理。
当中断发生的时候,无论怎样,都要设置这个位图。
之后,会根据中断的开关情况,来决定是否立即处理这个中断。
系统中有一个中断掩码,当某个中断被关闭时,就修改这个掩码,达到不处理这个中断的效果。

楼主说的2、3里面,两个中断都是不会丢弃的。
因为前面说了,每个中断只有一个位记录有没有发生。如果中断处理时间长了,后面来的中断,就相当于被丢弃了。

论坛徽章:
0
4 [报告]
发表于 2008-01-26 19:55 |只看该作者
原帖由 lugj 于 2008-1-25 11:14 发表
linux 中断处理问题(中断嵌套):

情景描述:  
     假设有3个中断int0,int1,int2;中断int0的优先级高于int1;中断int1的优先级高于int2;
  问题:
     当cpu正在处理中断int1的时候,有3种嵌套情况发 ...

linux和windows不同,linux没有一个软件的外部中断优先级模型,而windows则有称为IRQL的模型。
linux中中断处理简单的分为了上半部和下半部。上半部操作进行时,中断是关掉的,此时不会有任何中断打断当前中断处理函数而发生嵌套。
当中断处理函数执行到下半部后,中断被打开,此时任何一个中断都可以打断当前中断处理函数的执行。

所以对于lz的2、3两种情况,当高优先级中断处理函数在执行时,如果处于上半部,则不会有低优先级中断发生;如果处于下半部,则低优先级中断会打断高优先级中断处理函数,从而发生中断嵌套。

IA架构的CPU都提供TPR寄存器这样的硬件机制来帮助实现软件上的中断优先级概念,但linux似乎并没有使用。

论坛徽章:
0
5 [报告]
发表于 2009-08-12 13:16 |只看该作者
原帖由 zx_wing 于 2008-1-26 19:55 发表

linux和windows不同,linux没有一个软件的外部中断优先级模型,而windows则有称为IRQL的模型。
linux中中断处理简单的分为了上半部和下半部。上半部操作进行时,中断是关掉的,此时不会有任何中断打断当前中 ...

貌似是说下半部间会发生嵌套?

论坛徽章:
0
6 [报告]
发表于 2009-08-12 13:30 |只看该作者
这个和CPU有关,和系统处理有关。如VxWorks for PowerPC中CPU就只有一个Externel Interrupt,中断之后自动清除MSR[EE](关闭外部中断),在Vxworks的中断总入口中设设置中断控制器上的掩码屏蔽本中断以及低级别的中断,然后使能Externel Interrupt,此时只有高级别的中断能再次响应,其它中断见2楼的描述。当然不一定用户的中断函数结束才使能本中断,可以在过了一定阶段之后就使能,这个看需求的。
向这种中断处理模型外部中断本身没有级别概念,如果MSR[EE]没清除,只要产生中断就中断CPU执行,关键是软件中编程控制PIC来产生级别的屏蔽,这样和系统设计就有关了。

Linux的话感觉4楼说的是正确的吧,没仔细研究过。

[ 本帖最后由 Cyberman.Wu 于 2009-8-12 13:41 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2009-08-13 09:40 |只看该作者
2. 如果是int1中断再次发生,因为是同级中断嵌套,这个时候还是处理原来的int1,但是第二次发生的int1是被丢弃了???还是会被保持,直到得到处理???

第二次发生的int1会被保留,等第一次int1处理完了再处理一次。但是如果第一次int1还没处理完又发生第三次第四次int1,就会与第二次合并成一个

3. 如果是int2中断发生请求,这个时候int2是否会保持状态,然后等int1处理完后再处理此时的int2????

中断处理的时候其实有一部分是开中断的(除非设置了快速中断标志),开中断情况下发生其他中断会打断当前中断,等其他中断执行完了再回来执行原来的中断,因此这种情况下不需要保存。
至于在处理int1时关中断情况下发生int2会不会保存,我个人认为这个是由pic保存的,因为关中断也是硬件实现的,这种情况我感觉应该是int1处理完重新开中断之后由pic再次产生int2,不知道对不对。牛蛙兄讲apic的大作还没认真看呢

论坛徽章:
0
8 [报告]
发表于 2009-08-14 18:14 |只看该作者
原帖由 zx_wing 于 2008-1-26 19:55 发表

IA架构的CPU都提供TPR寄存器这样的硬件机制来帮助实现软件上的中断优先级概念,但linux似乎并没有使用。..


Solaris用了TPR来实现中断优先级。但是现在发现每个优先级上的中断数目已经快不能满足未来的硬件需要了,所以马上就放弃利用TPR实现中断优先级了。

论坛徽章:
0
9 [报告]
发表于 2011-07-12 13:12 |只看该作者
Linux 有个patch把所有的irq转成一个task, 这样最底层的中断处理就是wakeup这个task, 这样做和HW支持中断嵌套实现的功能就差不多了。

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
10 [报告]
发表于 2011-10-09 23:22 |只看该作者
这块快忘了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP