Linux 中断处理

本文详细解析了Linux中断机制,包括中断的基本概念、中断处理程序的注册与释放、中断上下文、上半部与下半部的区别,以及中断绑定到CPU的方法。还介绍了软中断、tasklet和工作队列等下半部执行机制的使用和实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、基本概念

1、中断及中断上下文

        中断是一种由硬件设备产生的信号,不同设备产生的中断通过中断号来区分。CPU在接收到中断信号后,根据中断号执行对应的中断处理程序(Interrupt Service Routine) 

内核对异常和中断的处理类似,差别只在于中断是由硬件引起的

异常举例:软中断实现系统调用,缺页异常,除0异常

中断上下文:执行一个中断处理程序时,内核处于中断上下文中

注:在中断上下文中不允许睡眠,这是因为中断上下文没有后备进程,即无法被调度唤醒

2、上半部与下半部

        一般将中断处理分为上半部和下半部

上半部:在接收到中断后只完成有严格时限要求的工作,如对中断应答或者复位硬件,此时中断是被禁止的

下半部:指中断处理流程中推后执行的那一部分,在合适的时机执行,此时允许相应所有的中断

3、下半部和推后执行的工作

         除了对时间敏感且保证不被其他中断打断的部分,剩余的任务考虑在下半部执行,下半部的实现机制有以下几种

下半部机制 功能 状态
BH(bottom half) 一个静态创建、由32个bottom halves组成的链表,上半部通过32整数中的一位来标识出哪个bottom half可以执行,虽然分属不同处理器,也不允许任何两个bottom half同时执行。(不够灵活,简单有性能瓶颈) Linux 2.5移除
任务队列 引入任务队列机制来实现工作的推后执行,替代BH机制。驱动程序会将下半部注册到相应的等待队列,等待调用执行。(不够灵活,不能满足性能要求较高的子系统) Linux 2.5移除
软中断(Softirq) 一组静态定义的下半部接口,有32个,可以在所有处理器上同时运行,同类型的接口也可以同时执行。tasklet是需要在编译阶段进行静态注册。(针对性能要求较高的子系统) Linux 2.3引入
tasklet 一组基于软中断实现的灵活性强、动态创建的下半部实现机制, 不同类型的tasklet可以在不同的处理器上执行, 但类型相同tasklet,不能同时执行。tasklet可以通过代码进行动态注册。(大部分的场景) Linux 2.3引入
工作队列(Work queues) 工作队列取代了任务队列 Linux 2.3引入

二、中断处理程序

1、注册中断处理程序

int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char *name,void *dev);
irq:要分配的中断号
handler:指向这个中断的处理程序
flag:可以为0,也可以是一个或多个标志的掩码
    IRQF_DISABLED --- 内核在处理中断处理程序期间,禁止所有的其他中断
    IRQF_SAMPLE_RANDOM --- 该设备产生的中断对内核熵池有贡献,内核熵池负责从各个随机事件导出真正的随机数
    IRQF_TIMER --- 为系统定时器的中断处理而准备
    IRQF_SHARED --- 多个中断处理程序之间共享中断线,同一个中断线的所有的中断处理程序都要指定该标志
name:设备ASCLL文本,会被proc/interrupts文件使用,以便与用户通信
dev:主要用于共享中断线,dev提供唯一标志信息(cookie),用来区分共享一个中断的多个设备,当一个中断处理程序需要释放时,以便从共享中断线的诸多处理程序中删除指定的一个,如果没有共享中断,设置为NULL即可

注:此函数会睡眠,所以不要在中断上下文中调用

2、释放中断处理程序

void free_irq(unsigned int irq, void *dev)

        卸载驱动处理程序时,需要注销相应的中断处理程序,并释放中断线<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值