免费注册 查看新帖 |

Chinaunix

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

[中断] 中断嵌套问题 [复制链接]

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-01-10 09:15 |只看该作者 |倒序浏览
问题:目前的新内核版本中,是否支持中断嵌套?即在同一个核上,中断处理过程中是否能再处理中断。
根据相关资料,通过中断门进入中断时,CPU硬件会自动清IF标记,即关中断,即表示通过中断门进入中断处理后,是不能再处理中断的。结合IRQ_PENGING和IRQ_INPROGRESS标记,可以将中断变为串行执行。
老版本内核(2.6.11)中,提供了SA_INTERRUPT标记,用于在request_irq()时,指示该中断服务程序需要在开中断的情况下执行,此时在handle_IRQ_event
函数中会进行local_irq_enable()手动开中断。
也就是说,原理上,进入中断门时,硬件会自动关中断,如果软件认为需要开中断,那么可以手工开中断,此时“中断可以嵌套”。
而在新版本内核中,已经找不到SA_INTERRUPT标记和手工开中断的流程了,是否意味着新内核中“中断不能嵌套”了?瞄了下x86的相关手册,其中好像提到了中断嵌套可能会引发异常,不知是否确实如此?请大牛们指教。

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
2 [报告]
发表于 2014-01-10 14:49 |只看该作者
回复 1# humjb_1983
之前分析过2.6.24内核的中断机制供参考http://blog.chinaunix.net/uid-20662820-id-3023342.html

   

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
3 [报告]
发表于 2014-01-10 16:12 |只看该作者
瀚海书香 发表于 2014-01-10 14:49
回复 1# humjb_1983
之前分析过2.6.24内核的中断机制供参考http://blog.chinaunix.net/uid-20662820-id-3 ...

拜读了一下,瀚海兄对2.6.24内核中的中断机制分析,跟我的目前理解一致,即:默认进入中断门的时候,硬件会自动关中断,如果需要中断嵌套,那么可以通过软件手工开启中断。只是新版本内核中的标记换了,老版本的标记为:SA_INTERRUPT,新版本换成了IRQF_DISABLED
        if (!(action->flags & IRQF_DISABLED))
                local_irq_enable_in_hardirq();
感谢指点,确认了我的疑问。

论坛徽章:
3
射手座
日期:2014-08-18 12:15:53戌狗
日期:2014-08-22 09:53:36寅虎
日期:2014-08-22 14:15:29
4 [报告]
发表于 2014-01-13 15:39 |只看该作者
IRQF_DISABLED 在最新的内核已经被废弃了, 所以只能手动开中断了。

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
5 [报告]
发表于 2014-01-13 16:39 |只看该作者
本帖最后由 humjb_1983 于 2014-01-13 16:39 编辑
gaojl0728 发表于 2014-01-13 15:39
IRQF_DISABLED 在最新的内核已经被废弃了, 所以只能手动开中断了。

呵呵,最新内核之前没确认,看来内核确实是不推荐中断嵌套的,可能侧面反映了硬件对此支持也尚不完善~
感谢!

论坛徽章:
9
程序设计版块每日发帖之星
日期:2016-02-13 06:20:00数据库技术版块每日发帖之星
日期:2016-06-15 06:20:00数据库技术版块每日发帖之星
日期:2016-06-16 06:20:00数据库技术版块每日发帖之星
日期:2016-06-18 06:20:00程序设计版块每日发帖之星
日期:2016-06-27 06:20:00程序设计版块每日发帖之星
日期:2016-07-09 06:20:00IT运维版块每日发帖之星
日期:2016-07-15 06:20:00IT运维版块每日发帖之星
日期:2016-07-27 06:20:00程序设计版块每日发帖之星
日期:2016-08-18 06:20:00
6 [报告]
发表于 2014-01-14 09:12 |只看该作者
楼上诸位,这么说,最新的内核不同硬中断不再嵌套,而是完全串行化了?
不同的CPU还是可以并行处理不同硬中断吧

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
7 [报告]
发表于 2014-01-14 12:34 |只看该作者
mordorwww 发表于 2014-01-14 09:12
楼上诸位,这么说,最新的内核不同硬中断不再嵌套,而是完全串行化了?
不同的CPU还是可以并行处理不同硬中 ...

从内核代码看,默认情况下,应该都是串行处理中断的。
不同的cpu应该是可以并行处理不同的中断的。

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:17
8 [报告]
发表于 2014-01-14 12:44 |只看该作者
得出一个结论, 是很难的事情呀

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
9 [报告]
发表于 2014-01-14 13:43 |只看该作者
帅绝人寰 发表于 2014-01-14 12:44
得出一个结论, 是很难的事情呀

呵呵,确实很难,所以目前的状态还未有明确结论,欢迎大家的指点和讨论~

论坛徽章:
3
射手座
日期:2014-08-18 12:15:53戌狗
日期:2014-08-22 09:53:36寅虎
日期:2014-08-22 14:15:29
10 [报告]
发表于 2014-01-14 15:11 |只看该作者
本帖最后由 gaojl0728 于 2014-01-14 15:12 编辑

研究了下最新的内核3.12.6
虽然在中断函数里可以手动开中断,但是在执行完当前中断处理函数之后内核会检测中断的状态,如果开中断会马上关掉。
所以除非嵌套的中断处理函数再次打开中断,否则看起来也只能嵌套一次。
irqreturn_t
handle_irq_event_percpu(struct irq_desc *desc, struct irqaction *action)
{
        do {
                if (WARN_ONCE(!irqs_disabled(),"irq %u handler %pF enabled interrupts\n",
                              irq, action->handler))
                        local_irq_disable();

        } while (action);
}

而且我感觉就算中断能嵌套多层,在linux下也没有多少实际用途。
linux内核提供的各种中断底半步本质上都是串行执行的,
即使加上中断线程化,因为所有的中断线程使用了相同的优先级,实际执行的顺序也是不确定的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP