linux kernel 接收网络数据包处理流程

本文详细介绍了Linux内核如何处理网络数据包,从网卡接收数据到软中断处理,再到驱动的poll函数,最后进入协议栈。通过分析软中断线程、硬中断处理、NAPI调度及RPS功能,揭示了数据包从硬件到软件的完整路径。
摘要由CSDN通过智能技术生成

数据包接收处理流程

  1. 系统启动时,在kernel/softirq.c文件中函数spawn_ksoftirq会调用smpboot_register_percpu_thread,这个函数位于kernel/smpboot.c文件中,他的作用就是为每一个cpu注册一个软中断的线程处理函数,而这个软中断处理线程函数名称为run_ksoftirqd
  2. 软中断线程入口函数run_ksoftirqd会检测softirq的pengding位是否置位,如果置位则调用__do_softirq();
  3. 位于文件kernel/softirq.c中的函数__do_softirq会根据pending位去找到注册软中断softirq的action函数,然后执行注册函数。
  4. 系统启动时,位于/net/core/dev.c文件中的net_dev_init函数将注册softirq,NET_RX_SOFTIRQ对应的软中断入口函数为net_rx_action
  5. 位于/net/core/dev.c文件中的net_rx_action函数会调用napi_poll函数,最终对调用到驱动的poll函数,这就是驱动接收数据包的入口函数。比如nxp的以太网驱动里边的lpc_eth_poll就是poll的入口

有了上面的描述,我们知道的软中断的入口,但是从数据包到达网卡之后怎么触发中断的呢?

  1. 网卡接收到数据包,网卡将DMA的数据写入RAM中
  2. 网卡向CPU触发硬中断
  3. CPU调用硬中断处理函数,这里我们以nxp的以太网卡驱动进行说明,内核版本4.1.35,文件名称:/driver/net/ethernet/nxp/lpc_eth.c,驱动程序入口函数lpc_eth_drv_probe会注册硬中断处理函数,注册代码如下:
    ret = request_irq(ndev->irq, __lpc_eth_interrupt, 0, ndev->name, ndev);
    
    这说明nxp以太网卡驱动的硬中断入口函数为__lpc_eth_interrupt.
  4. 硬中断处理函数清除硬中断的IRQ标志位,调用__net_schedule。实际的代码如下
    tmp = readl
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值