网卡驱动模型可以分为三层,即PCI总线设备、网卡设备以及网卡设备的私有数据结构,PCI总线设备包含网卡设备,网卡设备又包含其私有数据结构。在DPDK中,首先注册设备驱动,然后查找当前系统有哪些PCI设备,并通过PCI_ID为PCI设备找到对应的驱动,最后调用驱动初始化设备。
网卡驱动注册
通过rte_eal_driver_register()函数,将不同类型的网卡驱动挂到全局dev_driver_list链表上
扫描PCI设备
通过rte_eal_pci_init()函数,查找当前系统中有哪些网卡,并将它们挂到全局链表pci_device_list上;
PCI驱动注册
通过rte_eal_dev_init()函数,遍历dev_driver_list链表,根据vendor和device匹配执行网卡驱动对应的init的回调函数,注册PCI驱动
网卡初始化
通过rte_eal_pci_probe()函数,遍历pci_device_list和pci_driver_list链表,根据PCI_ID,将pci_device与pci_driver绑定,并调用pci_driver的init回调函数rte_eth_dev_init(),初始化PCI设备;
PCI设备和PCI驱动匹配后,调用rte_eal_pci_map_device()函数为该PCI设备创建map resource;
在driver与device的match成功,并且做完PCI资源空间地址映射后,调用rte_eth_dev_init()初始化PCI设备网卡设备的操作函数集,包括设备ID、硬件操作函数集、在内存地址总线上映射的地址、MAC地址,以及注册中断使能接口;
配置收发包队列,配置收包、发包函数,以及offload特性等。