DPDK官方文档翻译:Linux Drivers

news/2025/2/9 3:24:39/

参考:http://doc.dpdk.org/guides/linux_gsg/linux_drivers.html#linux-gsg-binding-kernel


不同的 PMD 可能需要不同的内核驱动程序才能正常工作。根据所使用的 PMD,应加载相应的内核驱动程序,并且网络端口应绑定到该驱动程序。

1、绑定和取消绑定内核模块的网络端口

注意:使用分叉驱动程序的 PMD 不应与其内核驱动程序解除绑定。本部分适用于使用 UIO 或 VFIO 驱动程序的 PMD。有关更多详细信息,请参阅分叉驱动程序部分。

注意:建议在所有情况下将 vfio-pci 用作 DPDK 绑定端口的内核模块。如果 IOMMU 不可用,则可以在无 IOMMU 模式下使用 vfio-pci。如果由于某种原因,vfio 不可用,则可以使用基于 UIO 的模块、igb_uio和uio_pci_generic。有关详细信息,请参阅 UIO 部分。

大多数设备要求 DPDK 使用的硬件与其使用的内核驱动程序解除绑定,而是在应用程序运行之绑定到 vfio-pci 内核模块。对于此类 PMD,Linux 控制下的任何网络端口或其他硬件都将被忽略,并且应用程序无法使用*。

要将端口绑定到 vfio-pci 模块以供 DPDK 使用,或将端口返回到 Linux 控件,在 usertools 子目录中提供了一个名为 dpdk-devbind.py实用程序脚本。此实用程序可用于提供系统上网络端口当前状态的视图,以及从不同的内核模块(包括 VFIO 和 UIO 模块)绑定取消绑定这些端口。下面是如何使用该脚本的一些示例。脚本及其参数的完整描述可以通过使用 --help 或 --usage 选项调用脚本来获取。请注意,在运行 dpdk-devbind.py 脚本之前,应将要使用的 UIO 或 VFIO 内核模块加载到内核中

注意:由于 VFIO 的工作方式,哪些设备可以与 VFIO 一起使用存在一定的限制。主要归结为IOMMU小组的工作方式。任何虚拟功能设备通常都可以单独与 VFIO 一起使用,但物理设备可能需要绑定到 VFIO 的所有端口,或者其中一些端口绑定到 VFIO,而其他端口根本不绑定到任何东西。

注意:如果您的设备位于 PCI 到 PCI 网桥后面,则该网桥将成为设备所在的 IOMMU 组的一部分。因此,桥接驱动程序还应与网桥 PCI 设备解除绑定,以便 VFIO 与网桥后面的设备配合使用。

注意:虽然任何用户都可以运行 dpdk-devbind.py 脚本来查看网络端口的状态,但绑定取消绑定网络端口需要 root 权限

要查看系统上所有网络端口的状态:

./usertools/dpdk-devbind.py --statusNetwork devices using DPDK-compatible driver
============================================
0000:82:00.0 '82599EB 10-GbE NIC' drv=vfio-pci unused=ixgbe
0000:82:00.1 '82599EB 10-GbE NIC' drv=vfio-pci unused=ixgbeNetwork devices using kernel driver
===================================
0000:04:00.0 'I350 1-GbE NIC' if=em0  drv=igb unused=vfio-pci *Active*
0000:04:00.1 'I350 1-GbE NIC' if=eth1 drv=igb unused=vfio-pci
0000:04:00.2 'I350 1-GbE NIC' if=eth2 drv=igb unused=vfio-pci
0000:04:00.3 'I350 1-GbE NIC' if=eth3 drv=igb unused=vfio-pciOther network devices
=====================
<none>

要将设备 eth1,‘‘04:00.1’’ 绑定到 vfio-pci 驱动程序:

./usertools/dpdk-devbind.py --bind=vfio-pci 04:00.1

或者:

./usertools/dpdk-devbind.py --bind=vfio-pci eth1

指定设备 ID 时,通配符可用于地址的最后一部分。要将设备 82:00.0 和 82:00.1 恢复到其原始内核绑定,请执行以下操作:

./usertools/dpdk-devbind.py --bind=ixgbe 82:00.*

2、VFIO

VFIO 是一个强大而安全的驱动程序,依赖于 IOMMU 保护。要使用 VFIO,必须加载 vfio-pci 模块:

sudo modprobe vfio-pci

默认情况下,VFIO 内核通常存在于所有发行版中,但是请查阅您的发行版文档以确保情况如此。

要使用完整的 VFIO 功能,内核和 BIOS 都必须支持并配置为使用 IO 虚拟化(如英特尔® VT-d)。

注意:在大多数情况下,指定“iommu=on”作为内核参数应该足以将Linux内核配置为使用IOMMU。

为了在以非特权用户身份运行 DPDK 应用程序时正确操作 VFIO,还应设置正确的权限。有关详细信息,请参阅在没有 root 权限的情况下运行 DPDK 应用程序:http://doc.dpdk.org/guides/linux_gsg/enable_func.html#running-without-root-privileges

1、VFIO 无 IOMMU 模式

如果系统上没有可用的 IOMMU,仍然可以使用 VFIO,但必须使用附加模块参数加载它:

modprobe vfio enable_unsafe_noiommu_mode=1

或者,也可以在已经加载的内核模块中启用此选项:

echo 1 > /sys/module/vfio/parameters/enable_unsafe_noiommu_mode

之后,VFIO 可以像往常一样与硬件设备一起使用。

注意:在使用 enable_unsafe_noiommu_mode=1 参数再次探测模块之前,可能需要卸载所有与 VFIO 相关的模块。

警告:由于无 IOMMU 模式放弃了 IOMMU 保护,因此它本质上是不安全的。也就是说,在IOMMU不可用的情况下,它确实使用户可以保持VFIO具有的设备访问和编程程度。

2、VFIO 内存映射限制

对于外部存储器或大页的DMA映射,使用VFIO接口。VFIO 不支持对曾经映射的内存进行部分取消映射。因此,DPDK 的内存以巨大的页面粒度或系统页面粒度映射。DMA 映射的数量受内核的限制,具有用户锁定的进程内存限制 (rlimit) 用于系统/大页面内存。在内核 5.1 中添加了另一个适用于外部内存和系统内存的每个容器的总限制,该限制由 VFIO 模块参数 dma_entry_limit 定义,默认值为 64K。当应用程序超出 DMA 条目时,需要调整这些限制以增加允许的限制。

3、使用 vfio-pci 创建虚拟功能

从 Linux 5.7 版本开始,vfio-pci 模块支持创建虚拟功能。PF绑定到vfio-pci模块后,用户可以使用sysfs接口创建VF,这些VF将自动绑定到vfio-pci模块。

当 PF 绑定到 vfio-pci 时,默认情况下它将具有随机生成的 VF 令牌。出于安全原因,此令牌仅写入,因此用户无法直接从内核读取它。若要访问 VF,用户需要创建一个新令牌,并使用它来初始化 VF 和 PF 设备。令牌采用 UUID 格式,因此任何 UUID 生成工具都可用于创建新令牌。

此 VF 令牌可以使用 EAL 参数 --vfio-vf-token 传递给 DPDK。令牌将用于应用程序中的所有 PF 和 VF 端口。

1、通过 uuid 命令生成 VF 令牌

14d63f20-8445-11ea-8900-1f9ce7d5650d

2、加载具有enable_sriov参数集的 vfio-pci 模块

sudo modprobe vfio-pci enable_sriov=1

或者,如果模块已加载或内置,则通过 sysfs 传递 enable_sriov 参数:

echo 1 | sudo tee /sys/module/vfio_pci/parameters/enable_sriov

3、将 PCI 设备绑定到 vfio-pci 驱动程序

./usertools/dpdk-devbind.py -b vfio-pci 0000:86:00.0

4、创建所需数量的 VF 设备

echo 2 > /sys/bus/pci/devices/0000:86:00.0/sriov_numvfs

5、启动将管理 PF 设备的 DPDK 应用程序

<build_dir>/app/dpdk-testpmd -l 22-25 -n 4 -a 86:00.0 \
--vfio-vf-token=14d63f20-8445-11ea-8900-1f9ce7d5650d --file-prefix=pf -- -i

6、启动将管理 VF 设备的 DPDK 应用程序

<build_dir>/app/dpdk-testpmd -l 26-29 -n 4 -a 86:02.0 \
--vfio-vf-token=14d63f20-8445-11ea-8900-1f9ce7d5650d --file-prefix=vf0 -- -i

注意:低于版本 5.7 的 Linux 版本不支持在 VFIO 框架内创建虚拟功能。

4、VFIO 疑难解答

在某些情况下,使用 dpdk-devbind.py 脚本将设备绑定到 VFIO 驱动程序可能会失败。首先要检查的是内核消息:

dmesg | tail
...
[ 1297.875090] vfio-pci: probe of 0000:31:00.0 failed with error -22
...

在大多数情况下,错误 -22 表示无法启用 VFIO 子系统,因为没有 IOMMU 支持。

要检查内核是否已使用正确的参数引导,可以检查内核命令行:

cat /proc/cmdline

有关如何为系统正确配置内核参数的信息,请参阅前面的部分。

如果内核配置正确,还必须确保 BIOS 配置具有虚拟化功能(例如英特尔® VT-d)。没有标准方法可以检查平台是否配置正确,因此请查看您的平台文档以查看它是否具有此类功能以及如何启用它们。

在某些发行版中,默认内核配置使得在编译时完全禁用无 IOMMU 模式。这可以在系统的引导配置中进行检查:

cat /boot/config-$(uname -r) | grep NOIOMMU
# CONFIG_VFIO_NOIOMMU is not set

如果未在内核配置中启用CONFIG_VFIO_NOIOMMU,VFIO 驱动程序将不支持无 IOMMU 模式,并且必须使用其他替代方法(例如 UIO 驱动程序)。

3、VFIO平台

VFIO 平台是一个内核驱动程序,它通过添加对驻留在 IOMMU 后面的平台设备的支持来扩展 VFIO 的功能。Linux 通常在启动阶段直接从设备树中了解平台设备,这与内置必要信息的 PCI 设备不同。

要使用 VFIO 平台,必须先加载 vfio 平台模块:

sudo modprobe vfio-platform

注意:默认情况下,vfio 平台假定平台设备具有专用的重置驱动程序。如果缺少此类驱动程序或设备不需要驱动程序,则可以通过设置 reset_required=0 模块参数来关闭此选项。

之后平台设备需要绑定到vfio平台。这是需要两个步骤的标准程序。第一个driver_override,在平台设备目录中可用,需要设置为 vfio-platform:

sudo echo vfio-platform > /sys/bus/platform/devices/DEV/driver_override

下一个 DEV 设备必须绑定到 vfio 平台驱动程序:

sudo echo DEV > /sys/bus/platform/drivers/vfio-platform/bind

在应用程序启动时,DPDK 平台总线驱动程序扫描 /sys/bus/platform/devices,搜索具有指向 vfio 平台驱动程序的驱动程序符号链接的设备。最后,扫描的设备与可用的 PMD 进行匹配。如果 PMD 名称或 PMD 别名与内核驱动程序名称匹配,或者 PMD 名称与平台设备名称匹配,则匹配成功。

VFIO 平台依赖于 ARM/ARM64,通常在这些系统上运行的发行版上启用。请查阅您的发行版文档以确保情况确实如此。

4、Bifurcated 驱动

使用 Bifurcated 驱动程序的 PMD 与设备内核驱动程序共存。在这种型号上,NIC由内核控制,而数据路径由PMD直接在设备顶部执行。

这种模型具有以下优点:
1、它是安全而健壮的,因为内存管理和隔离是由内核完成的。
2、它使用户能够使用传统的Linux工具,如ethtool或ifconfig,同时在同一网络端口上运行DPDK应用程序。
3、它使 DPDK 应用程序能够仅过滤部分流量,而其余流量将由内核驱动程序定向和处理。流分叉由 NIC 硬件执行。例如,使用流隔离模式允许严格选择DPDK中接收的内容。

有关分叉驱动程序的更多信息,请参阅 NVIDIA 分叉 PMD 演示文稿:https://www.dpdk.org/wp-content/uploads/sites/35/2016/10/Day02-Session04-RonyEfraim-Userspace2016.pdf。

5、UIO

警告:由于此方法缺乏 IOMMU 保护,因此使用 UIO 驱动程序本质上是不安全的,只能由 root 用户完成。

在无法使用 VFIO 的情况下,可以使用替代驱动程序。在许多情况下,Linux 内核中包含的标准uio_pci_generic模块可以用作 VFIO 的替代品。可以使用以下命令加载此模块:

sudo modprobe uio_pci_generic

注意:uio_pci_generic模块不支持创建虚拟功能。

作为uio_pci_generic的替代方案,可以在存储库dpdk-kmods中找到igb_uio模块。它可以按如下所示加载:

sudo modprobe uio
sudo insmod igb_uio.ko

注意:对于某些不支持传统中断的设备,例如虚拟功能(VF)设备,可能需要igb_uio模块来代替uio_pci_generic。

注意:如果启用了 UEFI 安全引导,Linux 内核可能会禁止在系统上使用 UIO。因此,DPDK 使用的设备应绑定到 vfio-pci 内核模块,而不是任何基于 UIO 的模块。有关更多详细信息,请参阅下面的绑定和取消绑定到内核模块的网络端口。

注意:如果用于 DPDK 的设备绑定到基于 UIO 的内核模块,请确保 IOMMU 已禁用或处于直通模式。可以在x86_64系统上的 GRUB 命令行中添加 intel_iommu=off 或 amd_iommu=off 或 intel_iommu=on iommu=pt,或者在 aarch64 系统上添加 iommu.passthrough=1。


http://www.ppmy.cn/news/34445.html

相关文章

SpringBoot整合Flink(施耐德PLC物联网信息采集)

SpringBoot整合Flink&#xff08;施耐德PLC物联网信息采集&#xff09;Linux环境安装kafka前情&#xff1a;施耐德PLC设备&#xff08;TM200C16R&#xff09;设置好信息采集程序&#xff0c;连接局域网&#xff0c;SpringBoot订阅MQTT主题&#xff0c;消息转至kafka&#xff0c…

C++ 八股文(简单面试题)

1.左值 可寻址变量&#xff0c;持久性&#xff1b; 2.右值 没有变量名&#xff0c;不可寻址&#xff0c;短暂性&#xff1b; 3.指针 指向的内存地址&#xff0c;指针变量存储的就是指向的对象的首地址 4.引用 为一个变量起别名&#xff0c;定义引用的时候一定要初始化&a…

基于深度学习方法与张量方法的图像去噪相关研究

目录 1 研究现状 1.1 基于张量分解的高光谱图像去噪 1.2 基于深度学习的图像去噪算法 1.3 基于深度学习的高光谱去噪 1.4 小结 2 基于深度学习的图像去噪算法 2.1 深度神经网络基本知识 2.2 基于深度学习的图像去噪网络 2.3 稀疏编码 2.3.1 传统稀疏编码 2.3.2 群稀…

C++习题——数组中的逆序对

剑指 Offer . 数组中的逆序对 2023/3/22美团面试 题目 在数组中的两个数字&#xff0c;如果前面一个数字大于后面的数字&#xff0c;则这两个数字组成一个逆序对。输入一个数组&#xff0c;求出这个数组中的逆序对的总数。 示例2&#xff1a; 输入&#xff1a;[1&#xff0…

【思维模型】五分钟了解<复利思维>,为何学习复利思维?什么是复利思维?如何应用复利思维?

【思维模型】五分钟了解&#xff1c;复利思维&#xff1e;&#xff0c;为何学习复利思维&#xff1f;什么是复利思维&#xff1f;如何应用复利思维&#xff1f;1. 为何学习复利思维&#xff1f;2. 什么是复利思维&#xff1f;3. 如何应用复利思维&#xff1f;4. 小结参考&#…

2023面试题汇总二

一、CSS面试题 1. 清除浮动的方式有哪些&#xff1f; 为什么要清除浮动&#xff1f;因为浮动的盒子脱离标准流&#xff0c;如果父盒子没有设置高度的话&#xff0c;下面的盒子就会撑上来。 额外标签法(在最后一个浮动标签后&#xff0c;新加一个标签&#xff0c;给其设置cle…

Redis删除策略和淘汰策略

一、删除策略 删除策略就是针对已过期数据的处理策略。 针对过期数据要进行删除的时候都有哪些删除策略呢&#xff1f; 1.定时删除2.惰性删除3.定期删除1、立即删除 当key设置有过期时间&#xff0c;且过期时间到达时&#xff0c;由定时器任务立即执行对键的删除操作。 优…

ThinkPHP02:路由

ThinkPHP02&#xff1a;路由一、路由定义二、变量规则三、路由地址四、路由参数五、路由分组六、MISS七、资源路由八、注解路由九、URL生成一、路由定义 路由默认开启&#xff0c;在 config/app.php 中可以关闭路由。 路由配置在 config/route.php 中&#xff0c;路由定义在 r…