Linux Kernel5.10的核间通信(SGI中断)的本质
快速鏈接:
.
👉👉👉 個人博客筆記導讀目錄(全部) 👈👈👈
說明:
在默認情況下,本文講述的都是ARMV8-aarch64架構(gòu),linux kernel 5.14
1、核間中斷本質(zhì)
核間中斷其實就是SGI中斷(Software Generated Interrupt),在gicv3架構(gòu)中,共有16個SGI中斷(不算后來extension的),ARM推薦的軟件規(guī)定,0-7 SGI給REE使用,8-15 SGI給TEE使用。 我們查看Linux Kernel 5.14的代碼也可以看到,它恰好只用了0-7 SGI.
補充SGI中斷的介紹
在gicv3中斷控制器中,0-15號中斷是SGI中斷
產(chǎn)生SGI中斷的寄存器,如ICC_SGI0R_EL1 、ICC_SGI1R_EL1 、ICC_ASGI1R_EL1所示
2、核間中斷概念
處理器間中斷就是一個 CPU 向系統(tǒng)中的目標 CPU發(fā)送中斷信號,以使目標CPU執(zhí)行特定的操作
在Linux Kernel操作系統(tǒng)中,默認定義了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號中斷, 重新調(diào)度進程,scheduler_ipi()
- IPI_CALL_FUNC :1號中斷, 調(diào)用generic_smp_call_function_interrupt()
- IPI_CPU_STOP :2號中斷,調(diào)用local_cpu_stop(), 使處理器停止
- IPI_CPU_CRASH_STOP :3號中斷,調(diào)用ipi_cpu_crash_stop(),使處理器停止
- IPI_TIMER :4號中斷,調(diào)用tick_receive_broadcast(),廣播時鐘事件
- IPI_IRQ_WORK :5號中斷,調(diào)用irq_work_run()
- IPI_WAKEUP :6號中斷,調(diào)用acpi_parking_protocol_valid(cpu), 喚醒處理器
- NR_IPI :7號中斷,沒有使用
3、核間中斷處理函數(shù)的注冊和調(diào)用
- 在Linux Kernel5.0之前,在gic_handle_irq()的gic處理函數(shù)中,會判斷硬件中斷號,中斷小于16的屬于SGI中斷,單獨走handle_IPI()函數(shù),用于處理核間中斷。
- 而到了Linux Kernel 5.0之后,就不再單獨將handle_IPI()拎出區(qū)分了。
那么在Linux Kernel 5.0之后是怎么實現(xiàn)的?
在Linux Kernel 5.0為硬件中斷號0-7的每個中斷號都注冊了一個中斷處理函數(shù),其指向ipi_handler()函數(shù)
4、觸發(fā)一個核間通信
核間中斷的相關(guān)的API:
- smp_call_function(func, info, wait) //在所有其它處理器執(zhí)行一個函數(shù)
- smp_call_function_single(int cpuid, smp_call_func_t func, void *info,int wait) //在指定處理器執(zhí)行一個函數(shù)
- smp_send_reschedule(int cpu) //指定處理器重新調(diào)度進程
SMP(IPI)的這類函數(shù),最終都是調(diào)用到gic_send_sgi(),給core發(fā)送要給SGI中斷
5、核間通信–任務的調(diào)用
ipi_handler()就是中斷號0-7所注冊的handler程序,在觸發(fā)中斷異常后,它和一般的request_irq注冊的中斷沒有什么不同,都是從異常向量表調(diào)過來,然后調(diào)用到這個ipi_handler()程序,該程序再調(diào)用do_handle_IPI() 真正處理核間通信的任務。
總結(jié)
以上是生活随笔為你收集整理的Linux Kernel5.10的核间通信(SGI中断)的本质的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: irq domain介绍和代码导读
- 下一篇: linux 其他常用命令