网口驱动架构如上图,很清晰。一直怀疑为什么,在dev目录下找不到网口节点。现在明白了,设备节点一般是给用户层访问的。而根据上图,可得知,网口驱动主要是被网络协议栈调用,而用户层不会直接操作网口驱动,而是一层层的协议栈。
不同的网络控制器的驱动都是大致相同的,像dm9000的,
static struct platform_driver dm9000_driver = {
.driver = {
.name = "dm9000",
.owner = THIS_MODULE,
.pm = &dm9000_drv_pm_ops,
},
.probe = dm9000_probe,
.remove = __devexit_p(dm9000_drv_remove),
};
static struct platform_device dm9000x_device = {
.name = "dm9000",
.id = 0,
.num_resources = ARRAY_SIZE(dm9000_resources),
.resource = dm9000_resources,
.dev = {
.platform_data = &dm9000_setup,
}
};
dm9000驱动比较标准,通过平台设备来注册。先register device和driver。然后匹配后调用driver里面的probe,platform_driver等等之类的总线driver都是类似的,里面的probe最重要,该函数注册真正的设备驱动。probe会生成一个net_device,然后各种初始化,最后register。
一个net_device就是代表网卡了,通过它可以控制网口。
有些网卡驱动写的不标准,没有什么平台设备,只是胡乱的在内核启动时,调用一个XX_init函数,注册net_device结构,当然效果都是一样的了。