网络设备的初始化主要由结构体net_device中的init函数指针所指向的初始化函数完成。当内核启动或加载网络驱动模块时,就会调用该函数。在初始化函数中通过检测物理设备的硬件特征判断网络物理设备是否存在,然后决定是否启动这个驱动程序。接下来对设备进行资源分配,最后对结构体net_device相应的成员变化量初始化,使得一个网络设备可以被系统使用。结构net_device存储网络接口的重要信息,是网络驱动程序的核心,它是系统中网络设备的代表,提供了多种设备方法,供操作系统和协议层调用。
网络设备注册和注销的函数为:
数据包的发送和接收是实现Linux网络驱动程序中两个最关键的过程。对这两个过程处理得好与坏会直接影响到整个网络的运行质量。当内核需要发送一个数据包时,它调用hard_start_transmit方法将数据放到一个输出队列。指向sk_buff的指针通常被称作skb。传递给hard_start_xmit的插座缓冲区含有物理包,它具有传输层的包头。接口不需要修改被发送的数据。
1.数据包的发送
网络设备发送过程比较简单,其数据发送是按以下步骤进行的。
1)它调用dev->hard_start_xmit方法,将套接字缓冲区发送到硬件设备。它具有传输层的头,接口不需要修改被发送的数据。skb->data指向被发送的包,该函数把套接字缓冲包链入网络设备结构管理的发送队列,随后唤醒网络设备,准备把该队列中的数据包发送到网络上。
2)判断从协议层传过来的数据包长度是否合法以及网络设备的状态是否可用。如果一切正常,则继续执行,否则返回错误码。
3)通过对控制寄存器的操作来执行设备接口发送数据包的程序代码。
4)当发送结束时,返回。(www.xing528.com)
2.数据包的接收
从网络中接收数据比发送数据要复杂,因为必须要分配一个sk_buff,并从一个中断处理程序中将其递交给高层。接收包最好的方法是通过中断,除非接口是纯软件的或者绕回接口。
在Linux系统中,网络设备接口以中断处理程序的方式控制。实际上,网络设备驱动程序的接收函数就是网络设备驱动程序的中断处理函数。网络设备数据包的接收比发送要复杂。数据帧的接收过程如下:
1)在硬件收到一个数据包后,网络设备的接收函数被调用,它通过一些底层的操作把数据帧从网络设备接收缓冲区中读入内存中。
2)调用netif函数。netif_rx因此收到一个指向数据的指针和包的长度。该函数的唯一职责就是将包和一些额外信息发送到网络代码的高层。
3)mark_bh被调用。它的功能是进行标记操作,为内核调用net_bh函数(中断处理函数的下半部例程)做准备。
4)调用net_bh进行中断处理程序的下半部处理。对数据包进行实际的处理,最后将接收到的数据包链入到backlog接收队列中。以后的工作由网络层代码进行处理。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。