Linux kernel 什么';这就是DMA代理的要点。或者我们可以在用户空间中使用毫无意义的内核数据结构吗

Linux kernel 什么';这就是DMA代理的要点。或者我们可以在用户空间中使用毫无意义的内核数据结构吗,linux-kernel,linux-device-driver,embedded-linux,dma,Linux Kernel,Linux Device Driver,Embedded Linux,Dma,我在研究DMA代理和DMA代理通道。基本上是这样 就像让用户空间应用程序写入tx、读取rx内核数据结构一样。并让设备访问虚拟内存数据结构,因为设备了解物理地址 此代码 还有我正在读的这篇文章 从这篇论文中 上面写着 在Linux中,内核使用虚拟内存地址,但大多数硬件系统使用物理地址进行总线寻址。 为了使硬件能够访问驻留在内核虚拟内存空间中的数据结构,这些结构必须映射到物理内存地址。使用简单的地址转换方法是不够的,因为一些系统内存管理单元必须重新编程,并且必须使用反弹缓冲区(可能在系统内存管理单元

我在研究DMA代理和DMA代理通道。基本上是这样 就像让用户空间应用程序写入tx、读取rx内核数据结构一样。并让设备访问虚拟内存数据结构,因为设备了解物理地址

此代码

还有我正在读的这篇文章

从这篇论文中 上面写着

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

我想我已经掌握了一些dma代理驱动程序和相关的用户空间应用程序(我猜它是在嵌入式Linux系统中使用的)

但这一切的意义是什么?例如,如果我看的是网卡,那么无论我在用户空间应用程序中使用mmap调用得到什么,代理驱动程序中
mmap
的内核实现都将具有内核数据结构。对于NIC卡,RX/TX将是内核内存空间中特定于设备的数据结构表示,因为geting
struct ethhdr
/
struct iphdr
/
struct tcphdr
/等。由于论文的上述段落提到将虚拟地址转换为用户空间地址,因此无法返回mmap可能是不可能的(基本上它说的是物理地址。我是根据阅读的文本假设的)

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

这一切的意义是什么?例如,如果我在看网卡,那么无论我在用户空间应用程序中使用mmap调用得到什么,以及在代理驱动程序中使用mmap的内核实现都将具有内核数据结构

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

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

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

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

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

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

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


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

此github代码使用
DMA引擎/AXI DMA驱动程序
作为设备
AXI
必须是某个设备。PCI网卡驱动程序也使用DMA缓冲区。每个设备都有自己的DMA。那么为什么在代码中我找不到使用pci/usb的设备呢?它使用call 2
dmam\u alloc\u相干(pcChannel\u p->proxy\u device\u p,sizeof(..),&pcChannel\u p->interface\u phys\u addr,GFP\u KERNEL)
这个
pcchannel\u p->proxy\u设备
是通用设备。这是否意味着对于pci网络字符dma代理驱动程序,我应该指定
pcchannel\u p->proxy\u设备
,而不是
pcchannel\u p->proxy\u设备
,它是
struct device*proxy\u设备在呼叫dmam时,如果你有一个新问题,@Ti1,那么你应该把它当作一个问题。似乎是666组AI的另一个帐户。他们完全无视任何读书的建议。