DMA 代理的意义何在。或者我们可以在用户空间中使用没有意义的内核数据结构吗



我正在研究DMA代理和DMA代理通道。基本上是比如让Userspace应用程序编写tx、读取rx内核数据结构。并且允许设备访问虚拟存储器数据结构,因为设备了解物理地址。

此代码https://github.com/mstuehn/dma_proxy/blob/master/dma_proxy_test.c

还有我正在读的这篇文章https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18842418/Linux+DMA+发件人+用户+空间

从这篇论文来看http://www.diva-portal.org/smash/get/diva2:22746/FULLTEXT01.pdf上面写着这个

在Linux中,内核使用虚拟内存地址,但大多数硬件系统使用物理地址进行总线寻址。为了使硬件能够访问驻留在内核虚拟内存空间中的数据结构,这些结构必须映射到物理内存地址。仅仅使用简单的地址转换方法是不够的,因为一些系统内存管理单元必须重新编程,并且必须使用反弹缓冲区(可能在系统内存管理中——请澄清(。

我想我对dma代理驱动程序和相关的Userspace应用程序有一些了解(我猜它在嵌入式Linux系统中使用(。

但是,所有这些的意义是什么?例如,如果我在看NIC卡,那么无论我想在Userspace应用程序中使用mmap调用,还是在代理驱动程序中使用MMAP的内核实现,都将具有内核数据结构。在NIC卡的情况下,RX/TX将是内核内存空间中设备特定的数据结构表示,因为从mmap的返回中获取struct ethhdr/struct iphdr/struct tcphdr/等是不可能的,因为论文中的上面一段说可能不可能将虚拟地址转换为用户空间地址(基本上是说物理地址。我从文本读取中假设这一点(

所以基本上我还没有完全使用dma代理驱动程序。我需要一些解释来澄清这一点,以及mmap调用的返回如何在应用程序中使用,即嵌入式Linux系统中的服务器应用程序

所有这些有什么意义?例如,如果我在看NIC卡,那么无论我想在Userspace应用程序中使用mmap调用,还是在代理驱动程序中使用mmap的内核实现,都将具有内核数据结构。

内核数据结构与它有什么关系?如果你使用DMA从NIC获取数据,那么你肯定是在获取原始数据(例如以太网帧(。这种数据的布局由适用的网络协议和应用于有效载荷的任何更高级别的协议来定义。

内核源确实定义了C结构类型,其布局映射了以太网标头、IP标头、TCP标头、等字段,但这些类型遵循外部定义的数据布局,而不是相反。

如果是NIC卡,RX/TX将是内核内存空间中设备特定的数据结构表示

网络传输的格式不是特定于设备的(一般来说(。

因为从mmap的返回中获取structethhdr/structiphdr/struct-tcphdr/etc.是不可能的,因为论文的上面一段说虚拟地址到用户空间地址的转换可能是不可能(基本上它说的是物理地址。我从文本读取中假设这一点(

无关(见上文(。尽管如此,引用的论文节选与你所描述的完全不同。它根本不是在谈论用户空间与内核空间,而是在谈论硬件编程接口与内核代码。它表达了编写(内核空间(驱动程序所涉及的一些复杂性。

如何在应用程序中使用mmap调用的返回

驱动程序以字符设备的形式为用户空间提供了一个接口。将适当范围的字节从该设备映射到程序的内存空间中,可以访问驱动程序以这种方式暴露的任何数据。在DMA接口的情况下,这可能是DMA传输中涉及的(物理(内存的内容。

最新更新