Linux kernel 抢占中断处理程序会发生什么情况?

Linux kernel 抢占中断处理程序会发生什么情况?,linux-kernel,kernel,linux-device-driver,interrupt,interrupt-handling,Linux Kernel,Kernel,Linux Device Driver,Interrupt,Interrupt Handling,即使在一些写得很好的内核书籍中,我也找不到以下问题的正确答案: 他们说ISR不能休眠,因为它不可能重新调度ISR,因为它不与任何进程连接,所以当一个更高优先级的中断抢占了正在执行的中断时会发生什么?中断的ISR不会再次重新调度(执行)吗?如果是,如何和谁来做这项工作 很多时候我们会禁用中断(例如:1.在关键区域2.当一个快速中断正在执行时,它将禁用当前处理器中的所有中断),那么当中断被禁用时发生的中断会发生什么情况?他们只是被丢弃?或者将存储在某个地方以便以后执行?如果是,地点和方式 当一个IS

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

  • 他们说ISR不能休眠,因为它不可能重新调度ISR,因为它不与任何进程连接,所以当一个更高优先级的中断抢占了正在执行的中断时会发生什么?中断的ISR不会再次重新调度(执行)吗?如果是,如何和谁来做这项工作

  • 很多时候我们会禁用中断(例如:1.在关键区域2.当一个快速中断正在执行时,它将禁用当前处理器中的所有中断),那么当中断被禁用时发生的中断会发生什么情况?他们只是被丢弃?或者将存储在某个地方以便以后执行?如果是,地点和方式

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

  • *中断服务程序


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

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


    另外,

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

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

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

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

  • 是的,在操作系统中,只有任务是以循环方式分配的。调度的目标是共享CPU资源,公平地将CPU的执行能力分配给每个正在运行的任务。中断本身是处理一个特定事件,每个中断都有自己的优先级。高优先级中断可能抢占正在运行的低优先级ISR

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

  • 中断处理请求由硬件设备提出,当数据到达时,它将中断引脚拉到中断控制器。如果INTERUPT被禁用(设置了掩码),则来自硬件的请求处于挂起状态,中断引脚保持低位。一旦中断被启用(屏蔽被清除),中断将再次发生

  • CPU会不断触发中断,最终导致堆栈溢出


  • 有关快速中断的信息已过时。这是很久以前从Linux中删除的。所有的中断都应该是快速的。线程中断取代了此功能。见: