SGI中断也称IPI中断,即处理器间中断,一个处理器可以向其他处理器发送中断,以达到目标处理器执行某种事情。
如上所示,cpu0通过写GICD寄存器让cpu2上产生SGI中断。
在ARM64系统中,硬中断号0~7为SGI中断号,它为CPU私有中断。
对于SGI中断,分配和中断处理函数过程如下:
- 通过__irq_domain_alloc_irqs()分配SGI虚拟中断号并映射;
- 设置ipi_handler中断处理函数
- 通过ipi_setup()使能IPI中断
常见的使用SGI中断的函数如下:
(1)smp_send_reschedule(int cpu)
在指定的处理器cpu上进行重新调度
(2)tick_broadcast(const struct cpumask *mask)
在指定的处理器范围上mask作时钟广播
(3)smp_send_stop(void)
在online的处理器上执行CPU停止操作
(4)arch_irq_work_raise(void)
[待定]
(5)arch_send_wakeup_ipi_mask(const struct cpumask *mask)
唤醒mask指定的CPU
(6)smp_call_function_many(const struct cpumask *mask, smp_call_func_t func, void *info, bool wait)
在mask指定的处理器上执行func函数
(7)crash_smp_send_stop(void)
在KEXEC执行时将CPU停止
虽然这些函数用途各异,但最终都是调用smp_cross_call(),只是事件不同。
可以看出,最终是通过写SYS_ICC_SGI1R_EL1寄存器让GIC产生IPI中断。
它们对应的处理函数为: