一、DPDK代码——before main

转载请注明出处,谢谢。

一、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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值