收包过程

数据包从网卡到socket的整个过程

  1. 加载网卡驱动
  2. 包进入网卡(解码)
  3. 网卡(通过DMA)copy包到内核ring buffer
  4. 硬中断通知系统
  5. 驱动调用NAPI,如果poll没有开始,开始轮寻
  6. ksoftirqd调用napi的poll函数从ring buffer收包,poll函数是网卡驱动在初始化的时候注册的,每个cpu上都运行一个ksoftirqd进程
  7. ring buffer中包对应位置的内存区域unmapped
  8. DMA进入内存的数据包以skb的形式送至更上层处理
  9. 如果packrt steering打开,或者网卡有多队列,网卡收到的包分发给多个cpu
  10. 进入协议层
  11. 协议层处理
  12. 进入socket

网卡驱动

以ibg驱动为例

驱动初始化

驱动使用module_init向内核注册一个初始化函数,驱动被加载时,内核调用这个函数

/**
 *  igb_init_module - Driver Registration Routine
 *
 *  igb_init_module is the first routine called when the driver is
 *  loaded. All it does is register with the PCI subsystem.
 **/
static int __init igb_init_module(void)
{
  int ret;
  pr_info("%s - version %s\\n", igb_driver_string, igb_driver_version);
  pr_info("%s\\n", igb_copyright);

  /* ... */

  ret = pci_register_driver(&igb_driver);
  return ret;
}

module_init(igb_init_module);

初始化的大部分工作在pci_register_driver中完成