operating-system - 在中断处理期间禁用中断

标签 operating-system interrupt interrupt-handling

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

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

最佳答案

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

大多数硬件不会“丢失”中断。在中断期间,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/

相关文章:

python - 如何中断/停止/结束挂起的多线程 python 程序

c - 在 C 程序中禁用中断

linux - 是否必须从系统调用中调用 down(semaphore) 和 down_interruptible(semaphore)?

c - 为什么sem_wait不会在中断时解除阻塞(并返回-1)?

c - 多线程计算矩阵乘积的时间成本

c++ - UNIX C 编程

c++ - 在 Linux 或 Windows 中的精确时间段安排任务

c - __do_IRQ函数解释

process - 系统调用开销

java - 检查 jar 是否正在运行