Linux kernel 中断、嵌套、排序

Linux kernel 中断、嵌套、排序,linux-kernel,cpu,hardware,interrupt,Linux Kernel,Cpu,Hardware,Interrupt,我正在阅读Linux内核文档,我有以下问题(X86_64Arch) 当PIC向CPU发送中断时,会禁用该特定中断,直到CPU发出确认信息吗?如果是这样,为什么我们需要在ISR中使用local\u irq\u disable() 与上述问题相关,但假设CPU在其ISR中处理一个中断,并且如果同一设备向CPU发送3个中断,将如何处理?是否会在某个缓冲区中序列化(如果是,在何处) X86体系结构是否支持基于优先级的中断 PIC是一个非常古老的中断控制器,今天的中断主要通过MSI或APIC层次结构传递。

我正在阅读Linux内核文档,我有以下问题(
X86_64
Arch)

  • 当PIC向CPU发送中断时,会禁用该特定中断,直到CPU发出确认信息吗?如果是这样,为什么我们需要在ISR中使用
    local\u irq\u disable()
  • 与上述问题相关,但假设CPU在其ISR中处理一个中断,并且如果同一设备向CPU发送3个中断,将如何处理?是否会在某个缓冲区中序列化(如果是,在何处)
  • X86
    体系结构是否支持基于优先级的中断

  • PIC是一个非常古老的中断控制器,今天的中断主要通过MSI或APIC层次结构传递。
    事实上,IRQ路由、虚拟化等更为复杂。 我不会讨论这些

    中断优先级概念仍然存在(尽管有点简化),其工作原理如下: 当中断控制器接收到中断请求时,所有低优先级的中断都被屏蔽,中断被发送到CPU。
    实际发生的情况是,中断按其请求编号排序,较低的编号具有较高的优先级(0的优先级高于1)。
    当切换或断言任何请求行时,中断控制器将扫描从数字0到最后一条请求行的每个请求行的状态。
    当它在处理过程中发现断言的行或标记的行(使用或辅助寄存器)时,它立即停止。
    这样,如果请求行2首先被断言,然后请求行4被断言,中断控制器在第一个请求“完成”之前不会处理最后一个请求,因为行2停止扫描

    因此,
    local\u irq\u disable
    可用于禁用所有中断,包括优先级较高的中断
    哎呀,这个功能今天应该很少使用了。这是一种非常简单但效率低下的方法,可以确保没有其他代码可以运行(可能会改变公共结构)

    一般来说,ISR和设备之间需要进行一些协调,以避免中断丢失。
    有些设备需要软件写入一个特殊的寄存器,让它们知道它能够处理下一个中断。这样,设备可以实现内部通知队列。
    键盘控制器的工作原理是这样的,如果读取扫描码的速度不够快,就会丢失扫描码。
    如果设备随意且过于频繁地触发中断,中断控制器可以缓冲请求,使它们不会丢失。
    PIC和LAPIC最多只能缓冲一个请求,而另一个请求正在进行中(它们基本上利用了这样一个事实,即每个中断都有一个请求寄存器和一个正在进行的寄存器)。
    因此,在连续三次中断的情况下,肯定会丢失一次。如果中断控制器无法将第一个中断发送到CPU,因为正在进行更高优先级的中断,那么两个中断将丢失。 一般来说,除了中断控制器,软件不缓冲任何请求。
    因此,您不应该找到依赖于此的代码(毕竟,CS中唯一的数字是0、1和无穷大。因此,就软件而言,2并不存在)

    x86作为CPU核心,在处理中断时不支持优先级。如果中断未被屏蔽,并且硬件中断到达,则会提供服务。由软件和中断控制器决定中断的优先级。
    PIC和LAPIC(以及MSI和IOAPIC)都赋予中断优先级,因此对于所有实际用途,x86支持基于优先级的中断机制

    但是请注意,给予中断优先级并不一定是好的,很难判断网络数据包是否比按键更重要。
    因此,Linux具有和,而是将要在ISR之外异步处理的其余工作排队。 这可能意味着仅从ISR返回工作功能,以不阻止其他中断。
    在绝大多数情况下,只有一小部分代码需要在关键部分运行,这是一种不应发生其他中断的情况,因此一般的方法是将EOI返回到中断控制器,并尽早在CPU中取消屏蔽中断,并写入代码,以便中断

    如果一个中断因性能原因需要停止另一个中断,通常采用的方法是将中断分割到不同的内核,以便负载在所需的指标范围内。
    在多核系统普及之前,过多的中断会有效地降低某些操作的速度。
    我想加载一个驱动程序是可能的,但这是一种QoS/实时需求,由用户来解决