Linux内核中断结构

本文详细介绍了Linux内核中的中断结构,包括中断相关的数据结构、边沿触发与电平触发的区别、IRQ栈的工作原理,以及ARM中断控制器的中断类型。此外,还探讨了GIC中断控制器的检测流程、中断上下文的概念以及为何中断上半部应快速执行。最后,讨论了tasklet和工作队列在中断处理中的角色和执行时机。
摘要由CSDN通过智能技术生成

1、中断相关的数据结构描述 

对于每一个中断都可以使用irq_desc结构体来描述,如下

struct irq_desc {
    irq_flow_handler_t handle_irq;
    struct irq_chip *chip;
    void *handler_data;
    void *chip_data;
    struct irqaction *action; /* IRQ操作列表 */
    unsigned int status; /* IRQ状态 */
    unsigned int depth; /* 嵌套停用irq */
    unsigned int irq_count; /* 用于检测错误的中断*/
    unsigned int irqs_unhandled;
    ...
    const char *name;
} ____cacheline_internodealigned_in_smp;
  • 其中要注意,handle_irq与后面提到的handler不是一个,handle_irq是站在一个更高的角度来描述中断,例如中断的触发方式是电平触发还是边沿触发。
  • chip结构负责使用其提供的特定于控制器的方法,进行处理中断所必需的一些底层操作。
  • action提供一个操作链,由中断通知的设备驱动程序,可以将与之相关的处理程序函数放置在此处

irq_chip抽象出了一个IRQ控制器的具体特征,可用于内核的体系结构无关部分。它提供的函数用于改变IRQ的状态,即中断控制器实例。

struct irq_chip {
    const char *name;
    unsigned int (*startup)(unsigned int irq);
    void (*shutdown)(unsigned int irq);
    void (*enable)(unsigned int irq);
    void (*disable)(unsigned int irq);
    void (*ack)(unsigned int irq);
    void (*mask)(unsigned int irq);
    void (*mask_ack)(unsigned int irq);
    void (*unmask)(unsigned int irq);
    void (*eoi)(unsigned int irq);
    void (*end)(unsigned int irq);
    void (*set_affinity)(unsigned int irq, cpumask_t dest);
    ...
    int (*set_type)(unsigned int irq, unsigned int flow_type);
    ...

该结构需要考虑内核中出现的各个IRQ实现的所有特性。因而,一个该结构的特定实例,通常只定义所有可能方法的一个子集。

irqaction结构的定义如下,每个处理程序函数

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值