转载请注明出处,谢谢。
一、Before main:
在main函数运行之前,通过gcc的构造函数,完成总线到链表中的注册,且完成各种pmd驱动到某类总线的注册,完成几类全局变量的数据关系。
gcc的构造函数
gcc的constructor函数属性,可以让该函数在main函数之前运行,且可以指定函数运行的优先级,优先级>100,且值越小优先级越高。
ether dev初始化用到的是RTE_PRIORITY_BUS这个level的优先级。
#define RTE_INIT_PRIO(func, prio) \
static void __attribute__((constructor(RTE_PRIO(prio)), used)) func(void)
#define RTE_PRIORITY_LOG 101
#define RTE_PRIORITY_BUS 110
#define RTE_PRIORITY_CLASS 120
#define RTE_PRIORITY_LAST 65535
rte_bus_register
以PCI总线为例,把pci总线的全局变量rte_pci_bus,加入总线链表全局变量rte_bus_list的一个过程。
#define RTE_REGISTER_BUS(nm, bus);
RTE_INIT_PRIO(businitfn_ ##nm, BUS)
{
(bus).name = RTE_STR(nm);
rte_bus_register(&bus);
}
struct rte_bus_list 链表结构体的定义
dpdk中对bus总线链表结构体的定义:TAILQ_HEAD(rte_bus_list, rte_bus); 其中rte_bus_list为新定义的链表结构体的名字,rte_bus为链表中元素的类型。
运行rte_bus_register(&rte_pci_bus.bus); 则是把rte_pci_bus加入到链表全局变量rte_bus_list中。
还有其他如dpaa/vmbus/ifpga等总线也相继挂到rte_bus_list链表上。(代码中主要以rte_pci_bus bus为主)
rte_bus 定义(还有其他rte_vdev_bus/rte_vmbus_bus等):
struct rte_pci_bus rte_pci_bus = {
.bus = {
.scan = rte_pci_scan,
.probe = rte_pci_probe,
.find_device = pci_find_device,
.plug = pci_plug,
.unplug = pci_unplug,
.parse = pci_parse,
.get_iommu_class = rte_pci_get_iommu_class,
.dev_iterate = rte_pci_dev_iterate,
.hot_unplug_handler = pci_hot_unplug_handler,
.sigbus_handler = pci_sigbus_handler,
},
.device_list = TAILQ_HEAD_INITIALIZER(rte_pci_bus.device_list),
.driver_list = TAILQ_HEAD_INITIALIZER(rte_pci_bus.driver_list),
};
PMD driver注册到rte_pci_bus的driver list中
目标是要在rte_pci_bus.driver_list 链表中加入PMD driver。
rte_pci_register(&rte_em_pmd)
把pci pmd的全局变量i40e_pmd挂到另一个全局变量rte_pci_bus.driver_list上。
EAL_REGISTER_TAILQ注册并插入尾部队列,然后在init时候进行初始化null
rte_pci_register
RTE_PMD_REGISTER_PCI-> rte_pci_register 注册驱动,将驱动挂载到bus.driver_list
RTE_PMD_REGISTER_PCI_TABLE 配置需要map设备的vendor_id
RTE_PMD_REGISTER_KMOD_DEP 注册该驱动的依赖 一般为igb_uio | vfio
device何时添加
在eal_init中会调用rte_bus_scan,该函数会调用对应bus的rte_pci_scan然后读取该bus挂载的device,接着解析该device绑定的内核驱动(freebsd不解析,同时黑白名单在rte_bus_probe里面才进行处理),如果是vfio| igb_uio | uio_generic就将设备加入bus下的device_list。
945

被折叠的 条评论
为什么被折叠?



