在查看中断处理程序(ISR)的运行方式时,我有些困惑。在Wiki 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)暂停当前内核进程。但这里的context
情况是什么?基于Wiki的描述,内核不会产生运行ISR的新进程,而context established at the beginning of interrupt handling
听起来就像被中断进程中的另一个函数调用。中断处理程序使用interrupted process
的堆栈(上下文)来运行吗?或者内核会分配一些其他内存空间/资源来运行它?
2)因为这里ISR不是可以由调度程序进入睡眠状态的“进程”类型。它无论如何都必须完成?甚至不受任何时间片限制?如果ISR挂起,系统如何处理呢?
对不起,如果这个问题很重要。我还没有深入研究这个问题。
谢谢,
答案 0 :(得分:0)
将中断处理程序视为在其自己的线程中以高优先级运行的函数。当设备设置中断时,暂停任何其他优先级最低的活动,并执行ISR。这就像线程上下文切换。
当ISR挂起时(例如,在无限循环中),整个计算机挂起 - 假设我们在谈论PC驱动程序中的ISR。任何具有较低ISR优先级的活动都是不允许的,因此计算机看起来已经死了。但是,如果连接了硬件远程调试器命令,它仍会对硬件远程调试器命令作出反应。
答案 1 :(得分:0)
中断处理程序使用中断进程的堆栈(上下文)来运行吗?或者内核会分配一些其他内存空间/资源来运行它?
这取决于CPU和内核。某些CPU使用当前堆栈执行ISR。其他人会自动切换到特殊的ISR堆栈或内核堆栈。如果需要,内核也可以切换堆栈。
是的,或者你冒着挂电脑的风险。你看,中断中断进程和线程。事实上,大多数CPU都没有线程或进程的概念,对于它们来说,被中断/抢占的东西并不重要(它甚至可以是另一个ISR!),它只是在ISR完成之后才会再次执行。 / p>因为这里的ISR不是可由调度程序进入休眠状态的“进程”类型。它无论如何都必须完成?
甚至不受任何时间片限制?如果ISR挂起,系统如何处理呢?
它挂起,特别是如果它是一个单CPU系统。它可能会报告错误,然后挂起/重新启动。事实上,在Windows中(因为Vista?)挂起或执行延迟程序(DPCs
)太慢,这些程序不是ISR但有点像它们(它们在优先级/抢占方面在ISR和线程之间执行)可以导致“错误检查”。操作系统监视DPC的执行,它可以在多个CPU上同时执行此操作。
无论如何,这不是正常情况,除了系统重置之外通常没有办法解决问题。查看watchdog timers
。它们有助于发现这种糟糕的挂起并执行重置。许多电子设备都有它们。