没有合适的资源?快使用搜索试试~ 我知道了~
NAPI-技术在-Linux-网络驱动上的应用和完善.docx
1 下载量 13 浏览量
2022-11-28
19:18:33
上传
评论
收藏 90KB DOCX 举报
温馨提示
试读
14页
NAPI-技术在-Linux-网络驱动上的应用和完善.docx
资源推荐
资源详情
资源评论
1
NAPI 是 Linux 上采用的一种提高网络处理效率的技术,它的核心概念就是不采用中断的
方式读取数据,而代之以 POLL 的方法来轮询数据,类似于底半方式〔bottom-half 的处理
模式〕;但是目前在 Linux 的 NAPI 工作效率比拟差,本文在分析 NAPI 的同时,提供了
一种高效的改善方式供大家参考。
前言:
NAPI 是 Linux 上采用的一种提高网络处理效率的技术,它的核心概念就是不采用中
断的方式读取数据,而代之以首先采用中断唤醒数据接收的效劳程序,然后 POLL 的方法
来轮询数据,〔类似于底半〔bottom-half〕处理模式〕;从我们在实验中所得到的数据来看,
在随着网络的接收速度的增加,NIC 触发的中断能做到不断减少,目前 NAPI 技术已经在
网卡驱动层和网络层得到了广泛的应用,驱动层次上已经有 E1000 系列网卡,RTL8139 系
列网卡,3c50X 系列等主流的网络适配器都采用了这个技术,而在网络层次上,NAPI 技术
已 经 完 全 被 应 用 到 了 著 名 的 netif_rx 函 数 中 间 , 并 且 提 供 了 专 门 的 POLL 方 法
--process_backlog 来处理轮询的方法;根据实验数据说明采用 NAPI 技术可以大大改善短长
度数据包接收的效率,减少中断触发的时间;由于 RTL8139CP 是一种应用比拟广泛的网
络适配器,所以本文以其为例,说明了 NAPI 技术在网络适配器上的应用和根本原理。
但是 NAPI 存在一些比拟严重的缺陷:而对于上层的应用程序而言,系统不能在每个
数据包接收到的时候都可以及时地去处理它,而且随着传输速度增加,累计的数据包将会消
耗大量的内存,经过实验说明在 Linux 平台上这个问题会比在 FreeBSD 上要严重一些;
另外采用 NAPI 所造成的另外一个问题是对于大的数据包处理比拟困难,原因是大的数据
包传送到网络层上的时候消耗的时间比短数据包长很多〔即使是采用 DMA 方式〕,所以正
如前面所说的那样,NAPI 技术适用于对高速率的短长度数据包的处理,在本文的末尾提出
了 NAPI 的改善方法,和实验数据。
使用 NAPI 先决条件:
驱动可以继续使用老的 2.4 内核的网络驱动程序接口,NAPI 的参加并不会导致向前
兼容性的丧失,但是 NAPI 的使用至少要得到下面的保证:
A. 要使用 DMA 的环形输入队列〔也就是 ring_dma,这个在 2.4 驱动中关于 Ethernet
的局部有详细的介绍〕,或者是有足够的内存空间缓存驱动获得的包。
B. 在发送/接收数据包产生中断的时候有能力关断 NIC 中断的事件处理,并且在关断
NIC 以后,并不影响数据包接收到网络设备的环形缓冲区〔以下简称 rx-ring〕处理队列中。
NAPI 对数据包到达的事件的处理采用轮询方法,在数据包到达的时候,NAPI 就会强
制执行 dev->poll 方法。而和不象以前的驱动那样为了减少包到达时间的处理延迟,通常采
用中断的方法来进行。
应当注意的是,经过测试如果 DEC Tulip 系列〔DE21x4x 芯片〕以及 National Semi
的局部网卡芯片,的测试说明如果把从前中断处理的局部都改换用设备的 POLL 方法去执
行,那么会造成轻微的延迟,因此在进行 MII〔介质无关〕的操作上就需要一些小小的诀
窍,详见 mii_check_media 的函数处理流程,本文不做详细讨论。
在下面显示的例子表示了在 8139 中如何把处理过程放在 dev 的 poll 方法中,把所有
的原来中断应该处理的过程放在了 POLL 方法里面,篇幅起见,我们只介绍接收的 POLL
方法。
在下面的 8139CP 驱动程序介绍中说明了可以把在中断程序中所做的任何事情放在
POLL 方法中去做,当然不同的 NIC 在中断中所要处理的状态和事件是不一样的。
对于所有的 NIC 设备,以下两种类型的 NIC 接收事件存放器响应机制:
COR 机制:当用户程序读状态/事件存放器,读完成的时候存放器和 NIC 的 rx-ring 中
表示的状态队列将被清零,natsemi 和 sunbmac 的 NIC 会这样做,在这种情况下,必须把
2
NIC 所有以前的中断响应的处理局部都移动到 POLL 方法中去。
COW 机制:用户程序写状态存放器的时候,必须对要写的位先写 1 清 0,如下面要
介绍的 8139CP 就是这样的类型,大多数的 NIC 都属于这种类型,而且这种类型对 NAPI
响应得最好,它只需要把接收的数据包处理局部放置在 POLL 方法中,而接收事件的状态
处理局部放在原先的中断控制程序中,我们等下将要介绍的 8139CP 类型网卡就是属于这种
类型。
C. 有防止 NIC 队列中排队的数据包冲突的能力。
当关断发送/接收事件中断的时候,NAPI 将在 POLL 中被调用处理,由于 POLL 方
法的时候,NIC 中断已经不能通知包到达,那么这个时候在如果在完成轮询,并且中断翻
开以后,会马上有一个 NIC 中断产生,从而触发一次 POLL 事件,这种在中断关断时刻
到达的包我们称为"rotting";这样就会在 POLL 机制和 NIC 中断之间产生一个竞争,解决
的方法就是利用网卡的接收状态位,继续接收环形队列缓冲 rx-ring 中的数据,直到没有数
据接收以后,才使能中断。
锁定和防冲突机制:
- 1.SMP 的保证机制:保证同时只有一个处理器调用网络设备的 POLL 方法,因为我
们将在下面看到同时只有一个处理器可以对调用 netif_rx_schedule 挂在 POLL 队列中的
NIC 设备调用 POLL 方法。
- 2. 网络核心层〔net core〕调用设备驱动程序使用循环方式发送数据包,在设备驱动层
接收数据包的时候完全无锁的接收,而网络核心层那么同样要保证每次只有一个处理器可以
使用软中断处理接收队列。
- 3. 在多个处理器对 NIC 的 rx-ring 访问的时刻只能发生在对循环队列调用关闭
〔close〕和挂起〔suspend〕方法的时候〔在这个时刻会试图去除接收循环队列〕
- 4. 数据同步的问题〔对于接收循环队列来说〕,驱动程序是不需要考虑的网络层上的
程序已经把这些事情做完了。
- 5. 如果没有把全部的局部交给 POLL 方法处理,那么 NIC 中断仍然需要使能,接
收链路状态发生变化和发送完成中断仍然和以前的处理步骤一样,这样处理的假设是接收中
断是设备负载最大的的情况,当然并不能说这样一定正确。
下面的局部将详细介绍在接收事件中调用设备的 POLL 方法。
NAPI 提供的重要函数和数据结构和函数:
核心数据结构:
struct softnet_data 结构内的字段就是 NIC 和网络层之间处理队列,这个结构是全局的,
它从 NIC 中断和 POLL 方法之间传递数据信息。其中包含的字段有:
struct softnet_data
{
intthrottle;/*为 1 表示当前队列的数据包被禁止*/
intcng_level;/*表示当前处理器的数据包处理拥塞程度*/
intavg_blog;/*某个处理器的平均拥塞度*/
struct sk_buff_headinput_pkt_queue;/*接收缓冲区的 sk_buff 队列*/
struct list_head poll_list;/*POLL 设备队列头*/
struct net_device output_queue; /*网络设备发送队列的队列头*/
struct sk_buffcompletion_queue; /*完成发送的数据包等待释放的队列*/
struct net_devicebacklog_dev;/*表示当前参与 POLL 处理的网络设备*/
};
核心 API:
3
1. netif_rx_schedule(dev)
这个函数被中断效劳程序调用,将设备的 POLL 方法添加到网络层次的 POLL 处理队
列中去,排队并且准备接收数据包,在使用之前需要调用 netif_rx_reschedule_prep,并且返
回的数为 1,并且触发一个 NET_RX_SOFTIRQ 的软中断通知网络层接收数据包。
2. netif_rx_schedule_prep(dev)
确定设备处于运行,而且设备还没有被添加到网络层的 POLL 处理队列中,在调用
netif_rx_schedule 之前会调用这个函数。
3. netif_rx_complete(dev)
把当前指定的设备从 POLL 队列中去除,通常被设备的 POLL 方法调用,注意如果在
POLL 队列处于工作状态的时候是不能把指定设备去除的,否那么将会出错。
如何在 8139CP 使用 NAPI:
剩余13页未读,继续阅读
资源评论
matlab大师
- 粉丝: 2375
- 资源: 9万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 论文(最终)_20240430235101.pdf
- 基于python编写的Keras深度学习框架开发,利用卷积神经网络CNN,快速识别图片并进行分类
- 最全空间计量实证方法(空间杜宾模型和检验以及结果解释文档).txt
- 5uonly.apk
- 蓝桥杯Python组的历年真题
- 2023-04-06-项目笔记 - 第一百十九阶段 - 4.4.2.117全局变量的作用域-117 -2024.04.30
- 2023-04-06-项目笔记 - 第一百十九阶段 - 4.4.2.117全局变量的作用域-117 -2024.04.30
- 前端开发技术实验报告:内含4四实验&实验报告
- Highlight Plus v20.0.1
- 林周瑜-论文.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功