我有兴趣通过Linux上的C ++应用程序中的“bus-mastering”访问网络数据包。我有几个与这个整体主题相关的问题:
1)我如何知道“总线主控”网络卡正在将数据写入哪个存储器地址范围?这将是内核还是用户空间?
2)如果#2是“内核空间”,我怎么能更改卡以便写入用户空间的内存?
3a)如何从C ++访问这个特定的用户空间内存区域?
3b)我知道你不能只从一个应用程序开始访问其他进程的内存区域,只能那些明确“共享” - 那么我如何确保网卡直接写入的内存区域明确用于共享?
4)我如何知道网卡是否实现“总线控制”?
我遇到了PACKET_MMAP
一词 - 这是我需要的吗?
答案 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的用户模式内存。