为什么内核当前正在处理中断时禁用中断?
如果错过了携带重要消息的中断怎么办?
最佳答案
这可以防止可能溢出内核堆栈的“堆栈中断”。它还可以防止死锁和/或“固定”。
大多数硬件不会“丢失”中断。在中断期间,CPU 的“中断标志”被清除,但中断 Controller [一个单独的野兽] 仍然可用/启用以记录新的中断。如果 CPU 正在处理硬件_A 的中断(在“中断服务例程”ISR_A 中),硬件_B 的中断仍然可以被置位。它会被[由中断 Controller ]记住,它不会在那个时候中断CPU。当 ISR_A 返回时,中断标志在退出时重新启用,现在立即进入 ISR_B(并且它的调用堆栈帧将在与 ISR_A 相同的内存位置开始)。
虽然不会错过/丢弃中断,但 ISR 应该很短 [快速执行] 以最大限度地减少延迟。换句话说,ISR_A 不应该花费很长时间,以至于硬件_B 会溢出一些内部状态/缓冲区[因为它在等待 ISR 服务时继续积累数据]。
最小化延迟是仔细内核设计和 ISR 设计的一部分。在 Linux 中,ISR 可以分解为 ISR 部分和“下半部分”或“tasklet”部分。 ISR [禁用中断] 执行服务/停顿设备所需的最低限度的工作(例如,清除设备中的某个位以防止其立即重新声明中断)。
然后它启用其相应的 tasklet [在启用中断的情况下运行] 来执行可能需要更长时间的更费力的操作。尽管名称如此,Tasklet 并不像“ps”中显示的完整任务/进程。它们是一种 [非常] 轻量级/高效的方式来拆分 ISR 必须完成的工作,以最大限度地减少延迟。
关于operating-system - 在中断处理期间禁用中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32812704/