网络收包过程中的硬中断处理

当有数据到达网卡的时候,网卡会触发一个硬中断。硬中断做了一些必要的操作,对于IGB网卡来说,该中断函数为igb_msix_ring

static irqreturn_t igb_msix_ring(int irq, void *data)
{
    struct igb_q_vector *q_vector = data;

    /* Write the ITR value calculated from the previous interrupt. */
    igb_write_itr(q_vector);

    napi_schedule(&q_vector->napi);

    return IRQ_HANDLED;
}

igb_write_itr中记录了硬中断的次数,简单的累加过程。最主要的是napi_schedule函数,该函数将网卡的polling方法添加到CPU变量softnet_data中。
该函数最终调用__napi_schedule函数:

void __napi_schedule(struct napi_struct *n)
{
	unsigned long flags;

	local_irq_save(flags);
	____napi_schedule(this_cpu_ptr(&softnet_data), n);
	local_irq_restore(flags);
}

____napi_schedule函数将polling方法添加到softnet_data上。

为什么是polling方法呢,我们看一下这个函数的传参,struct napi_struct *n,通过napi_schedule(&q_vector->napi);传递过来,q_vector是一个igb_q_vector 结构体,是在网卡open方法中,通过注册中断函数来的。
在这里插入图片描述
adapter获取的是每个网卡的私有数据,其中网卡的私有数据中,就包含了该网卡polling方法的信息:
在这里插入图片描述
但是这里我有一点还没看明白,这个结构体的参数为什么是个数组?这个不是代表的中断向量?
在这里插入图片描述

### 内中断与外中断的区别 内中断是由处理器内部产生的信号引发的,通常由于软件指令触发或者CPU检测到某些特定条件而发生。例如,在执行一条非法操作码时会触发异常[^1]。这种类型的中断完全由系统本身控制,并且不需要外部硬件的支持。 相比之下,外中断则是来源于处理器之外的因素,通常是通过专门的输入线路传递给系统的信号来启动。这些信号可能来自于I/O设备或其他外围组件请求服务的情况。当某个外部设备完成了一项任务并需要通知CPU时就会发送这样的中断请求[^1]。 ### 软中断与硬中断的定义及应用场景 #### 硬中断 硬中断是指来自物理世界中的实际事件所产生的即时打断行为,比如键盘按键动作或磁盘读取完毕后的反馈消息等。这类中断往往具有较高的优先级因为它们涉及到实时性的需求——如果延迟处理可能会造成数据丢失或者其他严重后果。因此,硬中断一般对应于中断处理过程中的上半部分,专注于迅速响应那些对时间非常敏感的任务[^3]。 #### 软中断 软中断并非直接源自任何具体的硬件装置而是更多地反映了操作系统层面的设计考量。它可以看作是对传统意义上的“中断”概念的一个扩展形式,允许将原本应该立即被执行的工作推迟至稍后适当的时候再进行处理。这不仅有助于减轻主循环逻辑的压力还能更好地利用现代多核架构的优势从而提高整体效率[^2]。 在具体应用方面,软中断常被用于管理诸如网络/传输这样既重要又相对耗时的过程;或者是像RCU锁定机制那样涉及复杂同步关系但并不紧急的情形下作为解决方案的一部分存在[^2]。另外还括其他各种各样的后台维护活动都可以归入此类别当中只要满足其基本特征即可:不必马上解决但却仍然不可或缺的功能模块运作环节。 ```python def handle_interrupt(interrupt_type): if interrupt_type == 'hard': # 处理硬中断, 时间敏感型任务 process_time_critical_task() elif interrupt_type == 'soft': # 推迟处理较复杂的任务 schedule_deferred_work() handle_interrupt('hard') # 响应硬中断 handle_interrupt('soft') # 安排软中断 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值