Linux内核开发之中断处理

一、概念

1、外设的处理速度一般慢于CPU。

2、CPU不能一直等待外部事件。

所以设备必须有一种方法来通知CPU它的工作进度,这种方法就是中断。

二、中断实现

在Linux驱动程序中,为设备实现一个中断包含两个步骤:

  1、向内核注册中断

  2、实现中断处理函数

三、中断处理子系统

1、根据中断号找到正确的中断处理代码。

2、

   Linux定义名字为irq_desc的中断例程描述符表:(include/linux/irq.h),该表struct irqdesc 结构组成。
   struct irqdescirq_desc[NR_IRQS];//NR_IRQS表示中断源的数目

 irq_desc结构体中的成员action指向该中断号对应的irqaction结构体链表。irqaction结构体定义如下: 
struct irqaction {
        irq_handler_t           handler;
        unsigned long           flags;
        void                    *dev_id;
        void __percpu           *percpu_dev_id;
        struct irqaction        *next;
        int                     irq;
        irq_handler_t           thread_fn;
        struct task_struct      *thread;
        unsigned long           thread_flags;
        unsigned long           thread_mask;
        const char              *name;
        struct proc_dir_entry   *dir;
} ____cacheline_internodealigned_in_smp;
3、


4、共享中断
        将不同的设备挂到同一个中断信号线上。Linux对共享的支持主要是为PCI设备服务。共享中断也是通过request_irq函数来注册的。    


    共享中断的处理程序中,不能使用disable_irq(unsigned int irq);

    如果使用了这个函数,共享中断信号线的其它设备将同样无法使用中断,也就无法正常工作。

5、中断处理程序

中断处理程序是在中断上下文中运行的,它的行为受到某些限制:

1)不能向用户空间发送或接受数据。

2)不能使用可能引起阻塞的函数。

3)不能使用可能引起调度的函数。

6、Linux中断底半部机制


两个半部的理念:解决既要中断执行快,又要做的事情多的矛盾。

下半部机制
软中断

tasklet

工作队列

Linux软中断机制

软中断是利用硬件中断的概念,用软件方式进行模拟,实现宏观上的异步执行效果。硬中断是外部设备对CPU的中断,软中断通常是硬中断服务程序对内核的中断。
驱动程序延缓执行机制


Tasklet和下半部处理
workqueue和下半部处理
内核定时器
总结:


工作队列的使用方法和tasklet非常相似
tasklet运行于中断上下文,工作队列运行于进程上下文,tasklet处理函数中不能睡眠,而工作队列处理函数中允许睡眠 。
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dahailinan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值