loopback NIC 驱动剖析Series---(1)
时间:2010-09-06 来源:mtloveft
而loopback设备又是虚拟设备,不涉及到中断和DMA等,所以
还是比较简单的。先从loopback驱动下手的另外一个原因是
它是系统第一个注册的网络驱动程序。
普通的网卡驱动都是以模块化注册到系统的,但loopback驱动
是和kernel一体的,直接在linux启动时被调用。 驱动被调用的过程

也就是上图的other_init代替了这些初始化过程。start_kernel在执行到最后就会启动init kernel thread。
它会完成剩下的初始化程序。其中在do_initcalls里将会按照顺序执行初始化程序。 其中系统注册过以下方法 subsys_initcall(net_dev_init) //net/core/dev.c 当执行net_dev_init时,就会调用loopback NIC的驱动程序。
static int __init net_dev_init(void) if (register_pernet_device(&loopback_net_ops)) goto out; ... ... } |
int register_pernet_device(struct pernet_operations *ops) |
static int register_pernet_operations(struct list_head *list, struct pernet_operations *ops) |
看看loopback 注册struct pernet_operations的定义
/* Registered in net/core/dev.c */ |
loopback_net_ops没有注册id,所以ops->id为NULL。直接执行 __register_pernet_operations
static int __register_pernet_operations(struct list_head *list, struct pernet_operations *ops) |
继续跟进ops_init
static int ops_init(const struct pernet_operations *ops, struct net *net) |
ops->id根本就没被设置,而.init = loopback_net_init,所以 loopback_net_init将被调用,
而loopback_net_init就是loopback NIC的驱动程序,
内容如下
/* Setup and register the loopback device. */ |
alloc_netdev主要分配net_device结构,每个网络设备对象是标准的结构,但是不同的网络驱动程序可能都要维护不同的私有信息,所以在分配net_device结构的同时可以多分配出sizeof_priv大小的结构来。比如应用程序可能会经常查询NIC NIC adress,虽然驱动程序可以通过访问网卡上的存储空间来获
取网卡地址,但是驱动程序可不希望每次都通过慢速的IO 访问来获取这些信息,通常驱动程序会为这些信息维护内存中的数据
结构中,这些信息都可以放在私有信息中。