博客
关于我
Linux 中断之中断处理浅析
阅读量:804 次
发布时间:2019-03-24

本文共 2112 字,大约阅读时间需要 7 分钟。

1. 中断的概念

中断是指在CPU进行正常程序运行时,由于外部或内部事件的触发,CPU暂时停止当前任务,转而处理这个中断事件。这种机制在Linux系统中分为两大类:外部中断(硬件中断)内部中断(异常)。外部中断通常由硬件设备触发,而内部中断则是由于软件或硬件异常导致的事件处理。

在软硬件交互中,开发人员会通过轮询(Polling)或中断(IRQ)来等待硬件事件的到来。轮询方法会导致CPU不断检查硬件状态,而中断方法则是当硬件事件发生时,通过IRQ(中断请求)标记的方式通知CPU,确保系统效率更高。由于中断机制能有效减少CPU等待时间,它被广泛应用于I/O操作、网络数据传输等场景中。

当CPU接收到中断请求(IRQ)时,将立即切换到对应的中断服务程序(ISR-中断服务例程),执行完毕后再恢复之前被中断的任务。这类处理必须在中断上下文中完成,且不能阻塞,因为当前上下文已经不进行调度。


2. Linux中断的分层设计

在传统操作系统中,中断服务程序可能处理复杂的任务,但这样会增加系统延迟。为了优化性能,Linux引入了一种分层的中断处理机制:

  • 上半部分(Top Half)

    • 在收到中断时立即执行,仅进行必要的处理,如答应中断、复位设备等操作。
    • 由于这个阶段的处理必须快速完成,所有操作都在中断禁止状态下执行,确保系统流程不会被打断。
  • 下半部分(Bottom Half)

    • 让重任务推迟到后续处理,通过适当时机重新启用中断来执行复杂操作。这个机制涉及到中断调度器(Interrupt Scheduling单位),确保中断处理在适当时机进行,以减少对系统整体性能的影响。

  • 3. 中断处理程序的注册与管理

    在开发中,驱动程序可以通过一些API来管理中断处理。主要的函数包括:

  • request IRQ(申请中断处理程序)

    int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char *name, void *dev);
    • 参数
      • irq:中断号。
      • handler:中断处理函数。
      • flags:中断标志(如IRQF_DISABLED等)。
      • name:中断设备名称(用于/proc/irq文件)。
      • dev:设备结构,非共享中断时设为NULL。

    返回值为0或-EBUSY,表示中断号已经被占用或未设置共享标志。

  • free IRQ(释放中断处理程序)

    const void *free_irq(unsigned int irq, void *dev_id);

    用于释放已注册的中断处理函数。

  • 中断标志的含义

    • IRQF_DISABLED:禁止其他中断处理。
    • IRQF_SAMPLE_RANDOM:表示设备为熵池贡献。
    • IRQF_TIMER:定时器相关。
    • IRQF_SHARED:多个处理程序共享同一个中断线。

  • 4. 中断上下文的限制

    中断服务程序运行在中断上下文,这与用户模式进程的上下文不同之处在于:

    • 无法进行进程调度(如调用schedule()会导致BUG)。
    • 工作在内核的统一栈中,需谨慎处理数据结构。
    • 中断处理时间必须尽可能短,避免阻塞用户进程。

    5. 案例分析:RTC驱动中的中断处理

    RTC驱动在初始化时会申请中断资源,并注册中断处理程序:

    module_init(rtc_init);static int __init rtc_init(void) {    // 调用request_irq申请中断资源    request_irq(RTC_IRQ, rtc_int_handler_ptr, 0, "rtc", NULL);}

    中断处理函数rtc_inte匿哨器_ptr的实现会更新系统时间、唤醒等待队列等操作,确保实时性。


    6. 中断处理流程与数据结构

    6.1 中断处理流程

    当硬件中断被触发时:

  • 与中断控制器对应的irq_desc->handle_irq()被调用,因子.handle_bad_irq由默认实现。
  • 调用generic_handle_irq,根据中断描述找到相应的中断处理函数。
  • 处理中断事件,唤醒相关等待队列。
  • 6.2 中断相关数据结构

    • irq_desc:存储中断描述,包括处理函数和芯片特性。
    • irqaction:描述中断操作,包括日志和处理函数。
    • irq_chip:实现中断相关的芯片特定功能,包括启动、停止、复位等操作。

    通过这些数据结构,Linux将硬件中断与软件处理程序分离,使得系统更加灵活和高效。


    7. /proc/interrupts文件

    系统提供了/proc/interrupts文件,显示每个中断的用户、设备及统计信息,方便调试和监控中断系统状态。

    内容格式为:

    YYYY-MM-DD HH:MM:SS prio INT msg,dev每行表示一个中断号,包含设备名称和中断信息。

    总结

    中断机制是Linux系统的关键组件之一,其灵活的设计和高效的实现使得系统能够在不同场景下保持优异的性能。理解中断处理流程和相关数据结构有助于开发高效可靠的设备驱动程序。

    转载地址:http://gguuk.baihongyu.com/

    你可能感兴趣的文章
    NHibernate异常:No persister for的解决办法
    查看>>
    NIFI1.21.0_java.net.SocketException:_Too many open files 打开的文件太多_实际操作---大数据之Nifi工作笔记0051
    查看>>
    NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
    查看>>
    NIFI1.21.0_Mysql到Mysql增量CDC同步中_补充_更新时如果目标表中不存在记录就改为插入数据_Postgresql_Hbase也适用---大数据之Nifi工作笔记0059
    查看>>
    NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
    查看>>
    NIFI1.21.0最新版本安装_连接phoenix_单机版_Https登录_什么都没改换了最新版本的NIFI可以连接了_气人_实现插入数据到Hbase_实际操作---大数据之Nifi工作笔记0050
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_插入修改删除增量数据实时同步_通过分页解决变更记录过大问题_01----大数据之Nifi工作笔记0053
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表或全表增量同步_实现指定整库同步_或指定数据表同步配置_04---大数据之Nifi工作笔记0056
    查看>>
    NIFI1.23.2_最新版_性能优化通用_技巧积累_使用NIFI表达式过滤表_随时更新---大数据之Nifi工作笔记0063
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_生成插入Sql语句_实际操作02---大数据之Nifi工作笔记0041
    查看>>
    NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
    查看>>
    NIFI从MySql中离线读取数据再导入到MySql中_不带分页处理_01_QueryDatabaseTable获取数据_原0036---大数据之Nifi工作笔记0064
    查看>>
    NIFI从MySql中离线读取数据再导入到MySql中_无分页功能_02_转换数据_分割数据_提取JSON数据_替换拼接SQL_添加分页---大数据之Nifi工作笔记0037
    查看>>
    NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
    查看>>
    nifi使用过程-常见问题-以及入门总结---大数据之Nifi工作笔记0012
    查看>>
    NIFI分页获取Mysql数据_导入到Hbase中_并可通过phoenix客户端查询_含金量很高的一篇_搞了好久_实际操作05---大数据之Nifi工作笔记0045
    查看>>