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. 把设备放到网络设备链表中,糖葫芦串一样,通通串起来

1
list_netdevice(dev);

9. 好咯,搞定,告诉上层(协议),我(网络设备)来了

1
ret = call_netdevice_notifiers(NETDEV_REGISTER, dev);

10. 完成