免费注册 查看新帖 |

Chinaunix

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

关于一些中断讨论的补充 [复制链接]

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-08-21 13:11 |只看该作者 |倒序浏览
本帖最后由 smalloc 于 2011-08-11 11:56 编辑

这个讨论主要是基于以下3个帖子

http://linux.chinaunix.net/bbs/thread-996409-1-1.html
http://linux.chinaunix.net/bbs/viewthread.php?tid=987016
http://bbs2.chinaunix.net/viewth ... ;extra=&page=16

由于原贴,特别第一个精华帖子已经写的非常详细了.这里只对一些还没有详细说明的地方再说明


首先详细分析8259a的过程.
3个比较重要的的寄存器IRR ISR IMR,INTR是对CPU的请求线.
IRR能存储一个达到的中断请求,不论是edge还是level的.实际上下面会看到edge能长期存储,
而level只能维持一个时钟周期.
IMR屏蔽的是由IRR中存储的请求产生的INTR,所以不管IMR是否做屏蔽,IRR都会存储.

ISR和EOI的作用:
当INTR达到CPU后有2次硬件的ACK通过INTA传回来.注意这个动作纯粹是CPU硬件产生的.
CPU通过第2次ACK时在数据线获得中断号跳到相应的中断入口开始执行中断程序.
通过程序写EOI使得ISR最高为1的bit清0.
8259A文档提到.当2次ACK期间出现了一个比当前中断更高优先级别的中断,
则在第2次ACK时INTR变为无效,等一段不确定时间重新变为有效.
很显然有效的INTR将重新触发CPU开始一个中断处理,只要这时CPU的IF标志是使能的.
也就是说新的中断处理程序可能发生在上一个中断程序还没有写EOI之前.这样ISR中会同时有多个位是置1的.
因为文档中并没有明确提到新的中断的INTR必须等到写EOI后才触发,
如果真是这样,那么ISR的存在就显得没那么必要了.


8259A中edge和level的定义:
edge是上升沿则将IRR置1,并且高电平可以一直保持到下一个edge中断
而level是高电平有效并且应该在EOI到来前取消,否则CPU必须通过软件禁止第2次中断发生
注意到写EOI前先屏蔽了本级别中断,就是因为操作发生中断的设备是在写EOI后.所以写EOI的时候level还是保持有效的,这个时候如果不屏蔽此中断则将继续触发一次.

从设备发起中断时电平高低的角度看待2种中断发现并无实质区别.我们甚至可以考虑同一个设备既可以使用edge也可以使用level.区别仅仅在设置下8259A就可以了.当然这里没有仔细考察硬件电气的适配,但个人认为8259A应该对于2种中断的电气上是统一的.
那么edge为何不能共享?因为edge共享时会丢失.何时会丢失?对于8259A,屏蔽了相应的中断后,仍然有IRR存储一个.但问题不在这里.

我们假设A,B个设备是共享且使用edge.B发送中断,CPU执行对应的中断处理程序遍历A,B
假设只遍一次.那么当程序处理B设备时在B的中断线改变为低电平之前这个时候A设备发送一个中断,这个上升沿将不能被8259A识别,而中断程序将不再遍历A.如此A的中断一直挂起,更槽糕的是整个中断线一直都变成无效了.

伪中断定义为第一次INTA时没有中断请求,即IRR为全0,那么作为伪中断.文档中的附加说明是维持的设备维持中断时间不够长.显然这个时间有可能是CPU清掉IF标志时间太长导致.正如zx_wing推断的只有level中断才可能发生.

评分

参与人数 1可用积分 +30 收起 理由
Godbach + 30 多谢分享

查看全部评分

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
2 [报告]
发表于 2010-08-21 19:06 |只看该作者
我靠,我真是瞎了眼,昏了头,为什么不知道先看看本版精华呢Orz......

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
3 [报告]
发表于 2010-08-21 19:13 |只看该作者
第三帖里的塑料袋先生近况如何?

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
4 [报告]
发表于 2010-10-31 15:41 |只看该作者
当初思考这些问题花了不少心思
同时一直在求一本ARM方面在体系结构上讲解深入的书籍.多次发问一直未果
即使是ARM体系结构编程 和周工的一些书感觉也不够深入细致
最终发现了错过一次10块钱没买的2手书:ARM Cortex-M3权威指南是一本一直以来追求的书,虽然没有MMU属于微控制器类型.但是书内容的完备和一致性绝对远远超出国内任何一本ARM书
读书当如同修行,只有那些内涵丰富,辨证性强的书才能让人升华
这本书对于中断是特定于这个体系结构的.但是非常精彩.

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
5 [报告]
发表于 2010-10-31 15:56 |只看该作者
搞计算机中断很基础。但现在都很智能化了啊。

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
6 [报告]
发表于 2010-10-31 16:27 |只看该作者
我觉得我所接触的范围里最有趣的莫过于同步异步相关的东西.所以特好这个
中断异常本身并不简单.特别上在流水线和cache角度考虑.很少有书讨论这个话题.

论坛徽章:
4
戌狗
日期:2013-08-15 18:22:43技术图书徽章
日期:2013-08-21 13:48:45巨蟹座
日期:2013-09-26 17:06:39处女座
日期:2013-12-25 11:26:10
7 [报告]
发表于 2010-11-08 00:24 |只看该作者
第三帖里的塑料袋先生近况如何?
tempname2 发表于 2010-08-21 19:13



    hi

   哥们现在已经很弱了,再不敢谈kernel如何如何。以前觉得自己懂kernel,不过是对细节比较深入而已,还是初级水平。


  其实kernel这个东西,真正精华的地方完全在细节之外,即在抽象层之上。

  简单的例子,研究各种时钟的处理,关键在clock_event之上;研究文件IO,关键在VFS之上。

  
  哥们现在混得不行,被公司打发去做图形芯片的加速程序,主业是搞xorg那套。 kernel还正在研究中

论坛徽章:
0
8 [报告]
发表于 2010-11-08 10:36 |只看该作者
其实kernel这个东西,真正精华的地方完全在细节之外,即在抽象层之上。



有道理啊,对architecture真正理解了,才能做kernel的项目啊。不然即便实现了同样的共能,代码也patch到了不正确的位置。

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
9 [报告]
发表于 2011-11-07 17:04 |只看该作者
8259A文档提到.当2次ACK期间出现了一个比当前中断更高优先级别的中断,
则在第2次ACK时INTR变为无效,等一段不确定时间重新变为有效.
很显然有效的INTR将重新触发CPU开始一个中断处理,只要这时CPU的IF标志是使能的.
smalloc 发表于 2010-08-21 13:11



If a higher priority interrupt occurs between the two INTA pulses the INT line goes inactive immediately after the second INTA pulse。


这句话很坑爹啊。难道没有这种极端情况INT会一持保持有效么?

也就是说新的中断处理程序可能发生在上一个中断程序还没有写EOI之前.这样ISR中会同时有多个位是置1的.


按Linux的处理应该不可能,现在的代码里调用ack方法时中断还没有打开。这个时候CPU应该发不出INTA信号,而8259设置ISR是在第一次INTA后。

我们假设A,B个设备是共享且使用edge.B发送中断,CPU执行对应的中断处理程序遍历A,B
假设只遍一次.那么当程序处理B设备时在B的中断线改变为低电平之前这个时候A设备发送一个中断,这个上升沿将不能被8259A识别,而中断程序将不再遍历A.如此A的中断一直挂起,更槽糕的是整个中断线一直都变成无效了.


level-trigger可能需要驱动程序告诉设备中断已经收到可以不再维持有效电平,edge-triggered设备会不会仅仅做一次边沿变化再变回来而不会关心后来的事?

文档中的附加说明是维持的设备维持中断时间不够长.显然这个时间有可能是CPU清掉IF标志时间太长导致.正如zx_wing推断的只有level中断才可能发生.


如果edge-triggered做一套完整的上升下降沿动作,也有可能维持的时间不够长。

不行啊,没机会接触真实的设备,这些东西都搞不清楚啊。。。。。

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
10 [报告]
发表于 2011-11-07 18:08 |只看该作者
本帖最后由 smalloc 于 2011-11-07 18:16 编辑

回复 9# tempname2


    >>难道没有这种极端情况INT会一持保持有效么?

用一段不确定时间, 可能效果是给这个期间新的更高的中断一个机会/给中断处理一个时间, 防止过多嵌套
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP