2

我有兴趣在 Linux 上的 C++ 应用程序中通过“总线主控”访问网络数据包。我对这个整体主题有几个问题:

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

2)如果#2是“内核空间”,我怎么能改变卡,让它写入用户空间的内存?

3a) 如何从 C++ 访问这个特定的用户空间内存区域?

3b)我知道你不能只从一个应用程序开始访问其他进程的内存区域,只有那些明确“共享”的内存区域 - 那么我如何确保网卡直接写入的内存区域明确用于共享?

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

我遇到了这个词PACKET_MMAP——这会是我需要的吗?

4

1 回答 1

0

如果您映射内存区域,并将其地址提供给操作系统,操作系统可以锁定该区域(使其不会被换出)并获取内存的物理地址。

它根本不用于此目的,而是驱动程序/xen/privcmd.c 中的代码,在mmap_mfn_rangeprivcmd_ioctl_mmap(间接,通过traverse_map)调用的函数中。这反过来remap_area_mfn_pte_fn又从xen_remap_domain_mfn_range.

因此,如果您在驱动程序中执行这些操作,例如将页面锁定到内存中并属于应用程序,您可以将mmap'd 区域的物理地址编程到网络驱动程序的硬件中,并且将数据直接获取到用户代码映射的用户模式内存。

于 2013-08-17T23:19:20.630 回答