当内核正在处理一个中断时,为什么会禁用其他中断?
如果错过了携带重要消息的中断会怎样?
当内核正在处理一个中断时,为什么会禁用其他中断?
如果错过了携带重要消息的中断会怎样?
这可以防止“堆叠中断”导致内核栈溢出。同时也可以防止死锁和/或固定。
大多数硬件不会“丢失”中断。在中断期间,CPU的“中断标志”被清除,但中断控制器[一个单独的实体]仍然可用/启用以记录新的中断。如果CPU正在处理硬件_A的中断(在“中断服务例程”ISR_A中),则可以仍然断言硬件_B的中断。它将被中断控制器记住,但此时不会中断CPU。当ISR_A返回时,退出时重新启用中断标志,现在立即,ISR_B将被输入(并且其调用堆栈帧将从与ISR_A相同的内存位置开始)。
虽然中断不会丢失/丢弃,但ISR应尽可能短[快速执行],以最小化延迟。换句话说,ISR_A不应该花费太长时间,以至于hardware_B将溢出某些内部状态/缓冲区[因为它继续累积数据等待ISR服务]。
最小化延迟是仔细设计内核和ISR设计的一部分。在Linux中,ISR可以分为ISR部分和“底半部分”或“tasklet”部分。ISR [禁用中断]只进行处理/使设备静止所需的最小操作(例如清除设备中的位,以防止其立即重新断言中断)。
然后,它启用相应的tasklet [以启用中断运行]执行可能需要更长时间的更繁琐的操作。尽管名称为tasklet,但它们不像在“ps”中显示的完整任务/进程那样。它们是将ISR必须执行的工作拆分的[非常]轻量级/高效方法,以最小化延迟。