第16章 Linux网络设备驱动

来源:互联网 发布:linux 命令的执行结果 编辑:程序博客网 时间:2024/06/16 09:44

本文摘自(偶有较小改动)《Linux 设备驱动开发详解》(宋宝华 编著;人民邮电出版社;),留作纪念。
——Living Park

16 Linux网络设备驱动

16.1 Linux网络设备驱动的结构

       Linux网络设备驱动程序从上到下可以划分为4层,依次为网络协议接口层、网络设备接口层、提供实际动能的设备驱动功能层以及网络设备与媒介层。

       在设计具体的网络设备驱动程序时,我们需要完成的主要工作是编写设备驱动功能层的相关函数以填充net_device数据结构的内容并将net_device注册入内核。

16.1.1 网络协议接口层

       网络协议接口层最主要的功能是给上层协议提供了透明的数据包发送和接收接口。当上层ARPIP协议需要发送数据包时,它将调用网络协议接口层的dev_queue_xmit()函数发送该数据,上层数据包的接收也通过向netif_rx()函数传递一个structsk_buff数据结构的指针来完成。

       sk_buff结构体非常重要,它的含义为“套接字缓冲区”,用于在Linux网络子系统中的各层之间传递数据,是Linux网络子系统数据传递的“中枢神经”。

1.     套接字缓冲区成员

(1) 各层协议头hnhmac 3个协议头对应于网络协议的不同层次,分别为传输层TCP/UDP协议头h、网络层协议头nh和链路层协议头mac

(2) 数据缓冲区指针headdatatailend

(3) 长度信息lendata_lentruesize

2. 套接字缓冲区操作

分配alloc_skb(),dev_alloc_skb();释放kfree_skb(),dev_kfree_skb(),dev_kfree_skb_irq(),dev_kfree_skb_any()

指针移动skb_put(),_ _skb_put(),skb_push(),_ _skb_push(),skb_pull(),skb_reserve()

16.1.2 网络设备接口层

       主要功能是为千变万化的网络设备定义了统一、抽象的数据结构net_device结构体,以不变应万变,实现多种硬件在软件层次上的统一。

设备操作:open(),stop()

16.1.3 设备驱动功能层

       net_device结构体的成员需要被设备驱动功能层的具体数值和函数赋予。

       由于网络数据包的接收可由中断引发,设备驱动功能层中另一个主体部分将是中断处理函数,它负责读取硬件上接收的数据包并传送给上层协议。

16.1.4 网络设备与媒介层

       直接对应于实际的硬件设备。

16.2网络设备驱动的注册与注销

       注册与注销使用register_netdev()unregister_netdev()函数。

       生成net_device结构体alloc_netdev(),alloc_etherdev();释放结构体 free_netdev()

16.3网络设备的初始化

       初始化完成如下工作。

l       进行硬件上的准备工作,检查网络设备是否存在,如果存在,则检测设备所使用的硬件资源。

l       进行软件接口上的准备工作,分配net_device结构体并对其数据和函数指针成员赋值。

l       获得设备的私有信息指针并初始化其各成员的值。

16.4网络设备的打开与释放

       打开函数完成工作。

l       使能设备使用的硬件资源,申请I/O区域、中断和DMA通道等。

l       调用内核提供的netif_start_queue(),激活设备发送队列。

关闭函数相反,调用函数netif_stop_queue()

16.5数据发送流程

       发送流程如下。

l       网络设备驱动程序从上层传递过来的sk_buff参数获得数据包的有效数据和长度,将有效数据放入临时缓冲区。

l       对于以太网,有过有效数据的长度小于以太网冲突检测所要求数据帧的最小长度ETH_ZLEN,则给临时缓冲区的末尾填充0

l       设置硬件的寄存器,驱使网络设备进行数据发送操作。

16.6数据接收流程

       网络设备接收数据的主要方法是由中断引发设备的中断处理函数,中断处理函数判断中断类型,如果为接收中断,则读取接收到的数据,分配sk_buff数据结构和数据缓冲区,将接收 的数据复制到数据缓冲区,并调用netif_rx()函数将sk_buff传递给上层协议。

16.7网络连接状态

       网络适配器硬件电路可以检测出链路上是否有载波,载波反映了网络的连接是否正常。网络设备驱动可以通过netif_carrier_on()netif_carrier_off()函数改变设备的连接状态,如果驱动检测到连接状态发生变化,也应该以netif_carrier_on()netif_carrier_off()函数显示地通知内核。

16.8参数设置和统计数据

16.9 CS8900网卡设备驱动实例

16.9.1 CS8900网卡硬件描述

       它提供ISA总线接口,内部集成了E2PROM控制器、802.3 MAC控制器、片内RAM10BASE-T收发滤波器,支持I/O和内存模式两种模式,可采用DMA方式与主机以16位或8位数据长度进行数据交换。

16.9.2 CS8900网卡驱动设计分析

       工程师主要需完成设备驱动功能层的设计。

16.9.3 CS8900网卡注册、初始化与注销

       模块加载函数用来注册经过cs89x0_probe()cs89x0_probe1()函数初始化过的net_device结构体,卸载函数完成相反功能。

16.9.4 CS8900网卡发送数据流程

16.9.5 CS8900网卡接收数据流程


原创粉丝点击