当前位置: 首页 > news >正文

中断子系统

1. 中断子系统的核心作用

1.1 屏蔽硬件差异:无论底层是 GIC(ARM 规范中断控制器)还是 GPIO 模拟的中断,驱动程序都使用统一的虚拟中断号(IRQ Number)。

1.2 上下半部管理:

  • 上半部(Top Half):硬中断处理,要求极快,仅处理最紧迫的硬件清理工作。
  • 下半部(Bottom Half):处理耗时工作(如数据拷贝、协议解析),通过 Tasklets、工作队列或线程化中断(Threaded IRQ)实现。

1.3 中断共享:允许多个设备共享同一个物理中断线(PCIe 设备的标配)。

2. 核心数据结构

2.1 struct irq_desc

作用:它是内核管理中断的“户口本”。内核为每一个虚拟中断号(IRQ Number)都维护了一个 irq_desc 结构。它记录了该中断的所有状态信息和处理流程。

struct irq_desc {struct irq_data		irq_data;       /* 中断数据:包含硬件中断号、底层芯片(irq_chip)等 */irq_flow_handler_t	handle_irq;     /* 上层流控处理函数:如 handle_level_irq 或 handle_edge_irq */struct irqaction	*action;        /* 行为链表:指向用户通过 request_irq 注册的处理函数(ISR) */unsigned int		status_use_accessors; /* 状态位:记录中断是否被禁用、是否在执行中等 */raw_spinlock_t		lock;           /* 自旋锁:保护描述符在多核环境下的并发访问 */const char		*name;          /* 中断名称 */
} ____cacheline_aligned_in_smp;

2.2 struct irq_chip

作用:它是中断控制器的“驱动操作表”。由于不同芯片(如 ARM 的 GIC、x86 的 APIC、或者 GPIO 扩展出来的中断)操作寄存器的方式完全不同,内核抽象出这个结构体,让底层驱动去填充。

struct irq_chip {const char	*name;                  /* 芯片名称,如 "GICv3" 或 "gpio-mxc" */void (*irq_mask)(struct irq_data *data);   /* 屏蔽中断:禁止该硬件中断触发 */void (*irq_unmask)(struct irq_data *data); /* 解除屏蔽:允许该硬件中断触发 */void (*irq_ack)(struct irq_data *data);    /* 确认中断:告诉硬件“我已经收到中断了” */void (*irq_eoi)(struct irq_data *data);    /* 中断结束:End of Interrupt,清理中断控制器状态 */int (*irq_set_type)(struct irq_data *data, unsigned int flow_type); /* 设置触发类型:电平或边沿触发 */
};

2.3 irq_handler_t (中断处理函数类型)

作用:这是一个函数指针类型的定义。你在驱动中写的那个处理中断的函数,必须符合这个“合同”约定的签名。
typedef irqreturn_t (*irq_handler_t)(int irq, void *dev_id);
参数与返回值解析:

  • irq:触发中断的虚拟中断号。
  • dev_id:用户注册时传入的私有指针(通常指向驱动的自定义结构体)。对于共享中断,它是区分不同设备的唯一标识。

返回值 irqreturn_t:是一个枚举。

  • IRQ_HANDLED:表示该中断确实是我的设备触发的,且已处理完毕。
  • IRQ_NONE:表示该中断不是我的设备触发的(用于共享中断)。
  • IRQ_WAKE_THREAD:用于线程化中断,告诉内核唤醒下半部线程。

3. 常用宏

3.1 IRQF_TRIGGER_RISING 上升沿触发。

3.2 IRQF_TRIGGER_FALLING 下降沿触发。

3.3 IRQF_SHARED 共享中断。多个设备共用一根线时必须加,且 dev_id 必须唯一。

3.4 IRQF_ONESHOT 一次性触发。主要用于线程化中断,在下半部执行完前不重启硬中断。

4. 核心函数 (API 速查)

4.1 int devm_request_irq(struct device *dev, unsigned int irq, irq_handler_t handler, unsigned long irqflags, const char *devname, void *dev_id)

作用:向内核注册一个简单的中断处理函数。带有 devm_ 前缀,驱动卸载时自动释放。
参数:

  • dev:申请资源的设备指针。
  • irq:虚拟中断号。
  • handler:硬中断处理函数(上半部)。
  • irqflags:触发方式(如 IRQF_SHARED)。
  • name:/proc/interrupts 中显示的名称。
  • dev_id:传给处理函数的私有指针(通常传驱动私有结构体)。

返回值:成功返回 0,失败返回负数错误码。

4.2 int devm_request_threaded_irq(struct device *dev, unsigned int irq, irq_handler_t handler, irq_handler_t thread_fn, unsigned long irqflags, const char *devname, void *dev_id)

作用:注册线程化中断。这是目前最推荐的方式。
参数:

  • dev:申请资源的设备指针。
  • irq:虚拟中断号。
  • handler:硬中断处理函数(上半部)。
  • thread_fn:中断线程化处理函数(下半部)。它在内核线程中运行,可以休眠。
  • irqflags:触发方式(如 IRQF_SHARED)。
  • name:/proc/interrupts 中显示的名称。
  • dev_id:传给处理函数的私有指针(通常传驱动私有结构体)。

逻辑:

  • 如果 handler 返回 IRQ_WAKE_THREAD,内核会唤醒 thread_fn 执行。
  • 如果 handler 为 NULL,内核提供默认处理,直接唤醒 thread_fn。

4.3 void disable_irq(unsigned int irq)

作用:关闭指定的中断号,并同步等待。它不仅会通知中断控制器屏蔽该中断,还会确保如果该中断正在其他 CPU 上运行,函数会阻塞(等待)直到那个处理函数执行完毕。
参数:irq:要禁用的虚拟中断号。

4.4 void enable_irq(unsigned int irq)

作用:重新使能之前被禁用的中断号。
参数:irq:要使能的虚拟中断号。

4.5 void disable_irq_nosync(unsigned int irq)

作用:关闭指定的中断号,但不进行同步等待。它仅仅在中断控制器层面屏蔽掉该中断,然后立即返回,不会管当前是否有该中断的处理函数正在其他 CPU 上运行。
参数:irq:要禁用的虚拟中断号。

4.6 local_irq_save(flags)

作用:

  • 禁止中断:关闭当前 CPU 上的所有外部中断响应。
  • 保存状态:将 CPU 当前的中断标志位(EFLAGS 或类似的寄存器)保存到传入的变量 flags 中。

参数:flags:必须是一个 unsigned long 类型的左值(变量名)。这个变量将用来存储当前 CPU 的中断状态。

4.7 local_irq_restore(flags)

作用:将当前 CPU 的中断状态恢复到 flags 中记录的状态。如果 flags 显示之前中断是开着的,那就打开;如果是关着的,那就继续保持关闭。
参数:flags:之前通过 local_irq_save 填充的那个 unsigned long 变量。

http://www.jsqmd.com/news/650962/

相关文章:

  • [漏洞剖析]正方数字化校园平台SOAP接口任意文件上传漏洞的成因与利用链
  • 告别电脑依赖!手把手教你用手机上的MTKLogger抓取Android/Modem/蓝牙全链路日志
  • 开篇:会展经济热潮下的成都展台搭建新诉求 - 资讯焦点
  • SystemVerilog参数传递的‘潜规则’:一个ref声明是如何‘坑’掉你整个task的?
  • 告别卡顿!用H.265/HEVC的帧间预测技术,手把手教你优化视频压缩(附实战代码)
  • 网易企业邮箱申请优惠渠道,一站式开通服务享专属优惠福利 - 品牌2025
  • 朱雀AI检测率高怎么降?分步教程:先免费试用再付费
  • 论文查重报告,看了像恐怖片?好写作AI说:我们换个演法
  • 2026年值得信赖的除颤器厂家盘点,助您找到口碑优质好商家 - 品牌2026
  • OpenRocket火箭设计软件:从零开始打造你的专属火箭模型 [特殊字符]
  • 3步掌握Chrome独立代理:浏览器专属网络加速指南
  • 【研报313】能源安全与油价中长期上行的汽车与零部件行业分析报告:整车全球化+汽零配套+AI新业务三维增长
  • 3分钟终极指南:如何用KMS_VL_ALL_AIO免费激活Windows和Office全系列
  • 推荐收藏:2026智慧工厂UWB高精度定位方案商推荐 - 品牌2025
  • 外贸AI营销平台哪家好?2026一站式出海营销服务商推荐,助力外贸企业实现精准获客+出海提效(附带联系方式) - 品牌2026
  • 如何利用SQL视图过滤异常数据_质量清洗逻辑封装
  • 开篇:意大利展厅成为品牌驻意核心竞争力 - 资讯焦点
  • Dart 2025快速入门指南:从零到Flutter开发
  • 盘点2026国内六家优质边缘计算盒子厂商,选型不踩坑 - 品牌2026
  • 新手必懂——深度学习,让AI拥有“深度思考”能力
  • 生成式AI安全审计进入倒计时:欧盟AI Act生效在即,企业仅剩47天完成三级合规审计(含自动化审计工具链)
  • 前言:2026 新加坡展厅搭建的核心价值诉求 - 资讯焦点
  • GPEN输入格式要求:支持JPG/PNG等常见图片类型
  • 2026边缘计算盒子哪家算力高?六家优质厂家甄选推荐 - 品牌2026
  • LaTeX写作必备:三种横线符号的正确用法(破折号、En Dash、连字符)
  • 2026污泥处理优选:干燥机厂家及产品性能评测,做得好的干燥机产品口碑推荐一新干燥引领行业标杆 - 品牌推荐师
  • 外贸企业申请网易企业邮箱推荐,2026高效稳定海外收发邮箱优选 - 品牌2025
  • 告别语言障碍:FigmaCN中文插件让设计工作流更高效
  • 2026年3月市面上好氧池水下清淤机器人直销厂家,目前有实力的好氧池水下清淤机器人生产厂家找哪家聚焦技术实力与行业适配性 - 品牌推荐师
  • 生成式AI数据回流不是“收集数据”,而是构建认知飞轮:揭秘头部AIGC平台正在封测的动态权重回流算法(专利号CN2024XXXXXX.X)