软中断实现原理与应用

本文详细介绍了Linux内核中的软中断实现机制,包括软中断的静态分配、softirq_action结构、软中断数组的定义以及执行时机。软中断在处理硬件中断后、ksoftirqd线程中以及特定系统子系统中被激活。它们用于执行时间敏感且重要的任务,如网络和SCSI子系统。注册新软中断涉及分配索引、注册处理程序和触发软中断。软中断处理程序需要考虑多处理器同步和锁保护。
摘要由CSDN通过智能技术生成

软中断实现:

    1) 软中断是在编译期间静态分配的

    2) 软中断有softirq_action结构表示,它在

    中定义。

    3) static struct softirq_action sotfirq_vec[32]定义了软中断

    数组,每一个被注册的软中断都占据了该数据的一项、

    4) 一个软中断不会抢占另一个软中断,唯一可以抢占软中断的

    是中断处理程序。但其他软中断(包括相同类型的软中断)

    可以在其他处理器上同时运行。

    5) 一个注册的软中断必须在被标记之后才会执行,称为触发

    软中断(raising the softirq)。

软中断的执行时机:

    1) 处理完一个硬件中断以后,在irq_exit()调用。

    kernel/irq/handle.c

    2) 在ksoftirqd内核线程中。kernel/softirq.c

    3) 在显示检查和执行待处理的软中断的代码中,

    如网络子系统。

    4) 无论哪种方式唤起软中断处理,软中断都要

    在do_softirq()中执行。kernel/softirq.c

软中断使用:

    1)软中断是保留个系统中对时间要求最严格以及最重要的

    下半部分使用的。

    2) 目前只有网络子系统和SCSI子系统直接使用软中断

    3) 内核定时器和tasklet都是建立在软中断上的

    4) 只有当对时间要求严格并能高效的完成加锁工作时,才推

    荐使用软中断

  

添加新的软中断:

    1.分配索引

        1) 通过在中定义的枚举类型来静态

        地声明软中断。

        2) 索引表示一种相对优先级,索引号小的软中断先执行。

        3) 建立新的软中断必须在此枚举类型中加入新的项,根据

        所期望的优先级来决定加入的位置。

        4) 使用习惯:HI_SOFTIRQ作为第一项;

        TASKLET_SOFTIRQ作为最后一项;

    

    2.注册软中断处理程序

        1) 调用open_softirq()注册软中断处理函数

            软中断索引号

            软中断处理函数

            Data域存放的值

        2) 软中断处理程序的特点:

            允许响应中断,但其本身不能休眠

            其执行时,当前处理器的软中断被禁止,但其他处理器仍

                可执行,所以需要考虑多处理去的情况下的同步。

            其内部使用的全局变量也需要严格的锁保护

            不可通过互斥的加锁方法来防止其自身的并发

    

    3.触发软中断

        1) 通过raise_softirq()将软中断设置为挂起状态

            rasie_softirq()参数为软中断号

            在触发软中断前禁止中断,触发后在恢复原来的状态

        2)raise_softirq_irqoff()

            当中断本身就已经被禁止时,用此函数将中断置为挂起状态。

        3) 内核执行完中断处理程序以后,马上会调用do_softirq(),让

        软中断去完成 中断处理程序未完成的工作。

        

   

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值