linux-kernel - 被抢占的中断处理程序会发生什么?

标签 linux-kernel kernel linux-device-driver interrupt interrupt-handling

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

  • 他们说 ISR 无法休眠,因为它无法重新调度 ISR,因为它不与任何进程连接,那么当更高优先级的中断抢占正在执行的中断时会发生什么?中断的 ISR 不会再次重新调度(执行)?如果是,如何以及谁来完成这项工作?
  • 很多时候我们会禁用中断(例如:1.在临界区 2.当一个快速中断正在执行时,它将禁用当前处理器中的所有中断),那么当中断被禁用时发生的中断会发生什么?他们只是被丢弃了?或者将存储在某个地方以供以后执行?如果是,在哪里以及如何?
  • 当 ISR 正在执行时,它将禁用当前 IRQ 行中的中断以避免重入(防止同一行上的另一个 ISR 被执行),但为什么呢?如果 ISR 是可重入的,有什么问题?

  • *ISR=中断服务程序

    *他们=本书的作者

    最佳答案

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

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

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

    关于linux-kernel - 被抢占的中断处理程序会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11779397/

    相关文章:

    linux - put_user() linux 内核

    linux - 为什么在调试 vmlinux 时 kgdb 不显示函数符号?

    linux - devm_kzalloc 是否提供连续内存?

    c - 如何开始在 Linux 中编写键盘背光驱动程序?

    c - Linux内核模块复制进程的.text段

    linux - SIGSTOP 在 Linux 内核中是如何工作的?

    c - 关于结构的基本问题

    linux - Linux 内核需要多少条指令来处理 arm cortex A9 上的中断?

    linux - 如何使用proc文件打印mem_map的信息?

    python - CNN(卷积神经网络)需要设计卷积核吗?