DPDK源码编译(二十八)

1、安装DPDK和源代码

首先,解压DPDK源码包

unzip DPDK-<version>.zip
cd DPDK-<version>

ls
app/ config/ examples/ lib/ LICENSE.GPL LICENSE.LGPL Makefile
mk/ scripts/ tools/

DPDK目录组成

  • lib: DPDK库源码
  • drivers:DPDK PMD源码
  • app:DPDK应用(自动测试)源码
  • examples:DPDK应用例子
  • config、tools、script、mk:与框架相关的makefile,脚本和配置

2、安装DPDK目标环境

DPDK目标格式为:ARCH-MACHINE-EXECENV-TOOLCHAIN

其中:

  • ARCH可以是:i686、x86_64、ppc_64
  • MACHINE可以是:native、ivshmem、power8
  • EXECENV可以是:linuxapp、bsdapp
  • TOOLCHAIM可以是:gcc、icc

安装的目标取决于32位和64位软件包和编译器。可用的目标可在DPDK/config目录中找到。不再使用defconfig_前缀。

注意

配置文件随RTE_MACHINE优化级别集一起提供。在配置文件中,RTE_MACHINE配置值设置为native,这意味着已针对已构建软件的平台调整了已编译软件。有关此设置及其可能值的更多信息,请参见《DPDK程序员指南》。

使用英特尔®C ++编译器(icc)时,应分别调用以下命令之一以用于64位或32位。请注意,shell脚本会更新$PATH变量,因此不应在同一会话中执行。另外,请验证编译器的安装目录,因为路径可能不同:

source /opt/intel/bin/iccvars.sh intel64
source /opt/intel/bin/iccvars.sh ia32

要安装和生成目标,请使用顶层DPDK目录中的make install T = <target>命令。

例如,要使用icc编译64位目标,请运行:

make install T=x86_64-native-linuxapp-icc

要使用gcc编译32位版本,make命令应为:

make install T=i686-native-linuxapp-gcc

例如,如果需要在不构建目标的情况下准备目标,则在编译之前需要进行配置更改,请使用make config T = <target>命令:

make config T=x86_64-native-linuxapp-gcc

警告

任何要使用的内核模块,例如igb_uio,kni,必须使用与目标机上运行的内核相同的内核进行编译。如果未在目标计算机上构建DPDK,则应使用RTE_KERNELDIR环境变量将编译指向要在目标计算机上使用的内核版本的副本。

创建目标环境后,用户可以移至目标环境目录,并继续进行代码更改和重新编译。用户还可以通过编辑构建目录中的.config文件来修改编译时DPDK配置。 (这是顶层config目录中defconfig文件的本地构建副本)。

cd x86_64-native-linuxapp-gcc
vi .config
make

另外,make clean命令可用于删除任何现有的已编译文件,以便随后对代码进行完整的,干净的重建。

3、浏览已安装的DPDK环境目标

创建目标后,它将包含所有库,包括轮询模式驱动程序以及构建客户应用程序所需的DPDK环境的头文件。另外,test和testpmd应用程序在build/app目录下构建,可用于测试。还存在一个kmod目录,其中包含内核模块,可以在需要时加载它们。

ls x86_64-native-linuxapp-gcc

app build include kmod lib Makefile

4、加载模块以为DPDK启用用户空间IO

要运行任何DPDK应用程序,可以在运行的内核中加载合适的uio模块。在许多情况下,Linux内核中包含的标准uio_pci_generic模块可以提供uio功能。可以使用以下命令加载该模块

sudo modprobe uio_pci_generic

作为uio_pci_generic的替代,DPDK还包括igb_uio模块,该模块可在上述kmod子目录中找到。可以如下所示加载它:

sudo modprobe uio
sudo insmod kmod/igb_uio.ko

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

由于DPDK 1.7及更高版本提供VFIO支持,因此对于支持使用VFIO的平台,可以选择使用UIO。

5、加载VFIO模块

要运行DPDK应用程序并使用VFIO,必须加载vfio-pci模块:

sudo modprobe vfio-pci

请注意,为了使用VFIO,您的内核必须支持它。从3.6.0版开始,Linux内核中已包含VFIO内核模块,通常默认情况下会提供VFIO内核模块,但是请查阅您的发行版文档以确保确实如此。

另外,要使用VFIO,内核和BIOS都必须支持并配置为使用IO虚拟化(例如Intel®VT-d)。

为了在以非特权用户身份运行DPDK应用程序时正确运行VFIO,还应设置正确的许可权。这可以通过使用DPDK设置脚本(称为dpdk-setup.sh并位于tools目录中)来完成。

6、与内核模块之间的网络端口绑定和解绑定

从1.4版开始,DPDK应用程序不再自动从正在使用的内核驱动程序中解除所有受支持的网络端口的绑定。相反,在运行该应用程序之前,必须将DPDK应用程序要使用的所有端口都绑定到uio_pci_generic,igb_uio或vfio-pci模块。 DPDK轮询模式驱动程序将忽略Linux *控制下的任何网络端口,并且应用程序无法使用它们。

警告
默认情况下,DPDK将在启动时不再自动从内核驱动程序中解除网络端口的绑定。在运行应用程序之前,必须将所有DPDK应用程序使用的端口从Linux *控件中解除绑定,并绑定到uio_pci_generic,igb_uio或vfio-pci模块。

要将端口绑定到uio_pci_generic,igb_uio或vfio-pci模块以供DPDK使用,然后将端口返回到Linux *控制,在tools子目录中提供了一个名为dpdk_nic _bind.py(dpdk16.07之后将dpdk_nic_bind工具重命名为dpdk-devbind)的实用程序脚本。该实用程序可用于提供系统上网络端口的当前状态的视图,以及绑定和解除绑定来自不同内核模块(包括uio和vfio模块)的那些端口。以下是如何使用脚本的一些示例。通过使用–help或–usage选项调用脚本,可以获得脚本及其参数的完整说明。请注意,在运行dpdk-devbind.py脚本之前,应将要使用的uio或vfio内核模块加载到内核中。

警告
由于VFIO的工作方式,与VFIO一起使用的设备存在一定的限制。主要取决于IOMMU组的工作方式。任何虚拟功能设备都可以单独与VFIO一起使用,但是物理设备将需要绑定到VFIO的所有端口,或者要求其中一些绑定到VFIO,而其他端口则根本不绑定任何东西。
如果您的设备在PCI到PCI桥接器后面,则该桥接器将成为设备所在的IOMMU组的一部分。因此,桥接器驱动程序也应从桥接器PCI设备上解除绑定,以便VFIO与设备一起使用在桥后面。

警告
尽管任何用户都可以运行dpdk-devbind.py脚本来查看网络端口的状态,但是绑定或解除绑定网络端口需要root特权。

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

./tools/dpdk-devbind.py --status

Network devices using DPDK-compatible driver
============================================
0000:82:00.0 '82599EB 10-GbE NIC' drv=uio_pci_generic unused=ixgbe
0000:82:00.1 '82599EB 10-GbE NIC' drv=uio_pci_generic unused=ixgbe

Network devices using kernel driver
===================================
0000:04:00.0 'I350 1-GbE NIC' if=em0  drv=igb unused=uio_pci_generic *Active*
0000:04:00.1 'I350 1-GbE NIC' if=eth1 drv=igb unused=uio_pci_generic
0000:04:00.2 'I350 1-GbE NIC' if=eth2 drv=igb unused=uio_pci_generic
0000:04:00.3 'I350 1-GbE NIC' if=eth3 drv=igb unused=uio_pci_generic

Other network devices
=====================
<none>

要将设备eth104:00.1绑定到uio_pci_generic驱动程序:

./tools/dpdk-devbind.py --bind=uio_pci_generic 04:00.1

或者

./tools/dpdk-devbind.py --bind=uio_pci_generic eth1

要将设备82:00.0恢复到其原始内核绑定,请执行以下操作:

./tools/dpdk-devbind.py --bind=ixgbe 82:00.0

原文链接:http://doc.dpdk.org/guides-16.07/linux_gsg/build_dpdk.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值