本文基于 RockPI 4A 单板Linux4.4内核介绍中断申请的常用接口函数。
1、文件
2、定义
说明:
1)、 irq :要申请的中断号,可通过 platform_get_irq() 获取,见“Linux内核中断之获取中断号”。
2)、 handler :中断处理函数,发生中断时,先处理中断处理函数,然后返回 IRQ_WAKE_THREAD 唤醒中断处理线程。中断处理函数尽可能简单。
中断处理函数定义: typedef irqreturn_t (*irq_handler_t)(int, void *)
中断返回值如下:
3)、 thread_fn :中断处理线程,该参数可为NULL。类似于中断处理函数的下半部分。
4)、 irqflags :中断类型标志。
定义文件: include/linux/interrupt.h ,内容如下:
5)、 devname :中断名称,可使用 cat /proc/interrupts 命令查看。
6)、 dev_id :设备ID,该值唯一。
在使用共享中断时(即设置 IRQF_SHARED ),必须传入 dev_id ,在中断处理和释放函数中都会使用该参数。
注:
1、 request_threaded_irq() 函数可替代 request_irq 加 tasklet 或 workqueue 的方式。
2、对应的中断释放函数为: void free_irq(unsigned int, void *) ,需要和中断申请函数成对出现。
1、文件
2、定义
说明:
1)、 __must_check :指调用函数一定要处理函数的返回值,否则编译器会给出警告。
2)、 request_irq() 函数本质上是中断处理线程 thread_fn 为空的 request_threaded_irq() 函数。
注 :
对应的中断释放函数为: void free_irq(unsigned int, void *) ,需要和中断申请函数成对出现。
1、文件
2、定义
说明 :
devm_request_threaded_irq() 本质上还是使用 request_threaded_irq() 函数实现中断申请。
两者区别:
1)多了一个 dev 参数;
2)在设备驱动卸载时,中断会自动释放;
3)如果想单独释放中断,可使用 void devm_free_irq(struct device *dev, unsigned int irq, void *dev_id) 函数。
1、文件
2、定义
devm_request_irq() 函数本质上是中断处理线程 thread_fn 为空的 devm_request_threaded_irq() 函数。
1、获取中断号
2、申请中断
3、中断处理函数
4、中断处理线程
5、查看中断
先说说环境1.硬件:DELL R4102.网卡:板载1000M BCM5709
2.OS: RHEL 5.5 x86_64
3.KERNEL: 2.6.18-194.el5
所出现的问题
1.网卡毫无征兆的down掉,而且没有任何log信息
2.当流量增大时,不到理论上限的1/3时机器出现网络延迟严重,伴随大量的丢包
3.机器的cpu软中断不均衡,只有1个cpu处理软中断,并且该cpu的软中断周期性的达到100%
4.内外网网卡做nat丢包数据量不一致,差别很大,不在同一个数量级
想必第一个问题,大部分使用bcm网卡,rhel 5.3以后得机器都会遇到这种情况,网上的资料比较的多,我也不多啰嗦了,直接升级网卡驱动就可以解决了。第二,三,四其实是同一个问题都是由于网卡中断过多,cpu处理不过来(准确的说,cpu分配不均衡,导致只有一个cpu处理,处理不过来),引起丢包,那么为什么两个网卡丢包的数量级不一样呢,下面从原理上进行解释,既然是做nat多出口,那么就有大量的路由信息,是一个网络应用,当一个数据包请求nat时,数据包先被网卡驱动的数据接收,网卡收到数据时,触发中断。在中断执行例程中,把skb挂入输入队列,并触发软中断。稍后的某个时刻,当软中断执行时,再从该队列中把skb取下来,投递给上层协议。
我验证下阿...一不小心就fork多了.. 刚开始我把kill的参数弄反了,信号和pid位置弄错了,调了半个小时,很郁闷.. 你只是忽略了一点...,我也给忽略了。。。后来才想起来 你按下ctrl+C的时候,另外两个fork出来的进程,他们也会接到SIGINT。。。...欢迎分享,转载请注明来源:内存溢出
评论列表(0条)