免费注册 查看新帖 |

Chinaunix

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

有关中断处理的疑问,大牛指点 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-10-17 15:45 |只看该作者 |倒序浏览
在《深入理解linux内核》或者其他很多资料中,都讲到如果发生了中断,
那么当进入中断处理函数里,内核已经屏蔽了当前中断信号线;
而且,如果不是设置了SA_INTERRUPT,那么此中断是在关闭全部中断的情况下执行的,例子就是timer的。

可是,我看具体代码的时候,觉得有些矛盾的地方。
1。在do_IRQ里面,代码还是需要判断当前CPU的当前中断信号是否处于 IRQ_INPROCESS,
可是,既然当前CPU的当前中断信号都已经被屏蔽了,怎么还会发出中断以至于需要执行到do_IRQ呢?
2。如果说,系统进入do_IRQ的时候,当前cpu的所有中断都已经被关闭了,那么,又有两个问题了,其一是内核在
哪里关闭中断的,似乎没找到。 而,既然关闭了所有,那么还要关闭当前中断的干嘛,不是多此一举?

烦请大牛指点指点,困惑啊!

论坛徽章:
0
2 [报告]
发表于 2007-10-17 17:03 |只看该作者
2.穿越中断门时自动关中断
1.设置了SA_INTERRUPT时,在执行module注册的处理函数中,可能开中断.第一个中断没处理完,第二个中断又来了,第二个中断穿越中断门后,中断虽然关闭着,已经打断了第一个中断,依据IRQ_INPROCESS判断

论坛徽章:
0
3 [报告]
发表于 2007-10-17 23:04 |只看该作者
原帖由 georgeying 于 2007-10-17 15:45 发表
在《深入理解linux内核》或者其他很多资料中,都讲到如果发生了中断,
那么当进入中断处理函数里,内核已经屏蔽了当前中断信号线;
而且,如果不是设置了SA_INTERRUPT,那么此中断是在关闭全部中断的情况下执 ...

我有下面一些看法,供lz参考:
1.我认为这是SMP(对称多处理器)时才会有的特殊情况。SMP时,有一些中断会以广播的形式发给所有cpu,例如时钟中断。这个时候,其中有一个CPU开始处理这个中断了,那么其它CPU就不应该再处理。在处理前,会通过IRQ_INPROGRESS和IRQ_DISABLED进行检测,看是否有CPU已经在进行处理了。如有,那直接退出。
2.正如ificanfly所说,这是通过interrupt gate自动关闭的。x86的idt表里通常有3种门:interrupt gate、trap gate、task gate。其中interrupte gate除了有特权提升的作用外,还会自动关闭中断。注意,这个和trap gate加一条cli指令是不同的,因为在跳转到trap gate执行cli之前,还可能有中断发生。而跳转到interrupt gate的时候,中断就已经被CPU关闭了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP