首页 文章

中断处理期间禁用中断

提问于
浏览
4

当内核当前正在处理中断时,为什么禁用中断?

如果错过了携带重要消息的中断怎么办?

2 回答

  • 3

    这可以防止可能溢出内核堆栈的“堆栈中断” . 它还可以防止死锁和/或“钉扎” .

    大多数硬件不会“丢失”中断 . 在中断期间,CPU的“中断标志”被清除,但中断控制器[一个单独的野兽]仍然可用/启用以记录新的中断 . 如果CPU正在处理hardware_A的中断(在“中断服务程序”ISR_A中),则仍然可以断言hardware_B的中断 . 它将被[中断控制器]记住,它不会在那时中断CPU . 当ISR_A返回时,中断标志在退出时重新启用,现在,立即进入ISR_B(其调用堆栈帧将从与ISR_A相同的确切内存位置开始) .

    虽然不会丢失/丢弃中断,但ISR应该短[快速执行]以最小化延迟 . 换句话说,ISR_A不应该花费太长时间,以至于hardware_B将溢出一些内部状态/缓冲区[因为它在等待ISR服务时继续累积数据] .

    最小化延迟是精心设计内核和ISR设计的一部分 . 在Linux中,ISR可以分解为ISR部分和“下半部分”或“tasklet”部分 . ISR [禁止中断]执行服务/静默设备所需的最小值(例如,清除设备中的某个位以防止它立即重新置位中断) .

    然后,它启用其相应的tasklet [在启用中断的情况下运行]执行可能需要更长时间的更繁重的操作 . 尽管名称不同,Tasklet也不像“ps”中出现的完整任务/进程 . 它们是一种[非常]轻量/高效的方式来分割ISR必须完成的工作,以最大限度地减少延迟 .

  • 2

    让我们来回答每个问题 .

    Why are interrupts disabled when the kernel is currently handling an interrupt ?

    虽然有许多类型的中断,例如I / O,定时器,看门狗,串行端口,外设和DMA,但我们以I / O为例 . 我们将讨论一个原始案例并将其扩展到内核中 .

    想象一下火灾报警/传感器位0/1连接到CPU的特定中断引脚 . 0是正常状态,1是火!然后,可以将输入的中断配置为“电平触发” . 传感器触发1时,ISR必须执行相关代码以警报或自动拨打消防部门 . 一旦进入ISR,通常应该清除中断 . 如果没有清除,硬件将继续中断CPU,ISR内部的安全代码将永远不会执行 .

    此外,CPU需要维护其当前执行状态的堆栈 . 重复出现的中断使其成为一种复杂的情况 .

    “边沿触发”或“触发转换”的第二个例子想象一下输入线/引脚(NRZ编码)上会出现一系列位 . 如果ISR的工作是将这些位组装成字(8,16,32,无论长度如何),我们需要清除中断,将该位组装到缓冲区中,并在周期内再次启用中断 . 不清除中断将导致毛刺y转换仅将1位误认为2位 .

    因此,设置实践并启用中断,如果中断,清除它,执行ISR代码并在相关的任何地方启用中断 .

    Kernel

    内核本身是一个关键的代码和调度程序(也是OS定时器,OS时钟)依赖于硬件定时器中断 . 包含中断逻辑的CPU的硬件部分维护状态转换 . 它还具有用于启用,禁用,屏蔽和设置中断优先级的硬连线逻辑 .

    如果内核模块或潜水员模块应该安全地执行代码,则只能通过在执行处理程序之前禁用中断来获取 deterministic behavior .

    What if an interrupt carrying an important message is missed ?

    中断处理不应太长(在启用中断之前) . 应该根据中断的频率和处理程序的复杂性来正确设计代码 .

相关问题