在Linux上用C ++实现用户空间网卡“bus-mastering”

时间:2013-08-17 20:08:57

标签: c++ linux memory-management linux-kernel dma

我有兴趣通过Linux上的C ++应用程序中的“bus-mastering”访问网络数据包。我有几个与这个整体主题相关的问题:

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

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

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

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

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

我遇到了PACKET_MMAP一词 - 这是我需要的吗?

1 个答案:

答案 0 :(得分:0)

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

它完全没有用于此目的,但函数mmap_mfn_range中的{/ 1}}函数中的drivers / xen / privcmd.c中的代码(间接地,privcmd_ioctl_mmap) 。这反过来从traverse_map调用remap_area_mfn_pte_fn

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