10

即使在一些写得很好的内核书籍中,我也找不到以下问题的正确答案:

  1. 他们说 ISR 不能休眠,因为它无法重新调度 ISR,因为它没有与任何进程连接,那么当更高优先级的中断抢占正在执行的中断时会发生什么?中断的 ISR 不会再次重新安排(执行)?如果是,如何以及谁来做这项工作?

  2. 很多时候我们会禁用中断(例如:1.在临界区 2. 当一个快速中断正在执行时,它将禁用当前处理器中的所有中断),那么当中断被禁用时发生的中断会发生什么?他们只是被丢弃了?还是将存储在某个地方以供以后执行?如果是,在哪里以及如何?

  3. 当一个 ISR 正在执行时,它将禁用当前 IRQ 行中的中断以避免重入(防止同一行上的另一个 ISR 被执行),但是为什么呢?如果 ISR 是可重入的,那有什么问题?

*ISR=中断服务程序

*他们=书的作者

4

4 回答 4

2

中断通过首先保存当前 CPU 状态并强制程序计数器 (PC) 跳转到中断向量表的位置来捕获从用户空间到内核的执行。然后,该表提供一个指向内核函数(序列)的指针,该内核函数保存当前进程状态并将中断 ID 映射到 ISR 的开头。当在 ISR 期间发生更高优先级的中断时,会发生相同的事件序列,除了正在运行的 ISR 和传入的中断都由同一个(内核)进程处理,因此没有进程进入睡眠状态。

如果新中断被禁用,它当然会被忽略。但是,如果在处理器处理更高优先级的中断时启用中断,则该中断可能处于挂起状态。

ISR 是内核空间内的函数调用,需要分配自己的堆栈。如果抢占次数过多,可重入中断会导致堆栈溢出。大多数内核(包括 Linux 和 Windows)都有固定的堆栈大小。

于 2013-02-12T22:13:09.900 回答
2
  1. 是的,在操作系统中,只有任务以循环方式调度。调度的目标是共享 CPU 资源,公平地分享 CPU 的执行能力给每个正在运行的任务。中断本身就是处理一个特定的事件,每个中断都有自己的优先级。较高优先级的中断可能会抢占正在运行的低优先级 ISR。

    它的工作原理是基于中断控制器上的中断屏蔽寄存器,当 ISR 启动时,它设置屏蔽寄存器以禁用低优先级的中断,在 ISR 返回之前,它恢复屏蔽寄存器以允许低优先级的中断。

  2. 中断处理请求是由硬件设备提出的,它在数据到达时将一个中断引脚拉低到中断控制器。如果禁用中断(设置了掩码),则来自硬件的请求处于挂起状态并且中断引脚保持低电平。一旦启用中断(清除掩码),中断将再次发生。

  3. CPU 将不断触发中断并最终获得堆栈溢出!

于 2015-04-26T00:54:51.700 回答
1

据我所知,ISR 可以被另一个中断抢占,然后继续运行。我看不出为什么可以将进程放入堆栈而 ISR 不能。

进程是操作系统级别的东西,而 ISR 是 CPU 级别的东西。如果你在一个进程中调用 sleep(),你告诉操作系统你没有工作权,它可能运行另一个进程。这不适用于 ISR。

另外,禁用中断是什么意思?

于 2012-08-02T14:39:08.927 回答
0

我将尝试回答您的 1 个问题。回答 1) ISR 无法休眠,因为它们在当前运行的进程的上下文中运行。如果它们休眠,当前运行的进程将进入休眠状态。这是不可取的。

于 2012-08-06T20:52:35.760 回答