Linux为什么中断不允许休眠

linux 为什么中断不允许休眠? 所谓的睡眠,就是调用 schedule 让出 cpu,调度器选择另外个进程继续执行,这个过程涉及进程栈空间的切换。
1、假如中断上下文中调用 schedule ,此时获取的 struct thread info 数据结构是发生中断时该进程栈信息,而不是中断上下文调用 schedule 时任何信息。这就导致再也无法返回中断上下文中调用 schedule 的地方。
2、中断上下文处于关中断中,需要发送个 eoi 通知 gic 中断处理结束,gic 和cpuinterface 才会进入下一次中断处理。如果中途 schedule,那么整个系统的中断都会被屏蔽掉。
一般进入中断后,需要关中断,也会关抢占,同时注意不可以调用schedule。
unhandled interrupt 和 spurious interrupt 未处理中断和虚假中断
在中断处理的最后,总会有一段代码如下:
irqreturn_t
handle_irq_event_percpu(struct irq_desc *desc, struct irqaction *action)
{
……
    if (!noirqdebug)
        note_interrupt(irq, desc, retval);
    return retval;
}
note_interrupt就是进行unhandled interrupt和spurious interrupt处理的。对于这类中断,linux kernel有一套复杂的机制来处理,你可以通过command line参数(noirqdebug)来控制开关该功能。
当发生了一个中断,但是没有被处理(有两种可能,一种是根本没有注册的 specific handler,第二种是有 handler,但是 handler 否认是自己对应的设备触发的中断),怎么办?毫无疑问这是一个异常状况,那么 kernel 是否要立刻采取措施将该 irq disable 呢?也不太合适,毕竟 interrupt request 信号线是允许共享的,直接 disable 该 irq 有可能会下手太狠,kernel 采取了这样的策略:如果该 irq 触发了 100,000 次,但是 99,900 次没有处理,在这种条件下,我们就是 disable 这个 interrupt request line。
中断线和中断号是一个意思。
相关的控制数据在中断描述符中,如下:
struct irq_desc {
……
    unsigned int        irq_count;--------记录发生的中断的次数,每100,000则回滚
    unsigned long        last_unhandled;-----上一次没有处理的irq的时间点
    unsigned int        irqs_unhandled;------没有处理的次数
……
}

移动医疗真实案例 提高效率改进服务
WiMAX的发展现状和技术挑战
为什么华为可以活到最后?
利用新一代以太网技术构建节能系统
宁德时代大跌,最大跌幅达13.69%
Linux为什么中断不允许休眠
跌跌撞撞:2018手机厂商大事记
华硕ROGMAXIMUSXIAPEX评测 实现极限超频和打造极致性能硬件平台的最佳利器
空中客车新一代A350XWB宽体飞机的绿色环保设计理念阐述
Galaxy Fold是三星发布的第一个可商用的可折叠产品
高低温冲击试验箱与恒温恒湿试验箱的区别介绍
丰田中国将召回66911辆混动车型
那些年,与英飞凌携手共赢的小伙伴都有谁?
消防应急照明和疏散指示系统的应用
小米5c对比小米5,价格只相差100元好尴尬呀!
联发科不争气,高通将一家独大,重演英特尔挤牙膏惨剧?
美军与微软签订合同 采购10万部微软AR眼镜
进口拆机18650锂电池
MIT研究二手太阳能电池和电动汽车电池,可有效地进行工业规模储能
微鲸F1PLUS高亮智能微投评测 在实用性上更加接近液晶电视