免费注册 查看新帖 |

Chinaunix

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

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

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

论坛徽章:
3
射手座
日期:2014-08-18 12:15:53戌狗
日期:2014-08-22 09:53:36寅虎
日期:2014-08-22 14:15:29
2 [报告]
发表于 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内核提供的各种中断底半步本质上都是串行执行的,
即使加上中断线程化,因为所有的中断线程使用了相同的优先级,实际执行的顺序也是不确定的。

论坛徽章:
3
射手座
日期:2014-08-18 12:15:53戌狗
日期:2014-08-22 09:53:36寅虎
日期:2014-08-22 14:15:29
3 [报告]
发表于 2014-01-14 15:33 |显示全部楼层
google 到一段话, 开起来x86下中断嵌套可能会引发GP异常:
Because IA-32 architecture tasks are not re-entrant, an interrupt-handler task must disable interrupts between the time it completes handling the interrupt and the time it executes the IRET instruction. This action prevents another interrupt from occurring while the interrupt task’s TSS is still marked busy, which would cause a general-protection (#GP) exception.

论坛徽章:
3
射手座
日期:2014-08-18 12:15:53戌狗
日期:2014-08-22 09:53:36寅虎
日期:2014-08-22 14:15:29
4 [报告]
发表于 2014-01-14 17:18 |显示全部楼层
不错啊, 终于知道为什么要这样了哈:)

论坛徽章:
3
射手座
日期:2014-08-18 12:15:53戌狗
日期:2014-08-22 09:53:36寅虎
日期:2014-08-22 14:15:29
5 [报告]
发表于 2014-01-14 18:00 |显示全部楼层

我发现一个严重的问题, 就是IRQF_DISABLED被拿掉之后,会影响内核抢占, 从此以后内核从中断返回时再也不会发生抢占了:), 意外啊
看代码:
ret_from_exception:
        preempt_stop(CLBR_ANY)
ret_from_intr:
        .....省略....
        jb resume_kernel                # not returning to v8086 or userspace
   
ENTRY(resume_kernel)
        DISABLE_INTERRUPTS(CLBR_ANY)
        cmpl $0,TI_preempt_count(%ebp)        # non-zero preempt_count ?
        jnz restore_all
need_resched:
        movl TI_flags(%ebp), %ecx        # need_resched set ?
        testb $_TIF_NEED_RESCHED, %cl
        jz restore_all
        testl $X86_EFLAGS_IF,PT_EFLAGS(%esp)        # interrupts off (exception path) ?
        jz restore_all
        call preempt_schedule_irq
        jmp need_resched
END(resume_kernel)


在resume_kernel中,中断肯定是关掉的, 所以testl $X86_EFLAGS_IF,PT_EFLAGS(%esp)肯定是置位的,所以每次都走jz restore_all分支哈

但是在以前老的内核中,也就是IRQF_DISABLED存在的时候,一般注册中断的时候不会设置IRQF_DISABLED, 所以默认是开中断的,每次都会掉preempt_schedule_irq而发生抢占调度。
看来拿掉IRQF_DISABLED虽然能避免堆栈溢出,但是导致内核抢占的机会少了很多啊。也许得不偿失啊

论坛徽章:
3
射手座
日期:2014-08-18 12:15:53戌狗
日期:2014-08-22 09:53:36寅虎
日期:2014-08-22 14:15:29
6 [报告]
发表于 2014-01-14 18:09 |显示全部楼层
而且在新的内核中, 中断栈已经是固定8K而且跟内核栈是分开的, 溢出的可能性应该比较小了,

论坛徽章:
3
射手座
日期:2014-08-18 12:15:53戌狗
日期:2014-08-22 09:53:36寅虎
日期:2014-08-22 14:15:29
7 [报告]
发表于 2014-01-14 20:40 |显示全部楼层
需要指出的是 系统时钟中断跟进程切换没有直接关系, 时钟中断只是设置了need_resched标记以及更新时间片等等, 具体的进程切换还是发生在schedule的时候, 关中断了一样会发生任务切换。

以前老的内核内核只支持用户抢占,从linux2.6内核才开始支持内核抢占,而发生内核抢占的点大概也就两种:
1.从中断或异常返回内核空间
2. 其他就是手动调用schedule的时候,具体情况很多,比如手动调用schedle, spin_unlock, preemt_enable等等直接或间接调用schedule。

现在从中断返回这条路被关掉了, 我觉得影响还是比较大的,我猜他们在拿掉IRQF_DISABLED的时候也许没考虑到这点。
我说的中断也包括了系统时钟中断,系统时钟中断返回的代码路径跟普通中断是一样。

在实时系统里,关中断时间是个很重要的指标,但是linux不是实时系统,关中断的时间不是一个关键参数,linux这样实现内核抢占没有什么问题。

论坛徽章:
3
射手座
日期:2014-08-18 12:15:53戌狗
日期:2014-08-22 09:53:36寅虎
日期:2014-08-22 14:15:29
8 [报告]
发表于 2014-01-15 09:33 |显示全部楼层
回复 19# smalloc


    我感觉这个和能不能嵌套关系不大吧,esp应该是栈顶(x86栈向下增长,栈顶就是低地址), 而且栈里存的值应该是前面common_interrupt通过SAVE_ALL压进来的,所以就算嵌套应该也没关系。

论坛徽章:
3
射手座
日期:2014-08-18 12:15:53戌狗
日期:2014-08-22 09:53:36寅虎
日期:2014-08-22 14:15:29
9 [报告]
发表于 2014-01-15 13:49 |显示全部楼层
本帖最后由 gaojl0728 于 2014-01-15 13:50 编辑

回复 23# humjb_1983


    你说的是应该对的, EFLAGS是硬件自动保存的, 而且是应该是硬件关中断之前的值, 那时的值应该是开中断的,是我误解了, 我原以为EFLAGS是软件自己保存的。
是硬件自己压栈EFLAGS就不会有问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP