谁首先捕获数据包 - 内核还是驱动程序?

时间:2011-08-09 15:02:30

标签: networking network-programming kernel driver

我正在尝试使用tcpreplay和tcpdump将数据包从一台机器发送到另一台机器。

如果我编写一个直接从NIC捕获数据包的驱动程序,将遵循哪条路径?

1)N / W包---->网卡----> app(没有内核角色)

2)N / W包----->内核----->网卡--->应用

由于

2 个答案:

答案 0 :(得分:6)

通常按此顺序排列:

  • NIC硬件获取电子信号,硬件更新其部分寄存器和缓冲区,通常映射到计算机物理内存
  • 硬件激活IRQ线
  • 内核陷入中断处理例程并调用驱动程序IRQ处理函数
  • 驱动程序确定这是用于RX还是TX
  • 对于RX,驱动程序将NIC从NIC硬件缓冲区设置为为网络缓冲区保留的内核内存
  • 驱动程序通知上层内核网络堆栈输入可用
  • 网络堆栈输入例程确定协议,可选地进行过滤,以及是否有对此输入感兴趣的应用程序,如果是,则缓冲数据包以进行应用程序处理,如果进程被阻塞等待输入内核标记它可以运行
  • 在某些时候,内核调度程序将该进程放在CPU上并恢复,应用程序使用网络输入

然后存在与此模型的偏差,但这些是特定硬件/操作系统的特殊情况。一个供应用户直接到硬件的供应商是Solarflare,还有其他供应商。

答案 1 :(得分:3)

驱动程序是直接与硬件交互的代码段。所以这是第一段看到数据包的代码。

然而,驱动程序在内核空间中运行;它本身就是内核的一部分。它肯定会依靠内核工具(例如内存管理)来完成它的工作。所以“没有内核的作用”不会成真。