gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:10:14 35 4
gpt4 key购买 nike

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

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

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

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

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

4) 如何知道网卡是否实现了“bus-mastering”?

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

最佳答案

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

它根本不用于该目的,而是 drivers/xen/privcmd.c 中的代码,在从 privcmd_ioctl_mmap 调用的函数 mmap_mfn_range 中(间接地,由traverse_map)。这反过来从 xen_remap_domain_mfn_range 调用 remap_area_mfn_pte_fn

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

关于c++ - 在 Linux 上用 C++ 实现用户空间网卡 "bus-mastering",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18292871/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com