baron · 17 小时前

Linux Kernel5.10的核间通信(SGI中断)的本质

1、核间中断本质

核间中断其实就是SGI中断(Software Generated Interrupt),在gicv3架构中,共有16个SGI中断(不算后来extension的),ARM推荐的软件规定,0-7 SGI给REE使用,8-15 SGI给TEE使用。 我们查看Linux Kernel 5.14的代码也可以看到,它恰好只用了0-7 SGI.

补充SGI中断的介绍

在gicv3中断控制器中,0-15号中断是SGI中断

image

产生SGI中断的寄存器,如ICC_SGI0R_EL1 、ICC_SGI1R_EL1 、ICC_ASGI1R_EL1所示

image

image

image

2、核间中断概念

处理器间中断就是一个 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()
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号中断,没有使用

3、核间中断处理函数的注册和调用

在Linux Kernel5.0之前,在gic_handle_irq()的gic处理函数中,会判断硬件中断号,中断小于16的属于SGI中断,单独走handle_IPI()函数,用于处理核间中断。

而到了Linux Kernel 5.0之后,就不再单独将handle_IPI()拎出区分了。
image

那么在Linux Kernel 5.0之后是怎么实现的?

在Linux Kernel 5.0为硬件中断号0-7的每个中断号都注册了一个中断处理函数,其指向ipi_handler()函数

image

4、触发一个核间通信

核间中断的相关的API:

smp_call_function(func, info, wait) //在所有其它处理器执行一个函数
smp_call_function_single(int cpuid, smp_call_func_t func, void *info,int wait) //在指定处理器执行一个函数
smp_send_reschedule(int cpu) //指定处理器重新调度进程
SMP(IPI)的这类函数,最终都是调用到gic_send_sgi(),给core发送要给SGI中断

image

5、核间通信–任务的调用

ipi_handler()就是中断号0-7所注册的handler程序,在触发中断异常后,它和一般的request_irq注册的中断没有什么不同,都是从异常向量表调过来,然后调用到这个ipi_handler()程序,该程序再调用do_handle_IPI() 真正处理核间通信的任务。

image

image
添加威♥:sami01_2023,回复ARM中文,领取ARM中文手册

推荐阅读
关注数
9491
文章数
256
vx: coding_the_world
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息