在Linux中为了简化对设备的管理,通常将所有的外围设备归为3类:字符设备、块设备和网络设备。为了将网络设备中的物理网络设备的多样性进行屏蔽,Linux对所有的网络物理设备抽象并定义了一个统一概念:接口。对于所有网络硬件的访问,都是通过接口进行的。接口实际上提供了一个对于所有类型网络硬件的一致化操作集合,用来处理对数据的发送和接收。数据结构structnet_device就是网络设备接口,它既包括纯软件网络设备接口,如环路等,又包括硬件网络设备接口,如以太网卡等。在内核启动或者驱动模块插入时,通过网络驱动程序向系统注册检测到的网络设备。在进行网络数据传输时,网络驱动程序需要负责通过标准的接口将数据发送到相应的网络层,或者向网络发送数据包。
网络接口定义在内核中的一个structdevice的数据结构中。每一个device的数据结构都是在驱动时创建的。structdevice结构图如图8-5所示。
图8-5 structdevice结构图(www.xing528.com)
这个数据结构是系统中的每一个设备的代表,它提供有多种设备方法,供操作系统或协议层调用。在这个数据结构中,主要定义的成员变量是init函数指针,这个函数指针初始化为设备驱动程序中提供的用来初始化device结构的过程,这个过程实际上就是用来检测和驱动网络设备的。在进行检测之前,每一个节点的init函数都指向对应的初始化函数。检测时,每个节点都分别调用init函数。如果成功,则返回并将该节点保留。
在这个结构中还定义了对硬件设备打开和关闭的函数指针(open和close)、硬件头的建立函数指针(hard_header)和硬件上的数据传输指针(hard_start_xmit)。当网络设备打开时,就可以通过这个网络设备开始传输数据了,传输出来的数据存放在sk_buff结构里面。hard_start_xmit函数指针是和某种具体的硬件相关的。通过dev_queue_xmit这个外部函数调用hard_start_xmit函数指针可完成网络数据的发送过程。
系统中所有的网络设备都是通过一个网络接口管理表dev_base统一进行管理的。在系统初始化完成后,系统检测到的所有网络设备都将自动保存在这张链表中。链表中的每一个字节都代表一个系统检测到的网络物理设备。当系统需要发送数据时,网络子系统根据系统路由表选择相应的网络接口进行数据传输;而当接收到数据包时,通过驱动程序登记的中断服务程序进行数据的接收。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。