1 影响数据传输的因素
- 数据传输方式。驱动与网卡进行数据传输有轮询方式、中断方式和DMA方式。不同的传输方式会影响数据传输的效率。
- 中断开销。中断处理中要保护程序的上下文,这些处理会消耗CPU资源。如果中断非常频繁的话,会影响整个系统的效率。
- 内存拷贝开销。大批量的内存拷贝会消耗大量的CPU资源。如果发生缺页异常的话,需要从外部设备中将数据调入内存中,这样会增大时延。
2 解决上述问题的方法
- 减少中断开销。接收到中断请求后关闭中断,将数据处理完成后再打开中断。具体采用NAPI技术,结合关中断和合中断技术。网卡硬件在接受多个数据包后,触发接受中断,网卡驱动在中断处理程序中调度接收线程,并关闭设备中断,然后从硬中断中返回。返回后并不打开中断,所以系统不会被后来的接受或发送中断打扰,直到接收线程处理了所有待处理的数据包后激活设备的接收中断。
- 减少内存拷贝。基本思想是实现内存共享,在不同对象对数据处理时要注意同步和互斥。借鉴Zero-Copy技术,用户空间和网卡驱动共享缓冲区结构。Zero-Copy技术在对数据包处理的过程中越过了对内核协议栈的处理,所以常用于在有对数据包进程协议处理的驱动。
在微内核中,协议栈是在网络服务器中进程处理的。应该可以直接使用该技术。
DMA技术不通过CPU进行内存之间的拷贝,减少CPU的负载,实现Zero-Copy。借助DMA技术应该可以使驱动和网卡之间的内存拷贝更快。在后续实现时可以考虑使用DMA技术进行内存拷贝。
- 选用高速中线。网卡驱动中要对总线及其设备进行初始化,并封装对数据的收发操作。
3 网卡驱动设计
3.1 功能需求分析
- 初始化网卡硬件。内核启动或加载网卡驱动模块的时候,完成对硬件的初始化。建立注册网卡在内存中对应的结构体、缓冲区、设备的MAC地址和相应的中断处理函数。
- 提供网卡的配置与管理接口。提供给用户程序需要的网络地址、硬件地址,配置MAC数据路由等。
- 完成数据包的收发。完成用户程序与网卡之间的数据传输功能。
3.2 网卡驱动工作原理
由内核中的相关子例程和数据组成的I/O设备软件接口。子例程包括打开/关闭/配置设备接口、发送/接收数据接口。这些接口为用户程序提供了网卡和对网卡操作的抽象(将网卡设备抽象成设备文件,将对网卡的操作抽象为对文件的操作)。用户程序使用这些接口,可以像操作文件一样操作网卡设备。
3.3 网卡驱动的体系结构
从上到下分为四层,分别为网络协议接口层、网络设备接口层、提供实际功能的设备驱动功能层和网络媒介层。网络设备接口是网卡在内存中的映像,反应网卡的状态和能够对网卡进行什么操作。设备驱动功能层是各个功能的封装实现。网络媒介层为网卡与网络环境的概述。网卡驱动的体系结构如下图所示,下图中的函数名为Linux中的函数。
3.4 网卡驱动的关键数据结构
- net_device结构。声明定义网卡设备和管理网卡设备的方法。网卡的抽象。
- sk_buff(套接字缓冲区)结构。声明定义套接字缓冲区和管理缓冲区的方法。网卡端口的抽象。
参考文献:
易正利. 基于Linux的千兆网卡驱动程序实现及数据传输效率优化