无法正确表达我的问题,因此Google搜索无法帮助我。有人可以从内核的 Angular 解释NIC的工作原理。为了让内核与设备对话,您需要一个驱动程序/内核模块。我的问题:

  • 我知道设备在Linux中表示为文件。如果驱动程序/模块提供了用户空间API以便与设备进行通讯,这是否意味着诸如对设备文件的读/写之类的系统调用是多余的?我并不是说实际上应该使用系统调用来读取/写入设备的文件,只是出于争论的目的。
  • 设备名称(例如eth0)如何适合所有这些?
  • tcpdump到底从哪里获取数据?如果我运行类似:tcpdump -vv -i eth0tcpdump会从某处的设备文件读取数据吗?实际检测NIC的tx/rx端口是否有进出比特将太复杂了,那么tcpdump如何获得它的信息?

  • 提供的任何信息将不胜感激。随时提供指向网站或书籍的链接,我可以在其中了解更多信息。

    最佳答案

    “如果驱动程序/模块提供了用户空间API来与设备进行通讯,这是否意味着诸如对设备文件的读/写之类的系统调用是多余的?”

    您在此处说明的内容与DPDK库提供的“轮询模式”驱动程序非常相似。
    https://doc.dpdk.org/guides/prog_guide/poll_mode_drv.html
    如果驱动程序提供用户空间API,则读/写,发送/接收系统调用将变得多余。您必须使用驱动程序提供的API来读写NIC设备。
    但是,如果您仍然希望使用linux系统调用(例如读/写或send/recv),则可以设计应用程序,以便从驱动程序API读取原始数据后,可以将原始数据“注入(inject)”到Linux内核中,您可以通过将原始数据写入tun/tap设备中并使应用程序使用来自tun/tap设备的linux系统调用来读取数据来实现。

    “tcpdump到底从哪里获取数据?”

    大多数数据包嗅探应用程序借助在l2层打开的原始套接字来嗅探数据包。
    https://www.unix.com/programming/229235-raw-socket-programming-efficient-packet-sniffer.html

    找到了与tcpdump相关的帖子,提供了更详细的说明:
    https://unix.stackexchange.com/questions/23060/what-level-of-the-network-stack-does-tcpdump-get-its-info-from

    关于linux - 从内核的角度来看,NIC如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54035158/

    10-13 05:23