<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
2.1 网络驱动程序的结构
Linux网络驱动程序的体系结构如图1所示。
可以划分为四层:
Linux网络驱动程序的体系结构如图1所示。
可以划分为四层:
(1)协议接口层
(2)网络设备接口层
(3)设备驱动功能层
(4)及网络设备和网络媒介层。
(2)网络设备接口层
(3)设备驱动功能层
(4)及网络设备和网络媒介层。
网络驱动程序重点:完成设备驱动功能层
在Linux中,所有网络设备都抽象为一个接口(interface)。这个接口提供了对所有网络设备的操作集合,由数据结构 struct net_device表示。
数据结构net_device中有很多供系统访问和协议层调用的设备方法,包括供设备初始化和往系统注册用的init函数、打开和关闭网络设备的open和stop函数、处理数据包发送的函数hard_ start_xmit,以及中断处理函数等。有关net_device数据结构(在内核中也就是net_device)的详细内容,请参看/linux/include/linux/netdevice.h
2.2
网络驱动实现模式
实现Linux网络设备驱动功能主要有两种形式:
(1)通过内核来进行加载,当内核启动的时候,就开始加载网络设备驱动程序,内核启动完成之后,网络驱动功能也随即实现了;
(2)再就是通过模块加载的形式。
比较两者,第二种形式更加灵活。
实现Linux网络设备驱动功能主要有两种形式:
(1)通过内核来进行加载,当内核启动的时候,就开始加载网络设备驱动程序,内核启动完成之后,网络驱动功能也随即实现了;
(2)再就是通过模块加载的形式。
比较两者,第二种形式更加灵活。
在此着重对模块加载形式进行讨论。
(1)insmod 来把网络设备驱动程序插入到内核之中。
(2) insmod将调用init_module()函数
(3) 对dev->init 函数指针赋值 ,
(4)register_netdev()函数注册该网络设备。如果成功,网络设备初始化,
将net_device 数据结构插入到dev_base链表的末尾。
(5)模块卸载 rmmod
(1)insmod 来把网络设备驱动程序插入到内核之中。
(2) insmod将调用init_module()函数
(3) 对dev->init 函数指针赋值 ,
(4)register_netdev()函数注册该网络设备。如果成功,网络设备初始化,
将net_device 数据结构插入到dev_base链表的末尾。
(5)模块卸载 rmmod
具体实现过程见图2所示。
2.3 网络驱动程序的基本方法
2.3.1
初始化