Linux 代码分析 9步了解Linux内核网卡驱动 基于e1000
Linux 代码分析 9步了解Linux内核网卡驱动, 基于e1000
e1000 driver 看似上万行的代码,其实来个抽丝剥茧,基本9步就能看清,让我们来看看吧
1. 模块加载
1
| module_init(e1000_init_module);
|
2. 调用初始化函数
1
| static int __init e1000_init_module(void)
|
3. 注册网卡设备,因为网卡也是属于PCI(pcie)设备, 所以先使用通用的PCI 标准注册函把PCI 部分搞定。到此,初步准备完毕。真正干活的在下面。
1
| ret = pci_register_driver(&e1000_driver);
|
4. “e1000_driver” 输入参数最关键的就是“e1000_probe”了,脏活累活基本都它干了。
1 2 3
| static struct pci_driver e1000_driver = { .probe = e1000_probe, };
|
5. 干活的伙计来了。
1
| static int e1000_probe(struct pci_dev *pdev, conststruct pci_device_id *ent)
|
5.1 首先申请需要的ioport
1
| need_ioport= e1000_is_need_ioport(pdev);
|
5.2 然后再来把需要的regions申请一下。
1
| err =pci_request_selected_regions(pdev, bars, e1000_driver_name);
|
5.3 申请一个netdev 结构
1
| netdev =alloc_etherdev(sizeof(struct e1000_adapter));
|
5.3.1 申请 bar, watchdogtimer,名字 等等;其实就是把这个结构体初始化好。
1 2 3 4 5
| hw->hw_addr= pci_ioremap_bar(pdev, BAR_0);
netdev->watchdog_timeo= 5 * HZ;
strncpy(netdev->name,pci_name(pdev), sizeof(netdev->name) - 1);
|
6. 调用这个东东来将设备注册。
1
| err = register_netdevice(dev);
|
7. 搞定kobject,比如我们就可以在proc 之类virtual文件系统看到咯。
1
| ret = netdev_register_kobject(dev);
|
8. 把设备放到网络设备链表中,糖葫芦串一样,通通串起来
9. 好咯,搞定,告诉上层(协议),我(网络设备)来了
1
| ret = call_netdevice_notifiers(NETDEV_REGISTER, dev);
|
10. 完成