linux内核 - request_irq 介绍
一概述GPU在执行任务时本质上是一个异步设备由CPU提交任务GPU执行那么GPU完成任务后CPU怎么知道答案是GPU触发 IRQ让CPU收到中端信号。另外有一个核心问题是硬件中断只能进入内核态不能直接进入用户态或普通程序那么如何将IRQ注册到内核呢 答案就是用 request_irq 。Linux 内核内部维护了一个映射表 IRQ 号 以及对应中断处理函数。当我们调用 request_irq时本质是把中断处理函数注册到 IRQ 表中。接下来当中断发生时GPU触发 IRQ CPU进入内核中断处理内核查找IRQ表找到对应的中断处理函数调用并执行中断处理函数。二示例#include linux/module.h #include linux/interrupt.h #include linux/kernel.h #define MY_IRQ 42 // 示例 IRQ实际从设备获取 static irqreturn_t my_isr(int irq, void *dev_id) { printk(KERN_INFO IRQ %d triggered!\n, irq); /* 判断是否是自己设备的中断共享中断必须做 */ // if (!my_device_irq_status()) // return IRQ_NONE; /* 清中断非常关键 */ // clear_my_device_irq(); return IRQ_HANDLED; } static int __init my_init(void) { int ret; printk(KERN_INFO Registering IRQ...\n); ret request_irq( MY_IRQ, // IRQ号 my_isr, // 中断处理函数 IRQF_SHARED, // 标志共享中断 my_irq_device, // 名字/proc/interrupts 可见 (void *)my_isr // dev_id用于区分设备 ); if (ret) { printk(KERN_ERR request_irq failed\n); return ret; } return 0; } static void __exit my_exit(void) { printk(KERN_INFO Free IRQ...\n); free_irq(MY_IRQ, (void *)my_isr); } module_init(my_init); module_exit(my_exit); MODULE_LICENSE(GPL);备注多个设备共用同一个 IRQ 号的中断机制就叫“共享中断Shared IRQ”
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2502225.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!