第19周:PMD 驱动与收发包
目标:理解 PMD(Poll Mode Driver)工作原理,掌握 DPDK 收发包核心 API。
1. PMD 驱动原理
1.1 PMD vs 内核驱动
1 | 内核驱动(传统): |
1.2 Descriptor Ring
1 | RX Descriptor Ring(接收描述符环): |
1.3 收发流程
1 | RX 流程(收包): |
2. 端口配置
2.1 初始化流程
1 |
|
2.2 设备信息查询
1 | struct rte_eth_dev_info { |
3. 收发包 API
3.1 rte_eth_rx_burst
1 |
|
3.2 rte_eth_tx_burst
1 | // 批量发送数据包 |
3.3 完整收发循环
1 | // simple_fwd.c — 最简单的转发 |
4. 统计与监控
4.1 端口统计
1 | struct rte_eth_stats stats; |
4.2 统计清零
1 | // 清零统计 |
4.3 PPS 计算示例
1 | // pps_counter.c |
5. 简单的收发包统计程序
1 | // pktgen_simple.c |
6. 编译
1 | # Makefile |
1 | # Meson 方式(DPDK 22.x+) |
7. 关键 API 速查
| API | 功能 |
|---|---|
rte_eal_init() |
初始化 EAL |
rte_lcore_count() |
可用 lcore 数量 |
rte_get_master_lcore() |
获取主 lcore ID |
rte_rdtsc() |
读取 TSC 时间戳 |
rte_get_timer_hz() |
TSC 频率(Hz) |
rte_pktmbuf_pool_create() |
创建 mbuf 池 |
rte_pktmbuf_alloc() |
分配 mbuf |
rte_pktmbuf_free() |
释放 mbuf |
rte_pktmbuf_mtod() |
mbuf → 数据指针 |
rte_pktmbuf_pkt_len() |
获取包长度 |
rte_pktmbuf_data_len() |
获取当前段长度 |
rte_pktmbuf_append() |
扩展数据区 |
rte_eth_dev_configure() |
配置端口 |
rte_eth_rx_queue_setup() |
设置 RX 队列 |
rte_eth_tx_queue_setup() |
设置 TX 队列 |
rte_eth_dev_start() |
启动端口 |
rte_eth_dev_stop() |
停止端口 |
rte_eth_rx_burst() |
批量接收 |
rte_eth_tx_burst() |
批量发送 |
rte_eth_stats_get() |
获取端口统计 |
rte_eth_macaddr_get() |
获取 MAC 地址 |
rte_ring_create() |
创建无锁 ring |
rte_ring_enqueue_bulk() |
批量入队 |
rte_ring_dequeue_burst() |
批量出队 |
rte_mempool_create() |
创建 mempool |
- 本文作者: CoderSong
- 本文链接: https://jack-song-gif.github.io/2026/06/30/第19周:PMD 驱动与收发包/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!