TCP/IP中包处理的中断代码是什么?

What does the interrupt code for packet processing in the TCP/IP?

我在 Linux x86_64 上通过以太网 10 Gbit/s 使用 TCP/IP。

但是当 CPU-Core 之一发生中断时会发生什么?

这是真的吗,发生了:

你的问题是硬件、协议栈和用户的混合space。

code of interrupt calculates checksum of IP-packet

这部分是协议 - 我想这里的某个地方 net/ipv4/ip_input.c

code of interrupt copies data from kernel-space buffer to the required socket-buffer

原型和用户的混合 space 例如这里 net/ipv4/tcp_input.c

code of interrupt copies data from the buffer on Ethernet-card to the buffer in kernel-space (or it occurs before an interrupt is generated, by using DMA-controller on Ethernet and is this initiated by Ethernet-card?)

这是硬件,例如 drivers/net/8139cp.c

接下来 - 我认为您误解了 "interrupt" 术语 - 有硬件中断和软件中断。 这里唯一的硬件中断是来自以太网控制器的 rx/tx 个中断。

没有完整回答您的问题:

首先,可以将网络分为实际协议两部分(net/ipv4 目录) 以及实现各种网络硬件的部分 (drivers/net)。

并非所有硬件驱动程序都实现中断驱动技术,一些用于高带宽适配器的驱动程序使用轮询技术(NAPI 接口 - 我将简要介绍)。

  1. 数据包首先被卡接收。当接口接收到 "data arrived interrupt" 时,它会禁用中断并告诉内核开始轮询接口。
  2. 然后当数据包可用时,中断处理程序将其留在接口中并调用方法 netif_rx_schedule。这会导致将来调用接口驱动程序轮询方法。
  3. 然后它进入网络层,最后(但不像我描述的那么短)进入用户 space,并通知用户有关读取事件可用的数据,我不能调用中断.

我建议您阅读以下文章:

Linux 网络内核 (http://www.ecsl.cs.sunysb.edu/elibrary/linux/network/LinuxKernel.pdf)

我认为这是支持 DMA(总线控制)的网络接口与 NAPI 驱动程序的工作方式:

当数据包到达时,套接字缓冲区已经分配并映射到 DMA 内存缓冲区,并且 DMA 已准备就绪。

  1. 数据包通过DMA从NIC传输到Socket Buffer
  2. 当 DMA 传输完成时,NIC 引发硬件中断。
  3. 硬件中断处理程序调度数据包接收软件中断 (SOFTIRQ)
  4. SOFTIRQ 调用 NAPI poll() 进行进一步处理。
  5. NAPI poll() 处理 DMA 缓冲区队列中的数据包,并将它们作为 sk_buff 传递给上层并初始化新的 DMA 缓冲区。如果处理了所有数据包(配额),则启用 IRQ 并告知 NAPI 停止轮询。