| Name | Date | Size | #Lines | LOC | ||
|---|---|---|---|---|---|---|
| .. | - | - | ||||
| e1000/ | H | 05-Jun-2025 | - | 8,634 | 6,181 | |
| igb_uio/ | H | 05-Jun-2025 | - | 945 | 699 | |
| README.txt | H A D | 05-Jun-2025 | 2.9 KiB | 65 | 50 |
README.txt
1下面以Intel的I350网卡为例:(对于其它厂家的PCIE网卡,需要按照下面第6点的说明,让厂家修改符合我们平台要求的驱动) 2 31. kernel defconfig打开如下配置: 4+CONFIG_UIO=m 5+CONFIG_HUGETLBFS=y 6 72. kernel代码修改如下: 8diff --git a/include/linux/uio_driver.h b/include/linux/uio_driver.h 9index 77131e8fefcc1..0a70d70bed6df 100644 10--- a/include/linux/uio_driver.h 11+++ b/include/linux/uio_driver.h 12@@ -45,7 +45,7 @@ struct uio_mem { 13 struct uio_map *map; 14 }; 15 16-#define MAX_UIO_MAPS 5 17+#define MAX_UIO_MAPS 13 18 19 struct uio_portio; 20 21@@ -65,7 +65,7 @@ struct uio_port { 22 struct uio_portio *portio; 23 }; 24 25-#define MAX_UIO_PORT_REGIONS 5 26+#define MAX_UIO_PORT_REGIONS 13 27 28 struct uio_device { 29 struct module *owner; 30 313.把补丁包的igb_uio驱动,用对应的内核编译出一个igb_uio.ko 32+obj-m += igb_uio/ 33 344.i350网卡使用drivers/net/e1000/驱动 35用补丁包里面e1000/目录的两个文件 *对比* 开源代码进行修改合并 36 375. 附相关命令及工具: 38#驱动(下面两个ko都从实际使用的内核编译) 39insmod uio.ko 40insmod igb_uio.ko 41#开启性能模式(命令报错忽略) 42echo performance | tee $(find /sys/ -name *governor) /dev/null || true 43#开启hugepages 44echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages 45 46#绑定网卡 (0000:01:00.X要改成实际的) 47dpdk/usertools/dpdk-devbind.py -b igb_uio 0000:01:00.0 48dpdk/usertools/dpdk-devbind.py -b igb_uio 0000:01:00.1 49dpdk/usertools/dpdk-devbind.py -b igb_uio 0000:01:00.2 50dpdk/usertools/dpdk-devbind.py -b igb_uio 0000:01:00.3 51... ... 52 53#测试工具(DPDK可以直接从官网下载编译) 54dpdk/build/app/dpdk-testpmd 55dpdk/examples/l3fwd/build/l3fwd 56 576. RK平台特殊说明 58RK主控没有*硬件*支持网卡DMA访问内存一致性,所以开源DPDK代码网卡驱动使用的API:rte_eth_dma_zone_reserve/rte_mbuf_raw_alloc它是默认要求硬件访问内存一致性的; 59比如发送数据的场景:CPU把数据写到内存,然后通知网卡DMA来搬运数据,其它平台硬件会自动刷新cache,使的网卡DMA能直接拿到最新数据,而RK平台需要手动取刷新; 60DPDK内存主要有两种: 61一个是给网卡BD描述符使用的内存,使用rte_eth_dma_zone_reserve来分配,由于它会被频繁使用,所以解决策略是在内核使用dma_alloc_coherent分配非cache的内存,然后映射给dpdk的网卡驱动使用; 62二是网卡存放数据的内存,比如用rte_mbuf_raw_alloc分配,由于内存分配量比较大,所以直接使用arm标准的指令刷cache的命令来实现,比如写发送数据时,写完数据后主动刷新这块内存,让实际的内存写到DDR里面取,此时DMA就能拿到实际写入的数据; 63!!!注意:如果要支持其它型号的网卡,请按照上述的要求让网卡厂商去修改他们的驱动即可。 64 65