剖析Linux内核的中断处理机制

中断是为了解决外部设备完成某些工作后通知CPU的一种机制。

1.为什么把中断分为两个部分

Linux 系统为了解决中断处理程序执行过长和中断丢失的问题,将中断过程分成了两个阶段,分别是上半部和下半部分。前半部分内核立即执行,而后半段稍后处理。
上半部用来快速处理中断,一般会暂时关闭中断请求,主要负责处理跟硬件紧密相关或者时间敏感的事情。必须在一个新的中断产生之前终止。(硬中断)
下半部用来延迟处理上半部未完成的工作,一般以内核线程的方式运行。(软中断)

2.软中断

软中断机制也是推迟内核函数的执行。软中断本身是一种机制,也是一种基本架构。具体的内核定义用一个enum定义:

enum
{
    HI_SOFTIRQ=0, /* 高优先级tasklet */ /* 优先级最高 */
    TIMER_SOFTIRQ, /* 时钟相关的软中断 */
    NET_TX_SOFTIRQ, /* 将数据包传送到网卡 */
    NET_RX_SOFTIRQ, /* 从网卡接收数据包 */
    BLOCK_SOFTIRQ, /* 块设备的软中断 */
    BLOCK_IOPOLL_SOFTIRQ, /* 支持IO轮询的块设备软中断 */
    TASKLET_SOFTIRQ, /* 常规tasklet */
    SCHED_SOFTIRQ, /* 调度程序软中断 */
    HRTIMER_SOFTIRQ, /* 高精度计时器软中断 */
    RCU_SOFTIRQ, /* RCU锁软中断,该软中断总是最后一个软中断 */      /* 优先级最低 */

    NR_SOFTIRQS /* 软中断数,为10 */
};

每一个优先级的软中断都使用一个struct softirq_action结构来表示,在这个结构中,只有一个成员变量,就是action函数指针,因为不同的软中断它的处理方式可能不同。软中断向量如下所示:

/* 用于描述一个软中断 */
struct softirq_action
{
    /* 此软中断的处理函数 */
    void (*action)(struct softirq_action *);
};

软中断控制状态结构:softirq_cec[]是一个全局变量,系统中的每个CPU所看到的是同一个数组,但是,每个CPU各有自己的软中断控制状态结构。irq_stat[]数组是一个全局量,但是各个CPU可以按自身的编号访问相应的域。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZhInen丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值