在中断处理期间禁用了中断

kes*_*ari 5 operating-system interrupt interrupt-handling

为什么当内核当前正在处理中断时禁用中断?

如果错过了携带重要信息的中断怎么办?

Cra*_*tey 6

这样可以防止可能导致内核堆栈溢出的“堆栈中断”。它还可以防止死锁和/或“锁定”。

大多数硬件不会“丢失”中断。在中断期间,CPU的“中断标志”被清除,但是中断控制器[一个单独的野兽]仍然可用/启用来记录新的中断。如果CPU正在处理hardware_A的中断(在“中断服务程序” ISR_A中),则仍可以断言hardware_B的中断。它会被[中断控制器]记住,那时它不会中断CPU。当ISR_A返回时,在退出时重新启用中断标志,现在立即进入ISR_B(其调用堆栈帧将从与ISR_A相同的确切存储位置开始)。

虽然不会丢失/丢弃中断,但ISR应该短(快速执行)以最小化延迟。换句话说,ISR_A不应花费太长时间,hardware_B会溢出一些内部状态/缓冲区(因为它在等待ISR服务时会继续累积数据)。

最小化延迟是精心设计内核和ISR设计的一部分。在Linux中,ISR可以分为ISR部分和“下半部分”或“ tasklet”部分。ISR(禁用了中断)会执行服务/静默设备所需的最低要求(例如,清除设备中的某个位以防止其立即重新声明中断)。

然后,它启用其相应的tasklet(在启用中断的情况下运行)以执行更费力的操作,而这可能需要更长的时间。尽管有名称,但Tasklet与“ ps”中显示的完整任务/进程不一样。它们是[非常]轻巧/高效的方法,用于划分ISR必须执行的工作,以最大程度地减少延迟。