本人对二者的理解都不是很深,只懂一些概念性的问题,因此就在一个文档里简单介绍一下。
PMD
PMD(Poll Mode Driver)轮询模式驱动并不是一个实际的功能,更类似于DPDK给用户提供的一种解决方案。与之相关的最常用的函数有rte_eth_rx_burst和rte_eth_tx_burst。
用户会在进程中写一个死循环,不断轮询rx_busrt函数从各个设备的接收队列中获取mbuf的地址。
在获取完成之后会对mbuf中的数据进行处理,处理完成之后再将其投入tx_burst函数通知网卡发送。
典型的代码架构如下:
#define MAX_PACKET_BURST 64
#define MAX_PORT_ID 4
void rtc_loop()
{
u8 port;
u32 nb_succs;
u32 lcore_id = rte_lcore_id();
struct rte_mbuf *mbufs_burst[MAX_PACKET_BURST];
while (1) {
for (port = 0; port < MAX_PORT_ID; port++) {
nb_succs = rte_eth_rx_burst(port, rx_queue_table[lcore_id], mbufs_burst, MAX_PACKET_BURST);
// do something with mbufs_burst
nb_succs = rte_eth_tx_burst(port_id, tx_queue_table[lcore_id], mbufs_burst, nb_succs);
}
}
}
UIO
UIO(UserSpace IO)用户空间IO,可以使用户态进程直接访问硬件资源,无需经过内核。
例如对网络包的处理上,可以让数据包不过内核的协议栈,并且消除数据包从内核态到用户态的拷贝。
UIO相当于是一种能力,让用户访问硬件的能力。具体怎么实现的我暂时还不清楚,好像也不是我该学习的范畴,等以后有机会再具体了解吧。