LDD3读书笔记(第7章 中断处理)

 

顶半部中断处理
#include <linux/interrupt.h>
int request_irq(unsigned int irq,irqreturn_t(*handler)(),unsigned long flags,const char *dev_name,void *dev_id);
void free_irq(unsigned int irq,void *dev_id);
    上面这些调用用来注册和注销中断处理例程。
typedef irqreturn_t (*irq_handler_t)(int,void);
typedef int irqreturn_t;
顶半部handler的类型irq_handler_t定义格式。
#include <linux/irq.h>
int can_request_irq(unsigned int irq,unsigned long flags);
    上述函数只在i386和x86_64体系架构上可用。当试图分配某个给定中断线的请求成功时,则返回非零值。
#include <asm/signal.h>
SA_INTERRUPT
SA_SHIRQ
SA_SAMPLE_RANDOM
    request_irq函数的标志。SA_INTERRUPT要求安装一个快速的处理例程(相对于慢速的)。SA_SHIRQ安装一个共享的处理例程,而第三个标志表明中断时间戳可用来产生系统熵。
/proc/interrupts
/proc/stat
    这些文件系统节点用于汇报关于硬件中断和已安装处理例程的信息。
unsigned long probe_irq_on(void);
int probe_irq_off(unsigned long);
    当驱动程序不得不探测设备,以确定该设备使用哪根中断信号线,可以使用上述函数。在中断产生之后,probe_irq_on的返回值必须传回给probe_irq_off,而probe_irq_off的返回值就是检测到的中断号。
IRQ_NONE
IRQ_HANDLED
IRQ_RETVAL(int x)
    中断处理例程的可返回值,它们表示是否是一个真正来自设备的中断。
void disable_irq(int irq);
void disable_irq_nosync(int irq);
void enable_irq(int irq);
    驱动程序可以启动和禁用中断报告。如果硬件试图在中断被禁用的时候产生中断,中断将永久丢失。使用共享处理例程的驱动程序不能使用这些函数。
void local_irq_save(unsigned long flags);
void local_irq_restore(unsigned long flags);
    使用local_irq_save可禁用本地处理器上的中断,并记录先前的状态。flags可传递给local_irq_restore以恢复先前的中断状态。
void local_irq_disable(void);
void local_irq_enable(void);
    用于无条件禁用和启用当前处理器中断函数。

底半部机制
tasklet
void my_tasklet_func(unsigned long);
DECLEAR_TASKLET(my_tasklet,my_tasklet_func,data);
tasklet_schedule(&my_tasklet);

工作队列
struct work_struct my_wq;
void my_wq_func(unsigned long);
INIT_WORK(&my_wq,(void(*)(void *))my_wq_func,NULL);
schedule_work(&my_wq);

软中断
struct softirq_action
    表征一个软中断
open_softirq()
    注册软中断对应的处理函数
raise_softirq()
    触发一个软中断
local_bh_disable()
local_bh_enable()
    内核中用于禁止和使能软中断和tasklet底半部机制的函数
    内核中采用软中断的地方包括HI_SOFTIRQ、TIMER_SOFTIRQ、NET_TX_SOFTIRQ、NET_RX_SOFTIRQ、SCSI_SOFTIRQ、TASKLET_SOFTIRQ
    硬中断、软中断和信号的区别:
    硬中断是外部设备对CPU的中断,软中断是中断底半部的一种处理机制,信号是由内核(或其他进程)对某个进程的中断。
    人们常说的通过软中断陷入内核,此时的软中断的概念是指由软件指令引发的中断,和这儿所说的软中断是两个完全不同的概念。

中断共享
    多个设备共享一根硬件中断线的情况在实际的硬件系统中广泛存在,下面是中断共享的使用方法:
    (1)共享中断的多个设备在申请中断时,都应该使用IRQF_SHARED标志,而且一个设备以IRQF_SHARED申请某中断成功的前提是该中断未被申请,或该中断虽然被申请了,但是之前申请该中断的所有设备也都以IRQF_SHARED标志申请该中断。
    (2)尽管内核模块可访问的全局地址都可以作为request_irq(...,void *dev_id)的最后一个参数dev_id,但是设备结构体指针显然是可传入的最佳参数。
    (3)在中断到来时,会遍历执行共享此中断的所有中断处理程序,直到某个函数返回IRQ_HANDLED。在中断处理程序顶半部中,应迅速地根据硬件寄存器中的信息比照传入的dev_id参数判断是否是本设备的中断,若不是,应迅速返回IRQ_NONE。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值