IPI中断
核间中断(IPI)其实就是SGI中断(Software Generated Interrupt),在GICv3架构中,共有16个SGI中断(不算extension的),ARM推荐的软件规定,0-7 SGI给REE使用,8-15 SGI给TEE使用。
核间中断就是一个CPU核向系统中的目标CPU核发送中断信号,以使目标CPU执行特定的操作。
在Linux Kernel操作系统中,默认定义了8种IPI中断(SGI0-SGI7):
(linux/arch/arm64/kernel/smp.c)
enum ipi_msg_type {
IPI_RESCHEDULE,
IPI_CALL_FUNC,
IPI_CPU_STOP,
IPI_CPU_CRASH_STOP,
IPI_TIMER,
IPI_IRQ_WORK,
IPI_WAKEUP,
NR_IPI
};
IPI_RESCHEDULE :0号中断, 重新调度进程scheduler_ipi()。
IPI_CALL_FUNC :1号中断, 调用generic_smp_call_function_interrupt(),远程cpu执行回调函数。
IPI_CPU_STOP :2号中断,调用local_cpu_stop(), 使处理器停止
IPI_CPU_CRASH_STOP :3号中断,调用ipi_cpu_crash_stop(),使处理器停止。
IPI_TIMER :4号中断,调用tick_receive_broadcast(),广播时钟事件。
IPI_IRQ_WORK :5号中断,调用irq_work_run(),在中断上下文中执行回调函数。
IPI_WAKEUP :6号中断,调用acpi_parking_protocol_valid(cpu), 唤醒处理器。
NR_IPI :7号中断,没有使用。