概括而言,编写Linux网络驱动其实只要完成两件事即可,一是分配并初始化网络设备,二是注册网络设备。
1、分配并初始化网络设备
动态分配网络设备(从C语言角度来看,其实就是定义了一个struct net_device结构体变量,并对这个结构体变量的某些成员进行了初始化而已)及其私有数据的大致过程如下图(以以太网设备为例):

下面将结合linux-2.6.38.8中的代码详细分析网络设备的分配和初始化过程。
以前各类网络设备的分配函数(如以太网设备的alloc_etherdev)都只是alloc_netdev函数的封装而已,但对于linux-2.6.38.8而言已经不是这样了。
alloc_netdev_mqs函数的五个参数分别为私有数据大小、设备名称、默认初始化函数、发送队列数目和接收队列数目。
以太网设备的名称设为eth%d,默认初始化函数设为ether_setup,发送和接收队列数目都设为1。
函数alloc_netdev_mqs定义在linux-2.6.38.8/net/core/dev.c文件中,大概会完成以下各种操作:
(1)、为struct net_device和私有数据分配内存空间
对齐操作相关宏:
(2)、动态分配per-CPU变量
(3)、初始化硬件地址链表dev->dev_addrs,并把首元素赋给dev->dev_addr
(4)、初始化组播和单播地址链表
(5)、设置网络命名空间
(6)、设置GSO最大值
(7)、初始化各种链表
(8)、设置priv_flags值
(9)、执行默认初始化函数(以太网设备默认为ether_setup)
(10)、初始化数据包发送队列
(11)、初始化数据包接收队列
(12)、设置网络设备名称