linux - 从内核的角度来看,NIC 是如何工作的?

标签 linux operating-system driver

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

  1. 我了解设备在 Linux 中表示为文件。如果驱动程序/模块提供用户空间 API 来与设备通信,这是否意味着系统调用(例如对设备文件的读/写)是多余的?我并不是说实际上应该使用系统调用来读取/写入设备的文件,而只是为了争论。

  2. eth0 等设备名称如何适应所有这些?

  3. tcpdump 究竟从哪里获取数据?如果我运行类似的东西: tcpdump -vv -i eth0 tcpdump 是否从某处的设备文件中读取?实际探测 NIC 的 tx/rx 端口以获取进出它的位会太复杂,那么 tcpdump 如何获取它的信息?

非常感谢提供的任何信息。请随时提供指向网站或书籍的链接,我可以在其中了解更多相关信息。

最佳答案

“如果驱动程序/模块提供用户空间 API 来与设备通信,这是否意味着系统调用(例如读/写设备文件)是多余的?”

你这里说的和DPDK库提供的Poll Mode driver很相似。 https://doc.dpdk.org/guides/prog_guide/poll_mode_drv.html 如果驱动程序提供用户空间 API,那么读/写、发送/接收系统调用将变得多余。您必须使用驱动程序提供的 API 来读取和写入 NIC 设备。 但是,如果您仍然想使用 linux 系统调用,例如读/写或发送/接收,您可以设计您的应用程序,以便在从驱动程序 API 读取原始数据后,将原始数据“注入(inject)”到 linux 内核中,您可以通过将原始数据写入 tun/tap 设备并让您的应用程序使用 linux 系统调用从 tun/tap 设备读取数据来实现这一点。

“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/

相关文章:

c - 使用命名管道的进程间通信

linux - 音频驱动程序基地址、DMA 和 IRQ

windows - Windows 离线时驱动程序签名如何工作?

linux - 在 linux 中不使用 shell 更改目录?

c++ - 在运行时检查动态库的兼容性

linux - 在 chroot 环境中启动程序会立即返回

linux - 写时复制与非法访问

multithreading - 多处理器架构和 Ring 3

java - 如何将 WebRTC 视频流视为虚拟网络摄像头

python - 通过共享库连接 Python 和 Torch7(Lua)