微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我正在研究 DMA 代理和 DMA 代理通道。基本上他们是 就像让用户空间应用程序写入 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+From+User+Space

从这篇论文中http://www.diva-portal.org/smash/get/diva2:22746/FULLTEXT01.pdf 它说这个

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

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

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

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

解决方法

这一切有什么意义,例如,如果我正在查看 NIC 卡,那么无论我想通过用户空间应用程序中的 mmap 调用获得什么,以及代理驱动程序中 MMAP 的内核实现都将具有内核数据结构。

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

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

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

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

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。