16.2.1 Linux内核网络协议层的层间传递手段——软中断

16.2.1  Linux内核网络协议层的层间传递手段——软中断

网络协议栈是分层实现的,如何实现高效的网络数据是协议栈设计的核心问题之一。

1Linux内核中软中断的机制

Linux内核中是采用软中断的方式实现的,软中断机制的实现原理如图16.9所示。

 

16.9  软中断架构示意图

软中断机制的构成核心元素包括软中断状态、软中断向量表和软中断守护内核线程。

q      软中断状态:即是否有触发的软中断未处理。

q      软中断向量表:包含两个成员变量,一个是处理此软中断的回调函数,另一个是处理时所需的参数。

q      软中断守护内核线程:内核建立一个内核线程ksoftirqd来轮询软中断状态,调用软中断向量表中的软中断回调函数处理中断。

Linux内核中的软中断的工作框架模拟了实际的硬中断处理过程。当某一软中断事件发生后,首先调用raise_softirq()函数设置对应的中断标记位,触发中断事务。然后会检测中断状态寄存器的状态,如果ksoftirqd通过查询发现某一软中断事务发生之后,那么通过软中断向量表调用软中断服务程序action

软中断的过程与硬中断是十分类似的,二者的唯一不同之处是从中断向量到中断服务程序的映射过程。在CPU的硬件中断发生之后,CPU的具体的服务程序通过中断向量值进行映射,这个过程是硬件自动完成的。但是软中断的中断映射不是自动完成的,需要中断服务守护线程去实现这一过程,这也就是软件模拟的中断。

2Linux内核中软中断的使用方法

Linux系统中最多可以同时注册32个软中断,目前系统使用了6个软中断,它们是定时器处理、SCSI处理、网络收发处理以及tasklet机制,这里的tasklet机制就是用来实现下半部的,描述软中断的核心数据结构为中断向量表,其定义如下:

 

struct softirq_action

{

    void (*action)(struct softirq_action *);

    void *data; 

};

 

q      action为软中断服务程序。

q      data为服务程序输入参数。

软中断守护程序是软中断机制实现的核心,它的实现过程比较简单。通过查询软中断的状态来判断是否发生事件,当发生事件就会映射软中断向量表,调用执行注册的action()函数就可以了。从这一点分析可以看出,软中断的服务程序是daemon。在Linux中软中断daemon线程函数为do_softirq()

触发软中断事务通过raise_softirq()来实现,该函数就是在中断关闭的情况下设置软中断状态位,然后判断如果不再中断上下文,那么直接唤醒守护daemon

常用的软中断函数列表如下:

q      open_softirq():它注册一个软中断,将软中断的服务程序注册到系统的软中断向        量表。

q      raise_softirq():设置软中断状态映射表,触发软中断事务响应。

Linux软中断的处理框架也采用了上半部和下半部的处理方式。软中断的上半部处理紧急的、需要立即处理的、关键性的处理动作,例如网卡驱动的接收动作,当有中断到达的时候,先查询网卡的中断寄存器,判断为何种方式的中断,清空中断寄存器后,复制数据,然后设置软中断的状态,触发软中断。软中断的下半部进行数据处理,而下半部则相对来说并不是非常紧急的,通常还是比较耗时的,因此由系统自行安排运行时机,不在中断服务上下文中执行。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值