Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
实施用户空间网卡“;“总线控制”;在C++;在Linux上 我对在Linux上的C++应用程序中通过“总线控制”访问网络包感兴趣。我有几个关于这个主题的问题:_C++_Linux_Memory Management_Linux Kernel_Dma - Fatal编程技术网

实施用户空间网卡“;“总线控制”;在C++;在Linux上 我对在Linux上的C++应用程序中通过“总线控制”访问网络包感兴趣。我有几个关于这个主题的问题:

实施用户空间网卡“;“总线控制”;在C++;在Linux上 我对在Linux上的C++应用程序中通过“总线控制”访问网络包感兴趣。我有几个关于这个主题的问题:,c++,linux,memory-management,linux-kernel,dma,C++,Linux,Memory Management,Linux Kernel,Dma,1) 我如何知道启用“总线主控”功能的网卡正在向哪个内存地址范围写入数据,这是内核还是用户空间 2) 如果#2是“内核空间”,我如何更改卡以使其写入用户空间中的内存 如何从C++访问这个特定的用户空间内存区域? 3b)我知道您不能仅从一个应用程序开始访问其他进程的内存区域,只能访问那些显式“共享”的内存区域-因此,我如何确保网卡直接写入的内存区域显式用于共享 4) 如何知道网卡是否实现了“总线控制” 我遇到了术语PACKET_MMAP-这就是我需要的吗?如果你MMAP一个内存区域,并将该区域的地

1) 我如何知道启用“总线主控”功能的网卡正在向哪个内存地址范围写入数据,这是内核还是用户空间

2) 如果#2是“内核空间”,我如何更改卡以使其写入用户空间中的内存

如何从C++访问这个特定的用户空间内存区域? 3b)我知道您不能仅从一个应用程序开始访问其他进程的内存区域,只能访问那些显式“共享”的内存区域-因此,我如何确保网卡直接写入的内存区域显式用于共享

4) 如何知道网卡是否实现了“总线控制”


我遇到了术语
PACKET_MMAP
-这就是我需要的吗?

如果你MMAP一个内存区域,并将该区域的地址提供给操作系统,操作系统可以锁定该区域(这样它就不会被交换掉)并获得内存的物理地址

它根本不用于此目的,而是用于drivers/xen/privcmd.c中的代码,该代码位于从
privcmd\u-mmap
调用的函数
mmap\u-mfn\u-range
(通过
traverse\u-map
间接调用)中。这依次从
xen\u remap\u domain\u mfn\u range
调用
remap\u area\u mfn\u pte\u fn


因此,如果您在驱动程序中沿着这些线路做一些事情,例如页面被锁定在内存中并且属于应用程序,您可以将
mmap
'd区域的物理地址编程到网络驱动程序的硬件中,并将数据直接获取到由用户代码mmap'd的用户模式内存中

公平地说,大多数人会把这个概念理解为“DMA”吗即使从技术上讲它不是?我们已经编辑以反映您的建议-谢谢。@didierc谢谢-但我要求提供实际的代码/建议如何实际实现它。您可以使用mmap系统调用创建一个内存缓冲区,该缓冲区绑定到专为这种情况创建的描述符,然后使用splice系统调用将数据从mmap缓冲区零拷贝到套接字缓冲区。我认为使用MMAP空间作为POD类型对象的分配空间是很有意思的,因此避免了在那里复制数据的需要。因此,在用户空间中基本上创建一个硬编码的地址范围,然后进入驱动器并更改数据发送到哪里,然后将其发送到用户字段,然后从C++应用程序中提取数据。是什么阻止另一个进程写入userland中的内存区域?这种方法与PACKET_MMAP()相比如何?
MMAP
将物理内存区域映射到该进程的空间中,并映射到一个虚拟地址-该地址不可用于任何其他进程,也不必硬编码,它可能是随机数的结果,或者更好的是,让操作系统自己选择一个(给定地址为空). 我只是快速阅读你的链接,因为它似乎是指Linux 2.4和2.6,这是一个有点老…看起来像“代码> PACETEXMMAP MMAP< /代码>区域的地址传递给卡。使用硬编码的虚拟地址不会有帮助,因为虚拟地址不是卡所需要的,它需要物理地址(要知道这一点,您需要它是哪个进程以及虚拟地址是什么)。