实施用户空间网卡“;“总线控制”;在C++;在Linux上 我对在Linux上的C++应用程序中通过“总线控制”访问网络包感兴趣。我有几个关于这个主题的问题:
1) 我如何知道启用“总线主控”功能的网卡正在向哪个内存地址范围写入数据,这是内核还是用户空间 2) 如果#2是“内核空间”,我如何更改卡以使其写入用户空间中的内存 如何从C++访问这个特定的用户空间内存区域? 3b)我知道您不能仅从一个应用程序开始访问其他进程的内存区域,只能访问那些显式“共享”的内存区域-因此,我如何确保网卡直接写入的内存区域显式用于共享 4) 如何知道网卡是否实现了“总线控制”实施用户空间网卡“;“总线控制”;在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一个内存区域,并将该区域的地
我遇到了术语
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< /代码>区域的地址传递给卡。使用硬编码的虚拟地址不会有帮助,因为虚拟地址不是卡所需要的,它需要物理地址(要知道这一点,您需要它是哪个进程以及虚拟地址是什么)。