c - DMA 代理以及它如何用于将以太网帧复制到用户缓冲区
问题描述
这是我指的代码:https ://github.com/mstuehn/dma_proxy/blob/master/dma_proxy.c
在线841
它使用调用dma_set_coherent_mask
和传递通用设备pchannel_p->proxy_device_p
。
dma_set_coherent_mask(pchannel_p->proxy_device_p, 0xFFFFFFFF);
pchannel_p->interface_p = (struct dma_proxy_channel_interface *)
dmam_alloc_coherent(pchannel_p->proxy_device_p,
sizeof(struct dma_proxy_channel_interface),
&pchannel_p->interface_phys_addr, GFP_KERNEL);
pchannel_p
是类型dma_proxy_channel
。
struct dma_proxy_channel {
struct dma_proxy_channel_interface *interface_p; /* user to kernel space interface */
dma_addr_t interface_phys_addr;
struct device *proxy_device_p; /* character device support */
struct device *dma_device_p;
dev_t dev_node;
struct cdev cdev;
struct class *class_p;
struct dma_chan *channel_p; /* dma support */
struct completion cmp;
dma_cookie_t cookie;
dma_addr_t dma_handle;
u32 direction; /* DMA_MEM_TO_DEV or DMA_DEV_TO_MEM */
};
static struct dma_proxy_channel channels[CHANNEL_COUNT];
这就是它传递到对和进行create_channel
多次调用的方式。dma_set_coherent_mask
_rx
_tx
create_channel(&channels[0], "_tx", DMA_MEM_TO_DEV);
我的问题是:如果我的设备——DMA 代理驱动程序的目标——是 PCI 网卡(NIC 卡),那么我是否会提供两个调用来为接收和传输创建 DMA 通道struct pci_dev obj_rx
?struct pci_dev_tx
dma_set_coherent_mask
如果我希望能够读取网络数据包,那么这怎么可能,因为我看到使用 NAPI 并且ISR
看起来有点奇怪,因为我的 char 驱动程序将无法读取ethernet
帧并将它们复制到用户缓冲区,因为需要完成这项工作在读取或 mmap 中。
那么我怎么能假设从用户空间应用程序mmap
或read
系统调用中读取数据包呢?我必须添加什么才能将ethernet
帧复制到用户缓冲区并能够通过应用程序mmap
和read
调用获取数据包?
更新
我只是想让有人阅读我发布的评论链接。并给我一些近似于 rx 和 tx 的工作解决方案。适用于任何设备。我将使用 Realteck r 8169 设备。内核有它的来源作为驱动程序。
解决方案
推荐阅读
- python - 使用 PyAutoGui locateCenter 函数尝试/排除循环
- c# - 将数据库值转换为变量形式c#
- sockets - 一端套接字上的 close() 是否也在另一端关闭?
- blazor - 使用带布尔值的 InputRadio
- ios - 有没有办法在没有 MacBook 的情况下在 React Native 上测试 iOS 应用程序?
- python - RNN 验证准确度保持不变。这是正常的吗?
- python - 使用 Sympy 生成 C 代码。将 Pow(x,2) 替换为 x*x
- java - 如何在每 5 行后在 RecycleView 中加载 AdMobs?
- gettimeofday - 当系统的 RTC 尚未设置为当前时间时,gettimeofday() 将返回哪个值?
- twilio - 使用外部音频流作为 Twilio 语音通话的麦克风输入