即使在一些写得很好的内核书籍中,我也无法找到以下问题的正确答案:
他们说ISR无法入睡,因为它无法重新安排ISR,因为它与任何进程都没有连接,所以当优先级较高的中断抢占执行进程时会发生什么?中断的ISR不会再次重新安排(执行)?如果是的话&谁会做这项工作?
很多时候我们会禁用中断(例如:1。在关键区域2.当执行快速中断时,它将禁用当前处理器中的所有中断),那么正在发生的中断会发生什么什么时候禁用中断?他们被简单地丢弃了?或将被存储在某个地方以便以后执行?如果是,那么&怎么样?
当ISR执行时,它将禁用当前IRQ行中的中断以避免重入(防止同一行上的另一个ISR被执行),但为什么呢?如果ISR是可重入的,那该怎么办?
* ISR =中断服务例程
*他们= Book的作者
答案 0 :(得分:2)
中断通过首先保存当前CPU状态并强制程序计数器(PC)跳转到中断向量表的位置来捕获从用户空间到内核的执行。然后,该表提供指向(序列)内核函数的指针,该函数保存当前进程状态并将中断ID映射到ISR的开始。当在ISR期间发生更高优先级的中断时,会发生相同的事件序列,除了运行的ISR和传入的中断都由相同的(内核)进程处理,因此没有进程进入休眠状态。
如果禁用新中断,则当然会被忽略。但是,如果在处理器为更高优先级的中断服务时启用了中断,则该中断可以处于暂挂状态。
ISR是内核空间中的函数调用,需要分配自己的堆栈。如果抢占太多,重入中断可能导致堆栈溢出。大多数内核(包括Linux和Windows)具有固定的堆栈大小。
答案 1 :(得分:2)
是的,在操作系统中,只有任务以RR方式进行。调度的目标是共享CPU资源,公平地分享CPU对每个正在运行的任务的执行能力。中断本身是处理特定事件,每个中断都有自己的优先级。优先级较高的中断可能会抢占正在运行的低优先级ISR。
它的工作原理基于中断控制器上的中断屏蔽寄存器,当ISR启动时,它将屏蔽寄存器设置为禁用具有较低优先级的中断,并且在ISR返回之前,它恢复屏蔽寄存器以允许较低优先级的中断。
中断处理请求由硬件设备提出,它在数据到达时将中断引脚下拉到中断控制器。如果禁用了intterupt(设置了掩码),则来自硬件的请求处于挂起状态,并且中断引脚保持低电平。一旦中断使能(屏蔽清除),中断将再次发生。
CPU将不断触发中断并最终获得堆栈溢出!
答案 2 :(得分:1)
据我所知,ISR可以被另一个中断抢占,然后继续运行。我认为没有理由将进程放在堆栈上而不是ISR。
进程是一个操作系统级别的东西,而ISR是CPU级别的东西。如果在进程中调用sleep(),则告诉操作系统您没有正确的工作知识,并且可能会运行另一个进程。这不适用于ISR。
答案 3 :(得分:0)
我会尝试回答你的一个问题。 答案1)ISR无法入睡,因为它们在当前运行的进程的上下文中运行。如果他们睡觉,当前正在运行的进程将被转移到睡眠状态。这是不可取的。