我们有一台运行SuSE Linux Enterprise Server 11 SP2的HP DL980。
该机器拥有一个PCIe数字IO卡,用于发送时钟信号与其他机器同步。
如果我们顶一下,其中一个进程用'command' [irq / 28-pci7230]显示, 顶部显示这个进程在CPU8上运行。 我们知道pci7230是数字IO卡。 如果我然后猫/ proc /中断 ,这显示CPU0上的所有中断。
可以解释一下这里发生了什么? 我的印象是最高层的入口显示中断正在被CPU8处理,但是/ proc / interrupts似乎表明了另外一种情况。
中间的上半部分与下半部分混淆。 上半部分的中断运行在与下半部分不同的内核上是非常正常的。 当发生硬件中断时,您处于正在运行的任何环境中。 尽快释放这个上下文是至关重要的,这样你就不会劫持一个随机的,可能很重要的工作。
Linux(和许多其他系统一样)通过将中断处理程序分成两部分来解决这个问题,所谓的上半部分是实际响应中断的例程 – 你向request_irq注册的中断,下半部分是例程在上半部分处理程序和下半部分之间最大的区别是所有的中断在下半部分的执行过程中都是可用的 – 这就是为什么它在更安全的情况下运行的原因在典型的情况下,上半部分将设备数据保存到一个特定于设备的缓冲区中,调度其下半部分,然后退出:这个操作非常快,下半部分执行任何其他需要的工作,比如唤醒进程,启动另一个I / O操作,等等。这个设置允许上半部分服务一个新的中断,而下半部分仍在工作。 – 顶部和底部的一半
中断本身没有被调度 – 当中断到达时中断。 内核线程计划执行“真正的工作”。