pci内存控制器是什么驱动_dpdk pmd驱动分析

本文介绍了dpdk_devbind.py如何进行PCI设备驱动的绑定与解绑,涉及sysfs文件系统和驱动层面的动作。接着探讨了igb_uio模块初始化、PCI设备驱动属性及其操作。文章还详细阐述了PMD驱动的分析,包括设备初始化、硬件抽象、PCI枚举等步骤,揭示了DPDK如何借助uio框架与内核交互实现用户态驱动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

c45a363b2d62ed992e9441c010c324b6.png

缘起dpdk_devbind.py

运行dpdk程序之前我们一般都会使用dpdk_devbind.py程序对指定的驱动与设备进行绑定与解绑(如下命令)。那么dpdk_devbind.py程序是如何实现驱动与设备的绑定与解绑的?底层的原理是什么?

dpdk_devbind.py –bind igb_uio eth0

dpdk_devbind.py程序主要做了以下几件事(转为shell命令):

  1. 为igb_uio驱动添加设备id
echo –n “8086 10f5” > /sys/bus/pci/drivers/igb_uio/new_id

8086为设备厂商号,10f5为设备号。

2. 为设备指定驱动

echo–n“igb_uio”> /sys/bus/pci/devices/0000:02:05.0/driver_override

3. 执行绑定操作,触发驱动probe。

echo –n “0000:02:05.0”>/sys/bus/pci/drivers/igb_uio/bind

4. 执行解绑操作

echo -n“0000:02:05.0”>/sys/bus/pci/drivers/e1000/unbind

“0000:02:05.0”为设备标识(域:总线编号:设备编号:功能号).

1与2只执行一个即可,1是配置驱动,让其支持新的设备。2是配置设备,让其选择驱动。

从以上可知设备驱动的解绑与绑定涉及几个方面:

  1. 驱动:igb_uio, uio, e1000等
  2. sysfs,用于用户态与内核态进行通讯。 (new_id, driver_override, bind, unbind)
  3. 传递的消息:设备ID、设备标识

驱动层动作

sysfs文件系统是一种内存文件系统,它提供了一种方法用于导出内核的数据结构、属性以及两者之间的联系到用户空间。用户空间可以通过修改sysfs中的文件来修改设备的属性值。上诉new_id、driver_override、bind、unbind文件对应igb_uio驱动的各属性值。

接下来我们来看一下dpdk_devbind.py通过 sysfs向驱动发送消息后,驱动层做了什么。

igb_uio模块初始化

如上图所示new_id、driver_override、bind、unbind在橙色框处加入sysfs文件系统。

1a4803fc92350c093efdf12a1cd72677.png
igb_uio模块初始化

驱动注册成功后,除了上诉sysfs文件外,其实已经建立起一整套为用户态提供服务的接口。

PCI设备驱动属性定义

452b4f02503bcebcd260c51c4b108863.png

PCI设备驱动属性的操作

如上所以new_id 对应的驱动处理函数为store_new_id, bind对应的处理函数为driver_bind,unbind对应的处理函数为driver_unbind。

### DPDK PMD 收发机制 #### 接收中断配置差异 在VFIO模式下,允许每个队列接收(RX)中断事件,并且这种情况下支持多个MSI-X向量。然而,在UIO模式中,RX中断与其他中断原因共享同一个向量。当同时启用了RX中断和链路状态变化(LSC)中断(即`intr_conf.lsc == 1 && intr_conf.rxq == 1`),只有前者能够正常工作[^3]。 #### 发送与接收路径中的关键组件 对于数据包的发送和接收操作,DPDK提供了高效的轮询模式驱动(PMD),用于直接访问网络接口卡(NICs)硬件资源而无需操作系统内核介入。PMD通过内存映射的方式管理NIC寄存器以及描述符环(buffer descriptors rings),从而实现零拷贝的数据传输性能优化。 - **接收过程**:当物理网卡接收到新到达的数据帧时,会将其存储到预先分配好的缓冲区中;随后更新对应的描述符并触发CPU上的软中断(如果已启用的话)通知上层应用读取这些数据。 - **发送过程**:应用程序准备待发送的数据报文,并填充至指定位置的DMA引擎可触及的记忆区域里;接着修改相应描述符的状态位告知设备可以开始传送该批负载了。 为了进一步提升效率,DPDK还集成了多种加速技术如Hash表(`librte_hash`)和最长前缀匹配查找(`librte_lpm`)来辅助完成复杂的路由决策任务,确保快速准确地定位目标地址信息[^1]。 ```c // 示例代码展示如何初始化一个简单的以太网端口用于收发处理 #include <rte_ethdev.h> static void init_port(uint8_t port_id){ struct rte_eth_rxconf rxq_conf; struct rte_eth_txconf txq_conf; // 配置接收队列参数... memset(&rxq_conf, 0, sizeof(rxq_conf)); // 配置发送队列参数... memset(&txq_conf, 0, sizeof(txq_conf)); // 启动端口 rte_eth_dev_start(port_id); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值