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是CPU级别的东西。如果在一个进程中调用sleep(),您会告诉操作系统您没有工作权限,并且它可能会运行另一个进程。这不适用于ISR
另外,我将尝试回答您的一个问题。
回答1)ISR无法睡眠,因为它们在当前正在运行的进程的上下文中运行。如果它们处于睡眠状态,则当前正在运行的进程将移至睡眠状态。这是不可取的。中断首先保存当前CPU状态并强制程序计数器(PC)跳转到中断向量表的位置,从而将执行从用户空间捕获到内核。然后,该表提供了一个指向保存当前进程状态并将中断ID映射到ISR开始的内核函数(序列)的指针。当ISR期间发生更高优先级的中断时,会发生相同的事件序列,但运行的ISR和传入的中断都由同一(内核)进程处理,因此不会使任何进程处于休眠状态 如果新的中断被禁用,它当然会被忽略。但是,如果在处理器提供更高优先级的中断时启用中断,则中断可能处于挂起状态 ISR是内核空间内的函数调用,需要分配自己的堆栈。如果抢占过多,可重入中断可能导致堆栈溢出。大多数内核(包括Linux和Windows)都有固定的堆栈大小
有关快速中断的信息已过时。这是很久以前从Linux中删除的。所有的中断都应该是快速的。线程中断取代了此功能。见: