前置的知识:
- vfio-pci 驱动程序:
设备直通:允许用户空间程序直接访问设备。
内存隔离:通过 IOMMU 提供内存隔离,确保设备只能访问被授权的内存区域。
virtio-pci:用于虚拟化环境中的Virtio设备通信,提供标准化的接口,简化虚拟机与物理主机之间的设备通信。提供易用的标准化接口,性能较高,但不如vfio-pci直接访问物理设备的性能高。
- PCI总线
PCI总线是一种标准的高速并行总线,允许多个硬件设备与计算机主板进行通信。PCI总线的设计目标是提供高带宽和低延迟的通信通道。 - PCI设备
PCI设备是通过PCI总线连接到计算机主板的硬件组件。这些设备通常包括:
网络接口卡(NIC):用于连接以太网或其他网络类型。
图形处理单元(GPU):用于图形渲染和计算。
存储控制器:用于连接硬盘、固态硬盘(SSD)等存储设备。
声卡:用于音频输入和输出。
其他外设:如USB控制器、SATA控制器等。
查看系统中的所有PCI设备及其详细信息
lspci
lspci -v 命令查看设备的详细信息,包括设备ID、供应商ID、驱动程序等。例如:
lspci -v -s 00:03.0
加载内核模块:
modprobe vfio
modprobe vfio-pci
显示当前加载的模块:
lsmod
GRUB(GRand Unified Bootloader)是一个引导加载程序,用于引导操作系统内核。
帮助操作系统内核在启动时配置各种功能,包括IOMMU。通过编辑GRUB配置文件,可以向内核传递特定参数,以启用或配置IOMMU。
GRUB配置文件通常位于 /etc/default/grub。通过在这个文件中添加或修改内核参数,可以控制内核在启动时的行为。
对于ARM CPU,常见的内核参数包括:
iommu.passthrough=1:启用设备直通模式。
iommu.strict=1:启用严格模式,确保IOMMU在每次DMA操作后刷新TLB。
arm-smmu.disable_bypass=0:启用ARM SMMU(系统内存管理单元)的旁路模式。
iommu=pt:启用直通模式。
下载dpdk:
wget http://fast.dpdk.org/rel/dpdk-24.07.tar.xz
编译:
meson setup build -Dplatform=generic
ninja -C build
内部配置方面:
一般4G的机器, 在使用的dpdk 做开发的时候, 需要配置多少的大页面呢?
建议配置
对于 4GB 内存的机器,建议配置 256 到 512 个 2MB 的 Hugepages。具体数量可以根据实际需求进行调整。以下是一些参考:
256 个 2MB 的 Hugepages:总共占用 512MB 内存。
512 个 2MB 的 Hugepages:总共占用 1GB 内存。
配置 512 个 2MB 的大页内存
sudo sysctl -w vm.nr_hugepages=512
检查 Hugepages 配置
grep HugePages_ /proc/meminfo
创建挂载点
sudo mkdir -p /mnt/huge
挂载 hugetlbfs 文件系统
sudo mount -t hugetlbfs nodev /mnt/huge
卸载 /mnt/huge 挂载点
sudo umount /mnt/huge
验证挂载
mount | grep hugetlbfs
//输出
nodev on /mnt/huge type hugetlbfs (rw,relatime,pagesize=2M)
验证:
sudo ./build/app/dpdk-testpmd -c 0x3 -n 4 -- --total-num-mbufs=4096 -i
网络方面配置
多网卡配置:
验证:
//这将列出所有以太网设备及其 PCI 地址,例如:
$ lspci | grep Ethernet
00:05.0 Ethernet controller: Red Hat, Inc. Virtio network device
00:06.0 Ethernet controller: Red Hat, Inc. Virtio network device
00:07.0 Ethernet controller: Red Hat, Inc. Virtio network device
root at putao in ~
$ ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp0s5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 00:1c:42:df:8f:5a brd ff:ff:ff:ff:ff:ff
3: enp0s6: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 00:1c:42:9f:12:64 brd ff:ff:ff:ff:ff:ff
4: enp0s7: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 00:1c:42:a2:aa:01 brd ff:ff:ff:ff:ff:ff
$ sudo ./usertools/dpdk-devbind.py --status
Network devices using kernel driver
===================================
0000:00:05.0 'Virtio network device 1000' if=enp0s5 drv=virtio-pci unused=vfio-pci *Active* (这个是虚拟机的网卡, 为了避免环境污染, 新加了2个网卡)
0000:00:06.0 'Virtio network device 1000' if=enp0s6 drv=virtio-pci unused=vfio-pci
0000:00:07.0 'Virtio network device 1000' if=enp0s7 drv=virtio-pci unused=vfio-pci
0000:00:06.0 : 设备的pci地址
if=enp0s6:设备在操作系统中的网络接口名称。
drv=virtio-pci:表示这些设备当前使用的是 virtio-pci 驱动程序。
unused=vfio-pci:表示这些设备可以使用 vfio-pci 驱动程序,但当前未使用。
Active:表示 0000:00:05.0 设备当前处于活动状态。
docker-test 配置文件内容:
FROM ubuntu:20.04
# 安装必要的工具和依赖
RUN apt-get update && apt-get install -y \
build-essential \
meson \
ninja-build \
libnuma-dev \
git \
python3-pip
RUN pip3 install pyelftools
# 下载并编译DPDK
RUN git clone https://github.com/DPDK/dpdk.git /dpdk
WORKDIR /dpdk
RUN meson build -Dplatform=generic
RUN ninja -C build
RUN ninja -C build install
# 设置环境变量
ENV RTE_SDK=/dpdk
ENV RTE_TARGET=build
构建镜像:
docker build -t dpdk-test -f docker-dpdk .
arm镜像:
https://www.cnblogs.com/qs52/articles/17774024.html
sources.list
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-backports main restricted universe multiverse
deb http://ports.ubuntu.com/ubuntu-ports/ jammy-security main restricted universe multiverse
更新
apt-get update
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。