《精通Linux设备驱动程序开发》——网络接口卡

一、驱动程序数据结构

 一)、简介

  1、在为一个NIC写设备驱动程序时,必须操作3类数据结构

   1)、形成网络协议栈构造块的数据结构。套接字缓冲区,即定义在include/linux/sk_buff.h文件中的结构体sk_buff,是内核TCP/IP栈使用的关键结构体。

   2)、定义NIC驱动程序和协议栈间接口的数据结构。定义在include/linux/netdevice.h文件中的结构体net_device是构成该接口的核心结构体。

   3)、与I/O总线相关的结构体。PCI及其派生总线的如今NIC使用的常见总线。



 二)、套接字缓冲区

  1、sk_buff为网络层提供了高效的缓冲区处理和流量控制机制。。sk_buff拥有描述符对应内存缓冲区的控制信息。


  2、sk_buff用5个主要的域将它自身与数据包缓冲区联系起来。

   1)、head:用于指向数据包的开始。

   2)、data:用于指向数据包载荷的开始。

   3)、tail:用于指向数据包载荷的结束。

   4)、end:用于指向数据包的结束。

   5)、len:数据包包含的数据量。


  3、sk_buff操作

  


 

 三)、网络设备接口

  1、NIC驱动程序使用标准接口与TCP/IP协议栈胡操作。net_device结构体定义了此通信接口,它甚至比sk_buff结构体大。


  2、NIC驱动程序初始化步骤

   1)、驱动程序用alloc_netdev()分配一个net)device结构体,不过更常见的是它为alloc_netdev()做合适的封装。

   2)、接下来,驱动程序在分配的net_device中填充多个成员,并用register_netdev(netdev)向网络层注册net_device。

   3)、驱动程序从EEPROM读取NIC的MAC(媒体介入控制)地址,如果还需要,还得配置WOL(网络唤醒)。

   4)、如果NIC需要卡上固件,驱动程序就用request_firmware()下载它。



 四)、激活

  1、net_device接口需要用到open()、close()和ioctl()传统方法,如果用ifconfig等工具激活它,内核就会打开一个接口:

        bash>ifconfig  eth0  up

        open()函数会设置接收/发送DMA描述符和一些其他数据结构。它也通过调用request_irq()注册NIC中断处理程序。net_device结构体将被作为devid参数传给

        request_irq(),这样中断处理程序可以直接访问相关的net_device。


  2、销毁一个活动的网络接口时,内核调用close(),它完成与调用open()相反的功能。



 五)、数据传输

  1、数据传输函数是net_device接口的关键组件。在传输路径上,驱动程序提供一个称为:hard_start_xmit函数,协议层在发送时调用它来向下传输数据包:

       hard->hard_start_xmit = &mycard_xmit_frame;


  2、至今,网络驱动程序都没有在net_device结构体中提供一个搜索接收数据的成员函数,它只是异步中断协议层,并向其告知数据包载荷。但这个老的接口已经被NAPI取

        代。NAPI是中断驱动的驱动程序所采用的“推”模式和轮询驱动程序协议所采用的“拉”模式的混合。



 六)、看门狗

  1、网络设备接口提供一个钩子,用于向操作状态返回无应答的NIC。如果协议层在预定的传输时间没有感觉到传输操作,它就假设NIC已经挂起,然后调用驱动程序提供的复

        位函数来重启卡。


  2、驱动程序通过netdev->watchdog_tomeo设置看门狗超时,然后通过net->tx_timeout注册复位函数的地址;

        net->tx_timeout = &mycard_timeout;

        netdev->watchdog_timeo = 8*HZ;



 七)、统计

  1、为了让用户能搜集网络统计数据,NIC驱动程序生成一个net_device_stats结构体,并提供了get_stats()函数来接收它。


  2、驱动程序做了如下工作:

   1)、从相关入口点更新不同类型的统计数据。

   2)、实现get_stats()方法来接收统计数据。

   3)、向高层提供接收方法。



 八)、配置

  1、NIC驱动程序需要支持用户空间工具,这些工具负责设置和提取参数。ethtool工具可以为以太网NIC配置参数。


  2、为了支持ethtool,底层的NIC驱动程序做了以下工作:

   1)、填充包含入口点的ethtool_ops结构体,定义在include/linux/ethtool.h中。

   2)、实现作为ethtool_ops成员的函数。

   3)、输出ethtool_ops的地址。


 九)、总线相关内容




二、与协议层对话

 一)、接收路径

  1、NIC驱动程序用NET_RX_SOFTIRQ转移了将收到数据包投递到协议层的工作,他是通过从接收中断处理程序中调用netif_rx()实现的。NAPI改进了这种传统的中断驱动的接

        受方式。NAPI的策略是当网络活动频繁时用轮询模式,而当流量变小时转回到中断模式。


  2、支持NAPI的驱动程序根据网络负载在中断模式和轮训模式间切换,过程如下:

   1)、在中断模式下,中断处理程序通过调度NET_RX_SOFTIRQ向协议层投递接收到的数据包,然后屏蔽NIC中断,接着通过向轮训列表增加设备来轮询模式。

   2)、驱动程序通过它的net_device结构体提供了一个poll方法。

   3)、在轮询模式下,驱动程序的poll()方法处理接收队列中的数据包。当队列变空时,驱动程序重新启用中断,并通过调用netif_rx_complete()切回到中断模式。



 二)、发送路径

  1、对于数据发送,协议层和NIC驱动程序间的互操作是直接的,协议栈是以sk_buff作为输出参数调用驱动程序的hart_start_xmit()方法,驱动程序用DMA方式将数据包数据取

        出送给NIC。


  2、驱动程序在完成预定数量数据包的传输后,设置NIC向处理器发出中断请求。只有当表示传输操作完成的传输完成中断出现时,驱动程序才能收回释放资源。



三)、流量控制

  1、驱动程序分别通过调用netif_start_queue()和netif_stop_queue()来告知它已经准备好或还不能接收协议数据。




三、缓冲区管理和并发控制

  1、一个高性能的NIC驱动程序是一个需要复杂数据结构管理的软件综合体。



四、设备实例:以太网NIC。

  1、代码清单15-1(一个以太网NIC驱动程序)。



五、ISA网络驱动程序

  


六、ATM

  1、ATM(异步传输模式)是一种高速的、面向连接的骨干网技术。ATM保证高的QoS(服务质量)和低延时,一次它处传输数据外还被用于传输音频和视频流。


  2、ATM协议简单总结:

  


  3、ATM上传输TCP/IP的方法有三种:

   1)、RFC1577中规定的CLIP(传统IP异步传输模式)。

   2)、在ATM网上模拟局域网,称为LANE(虚拟局域网)。

   3)、MPOA(ATM网承载多种协议)。


  4、MPLS(多协议标签交换)的协议正在逐步取代ATM。



七、网络吞吐量(略)

   

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值