首页 > 解决方案 > 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_rxstruct pci_dev_txdma_set_coherent_mask

如果我希望能够读取网络数据包,那么这怎么可能,因为我看到使用 NAPI 并且ISR看起来有点奇怪,因为我的 char 驱动程序将无法读取ethernet帧并将它们复制到用户缓冲区,因为需要完成这项工作在读取或 mmap 中。

那么我怎么能假设从用户空间应用程序mmapread系统调用中读取数据包呢?我必须添加什么才能将ethernet帧复制到用户缓冲区并能够通过应用程序mmapread调用获取数据包?

更新

我只是想让有人阅读我发布的评论链接。并给我一些近似于 rx 和 tx 的工作解决方案。适用于任何设备。我将使用 Realteck r 8169 设备。内核有它的来源作为驱动程序。

标签: cdma

解决方案


推荐阅读