5

我找不到,即使在一些写得很好内核的书下面的问题一个合适的回答:先发中断处理程序会发生什么?

  1. 他们说,一个ISR不能入睡,因为它不可能重新安排ISR,因为它是不与任何进程相连,那么当更高优先级的中断抢占正在执行的进程时会发生什么?被中断的ISR不会再重新安排(执行)?如果是的话&谁会做那个工作?很多时候我们会禁用中断(例如:1.在关键区域2.当快速中断正在执行时,它将禁止当前处理器中的所有中断),那么当发生什么中断时会发生什么中断被禁用?他们只是被丢弃?或将被存储在某个地方供以后执行?如果有的话&怎么样?

  2. 当ISR正在执行时,它将禁止当前IRQ行中的中断以避免重入(防止执行同一行上的另一个ISR),但为什么?如果ISR是可重入的,最新的错误是什么?

* ISR =中断服务程序

*他们=该书作者

+1

约'快interrupts'的信息是过时的。很久以前,这已从Linux中删除。所有的中断应该很快。 *线程中断*取代了此功能。参见:http://lwn.net/Articles/302043/ – 2013-03-02 23:08:14

回答

1

据我所知ISR可以捷足先登的另一个中断,继续追赶着那个。我没有看到为什么一个进程可以放在堆栈上而没有理由。

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

此外,what is meant by disabling interrupts?

0

我会尽力回答您的问题1。 回答于1)ISR无法入睡,因为它们在当前正在运行的进程的上下文中运行。如果他们睡觉,当前正在运行的进程将被转移到睡眠状态。这是不可取的。

1

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

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

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

2
  1. 是的,在操作系统中,只有任务在RR时尚中被压制。调度的目标是共享CPU资源,将CPU的执行能力公​​平地分配给每个正在运行的任务。中断本身就是处理特定事件,每个中断都有自己的优先级。较高优先级的中断可以抢占低优先级的ISR。

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

  2. 中断处理的请求是由硬件设备提出,它下拉中断引脚到中断控制器时数据到达。如果intterupt被禁止(屏蔽被设置),来自硬件的请求处于挂起状态,并且中断引脚保持低电平。一旦中断使能(屏蔽清除),中断将再次发生。

  3. 中央处理器将不断触发中断并事件获取计算器!