中断处理程序是这样运行的吗?运行多长时间?

3
我在查看中断处理程序(ISR)运行方式时有些困惑。维基百科http://en.wikipedia.org/wiki/Context_switch中描述了中断处理的两个步骤:
1) 切换上下文
When an interrupt occurs, the hardware automatically switches a part of the 
context (at least enough to allow the handler to return to the interrupted code).
The handler may save additional context, depending on details of the particular
hardware and software designs.

2) 运行处理程序

The kernel does not spawn or schedule a special process to handle interrupts, 
but instead the handler executes in the (often partial) context established at 
the beginning of interrupt handling. Once interrupt servicing is complete, the 
context in effect before the interrupt occurred is restored so that the 
interrupted process can resume execution in its proper state.

假设中断处理程序是上半部分,用于内核空间设备驱动程序(我假设用户空间设备驱动程序中断遵循相同的逻辑)。
当中断发生时:
1) 当前内核进程被挂起。但这里的“上下文”情况是什么?根据维基百科的描述,内核不会生成一个新的进程来运行ISR,并且“在中断处理开始时建立的上下文”,听起来非常像中断进程内的另一个函数调用。那么中断处理程序是否使用“中断进程”的堆栈(上下文)运行?还是内核会分配一些其他的内存空间/资源来运行它?
2) 由于ISR不是可以被调度程序放入睡眠状态的“进程”类型。无论如何都必须完成?甚至没有任何时间片限制?如果ISR挂起,系统如何处理?
抱歉,如果问题很基础。我还没有深入研究这个主题。
谢谢,
2个回答

1
所以中断处理程序是使用被中断进程的堆栈(上下文)运行的吗?还是内核会分配一些其他的内存空间/资源来运行它?
这取决于CPU和内核。一些CPU使用当前堆栈执行ISR。其他CPU会自动切换到特殊的ISR堆栈或内核堆栈。如果需要,内核也可以切换堆栈。
既然ISR不是可以被调度程序休眠的“进程”类型,那么它必须完成,无论如何?
是的,否则你就有可能让计算机挂起。你看,中断会打断进程和线程。实际上,大多数CPU没有线程或进程的概念,对它们来说,被中断/抢占的内容并不重要(甚至可以是另一个ISR!),直到ISR完成之前,它都不会再次执行。
甚至没有任何时间片限制吗?如果ISR挂起了,系统该怎么处理?

如果是单CPU系统,它会挂起。它可能会报告错误,然后挂起/重新启动。实际上,在Windows(自Vista以来?)中,挂起或执行缓期程序(DPCs),它们不是ISR但有点像它们(在优先级/抢占方面在ISR和线程之间执行),可能会导致“bugcheck”。操作系统监视DPC的执行,并且可以在多个CPU上同时执行。

无论如何,这不是正常情况,通常除了系统重置外没有其他方法。查找看门狗定时器。它们有助于发现此类问题并执行重置。许多电子设备都有它们。


0
  1. 将中断处理程序视为在其自己的具有高优先级的线程中运行的函数。当设备设置中断时,任何具有最低优先级的其他活动都会被暂停,并执行ISR。这就像是线程上下文切换。

  2. 当ISR挂起(例如在无限循环中),整个计算机将挂起 - 假设我们正在谈论PC驱动程序中的ISR。不允许任何具有低于ISR优先级的活动,因此计算机看起来已经死了。但是,如果连接了硬件远程调试器,则仍会对其做出反应。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接