Linux Kernel5.10的核间通信(SGI中断)的本质
快速鏈接:
.
👉👉👉 個人博客筆記導讀目錄(全部) 👈👈👈
說明:
在默認情況下,本文講述的都是ARMV8-aarch64架構,linux kernel 5.14
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中斷
產生SGI中斷的寄存器,如ICC_SGI0R_EL1 、ICC_SGI1R_EL1 、ICC_ASGI1R_EL1所示
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()拎出區分了。
那么在Linux Kernel 5.0之后是怎么實現的?
在Linux Kernel 5.0為硬件中斷號0-7的每個中斷號都注冊了一個中斷處理函數,其指向ipi_handler()函數
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中斷
5、核間通信–任務的調用
ipi_handler()就是中斷號0-7所注冊的handler程序,在觸發中斷異常后,它和一般的request_irq注冊的中斷沒有什么不同,都是從異常向量表調過來,然后調用到這個ipi_handler()程序,該程序再調用do_handle_IPI() 真正處理核間通信的任務。
總結
以上是生活随笔為你收集整理的Linux Kernel5.10的核间通信(SGI中断)的本质的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: irq domain介绍和代码导读
- 下一篇: Linux Kernel5.10的软中断