为什么进程不能抢占中断?

Why processes cannot preempt interrupts?

我知道当中断发生时,进程 运行 被搁置,中断服务程序被调用。 current 指针指向被中断的进程,我被告知当中断发生时它没有链接到特定进程。所以我的问题是为什么只有另一个中断可以抢占现有的中断例程?

另外,当一个进程(p2)抢占另一个进程(p1)时,谁在调用schedule()方法?

So my question is why only another interrupt can preempt an existing interrupt routine?

硬件中断通常会将处理器硬件置于所有中断都被禁用的中断状态。中断处理程序可以而且经常会明确地重新启用更高优先级的中断。这样的中断可以抢占较低优先级的中断。这是唯一可以中断硬件中断的机制。

Also, when a process(p2) preempts another process(p1), who is calling the schedule() method?

这在某种程度上取决于抢占是由来自已经 运行 的线程的系统调用启动的,还是由导致 handler/driver 到 运行 并随后进入的硬件中断启动的内核请求重新安排。使用的确切机制(状态、堆栈等)取决于体系结构。

关于您的第一个问题:当中断处于 运行ning 时,中断在该处理器上被禁用。所以不能中断。

关于你的第二个问题:一个进程永远不会抢占另一个进程,它总是 OS 这样做。 OS 定期调用调度程序例程,它决定下一个 运行 进程。所以p2没有说"i want to run now",它只是有一些属性,比如优先级,剩余时隙等,然后OS决定p2现在是否应该运行。

前两个答案都显示出对中断及其工作方式的一些重大误解

特别感兴趣,

对于我们通常使用的 CPUs

(86x..、power PC、68xxx、ARM 等)

每个中断源都有一个优先级。

遗憾的是,有一些 CPUs,例如 68HC11,其中除复位中断和 NMI 中断外的所有中断都具有相同的优先级,因此服务任何其他中断事件都将阻塞所有其他(相同优先级)中断事件。

出于我们的讨论目的,较高优先级的中断事件可以/将会中断较低优先级的中断处理程序。

(中断处理程序可以修改适当的硬件寄存器以禁用所有中断事件或仅禁用某些中断事件。甚至可以通过清除自己的中断挂起标志(通常是寄存器中的位)来启用较低优先级的中断

一般情况下,调度程序由中断处理程序调用,

(或者通过一个进程自愿放弃CPU)

该中断通常是硬件定时器 expiring/reloading 触发中断事件的结果。

中断实际上只是等待服务的事件。

中断事件在允许时,例如作为当前挂起的最高优先级中断,将导致 PC 寄存器加载相关中断处理程序的首地址。

将 PC 寄存器转移到中断处理程序的行为将(至少)将先前的 PC 寄存器值和状态寄存器压入堆栈。 (在某些 CPU 中,这些寄存器有一组特殊的保存区域,因此它们被压入特殊区域而不是堆栈。

从中断返回的行为,例如通过 RTI 指令,将 'automatically' 导致先前的 PC 和状态寄存器值被恢复。

注意:从中断处理程序返回并不会清除中断事件挂起指示,因此中断处理程序在退出之前需要修改相应的寄存器,否则执行流程将立即重新进入中断处理程序。

中断处理程序必须在进入时推送它修改的任何其他寄存器,并在准备好退出时恢复它们。

只有较低优先级的中断会被中断事件阻止,从而将 PC 转移到适当的中断处理程序。已阻止,未禁用。

在某些 CPU 上,例如大多数 DSP,也有可以由指令执行触发的软件中断。 这通常被硬件中断处理程序用来在缓冲区中 input/saved 一定数量的数据后触发数据处理。这将 I/O 与处理分开,从而使硬件中断事件处理程序能够快速处理并仍然及时处理数据

以上内容与评论和其他答案的大部分内容相矛盾。但是,这些评论和答案来自 OS 的 'user' 方面的误导性观点,而我通常直接在裸硬件上编程,因此非常熟悉实际发生的情况。