即使在一些写得很好的内核书籍中,我也找不到以下问题的正确答案:
他们说 ISR 无法休眠,因为它无法重新调度 ISR,因为它没有与任何进程连接,那么当更高优先级的中断抢占正在执行的中断时会发生什么?中断的 ISR 不会再次重新调度(执行)?如果是,如何以及由谁来完成这项工作?
很多时候我们会禁用中断(例如:1.在临界区2.当执行快速中断时,它将禁用当前处理器中的所有中断),那么当中断被禁用时,正在发生的中断会发生什么?他们只是被丢弃了?或者将被存储在某个地方以供以后执行?如果是,在哪里以及如何?
当 ISR 正在执行时,它将禁用当前 IRQ 行中的中断以避免重入(防止同一行上的另一个 ISR 被执行),但为什么呢?如果 ISR 是可重入的,会出现什么问题?
*ISR=中断服务程序
*他们=书的作者
中断通过首先保存当前 CPU 状态并强制程序计数器 (PC) 跳转到中断向量表的位置来捕获从用户空间到内核的执行。然后,该表提供指向保存当前进程状态并将中断 ID 映射到 ISR 开头的内核函数(序列)的指针。当 ISR 期间发生更高优先级的中断时,会发生相同的事件序列,只不过正在运行的 ISR 和传入中断均由同一(内核)进程处理,因此没有进程进入睡眠状态。
如果禁用的话,新的中断当然会被忽略。但是,如果在处理器正在处理更高优先级的中断时启用中断,则该中断可能会处于挂起状态。
ISR 是内核空间内的函数调用,需要分配自己的堆栈。如果抢占次数过多,可重入中断可能会导致堆栈溢出。大多数内核(包括 Linux 和 Windows)都有固定的堆栈大小。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)