2015-01-21 39 views
0

我在Linux x86_64上使用基于以太网10 Gbit/s的TCP/IP。TCP/IP中的数据包处理中断代码是什么?

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

是不是真的,出现这种情况:

  • 中断的代码计算IP数据包的校验
  • 代码中断将数据从内核空间缓冲区到所需的套接字缓冲区
  • 代码中断将数据从以太网卡上的缓冲区复制到内核空间中的缓冲区(或通过在以太网上使用DMA控制器发生中断之前发生,并且由以太网卡启动?)
+1

你是在谈论一个内核驱动程序吧?我无法理解'使用BSD套接字()和使用epoll()解复用'之间的联系,以及有关驱动程序实际工作方式的问题。或者一般的关于epoll设施的问题?看起来你已经在你的问题中合并了3个不同的东西。 – Maquefel 2015-01-21 10:13:50

+0

@Maquefel我删除了有关BSD套接字和epoll的说明。是的,我关于内核驱动程序,以及中断代码中发生了什么。 – Alex 2015-01-21 10:18:53

+0

硬件内核驱动程序或实际协议? – Maquefel 2015-01-21 10:40:09

回答

2

你的问题是硬件,协议栈和用户空间的混合。中断的

代码计算IP数据包的校验

这部分协议 - 我想这里的某个地方,从内核中断拷贝数据网/支持IPv4/ip_input.c

代码 - 空间缓冲区到所需的套接字缓冲区

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

中断代码将数据从以太网卡上的缓冲区复制到内核空间中的缓冲区(或者在中断产生之前,通过在以太网上使用DMA控制器并由以太网卡启动?)

这是例如drivers/net中/ 8139cp.c

下一页硬件 - 我想你是误会了“中断”一词 - 有硬件中断和软件中断。 这里唯一的硬件中断是来自以太网控制器的rx/tx中断。

不是一个完整的回答你的问题:

一切有可能划分网络分成两个部分的第一实际协议(净利润/ IPv4的目录),它实现了各种网络硬件 和部分(drivers/net中) 。

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

  1. 数据包首先被卡接收。当接口收到“数据到达中断”时,它禁止中断并通知内核开始轮询接口。
  2. 然后,当数据包可用时,中断处理程序将其保留在接口中,并调用netif_rx_schedule方法。这会导致接口驱动程序轮询方法在将来被调用。
  3. 然后它进入网络层,最后(但不是我描述的那么短)进入用户空间,并且用户被通知可用于读取事件的数据,而我不能调用中断。

我建议你阅读下面的文章:

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

+0

谢谢!您能否说,在硬件中断期间,至少要复制多少次数据以及读取多少次(例如,用于校验和)? (当我使用带有套接字的以太网使用TCP时,如果它很重要) – Alex 2015-01-21 14:14:24

+1

NAPI〜1中断(正如我在到达时所说的那样,它被禁用并且轮询模式被设置),如果不是NAPI中断可能发生的次数与数据到达,传输并且数据在任何地方都被正确地读取。在硬件中断期间不计算校验和(它可以不是IP层校验和), - 它是协议层的责任,并且在这里被封为http://lxr.free-electrons.com/source/net/ipv4/ip_input .c#L376适用于ip层。 – Maquefel 2015-01-22 06:27:14

+0

非常感谢!即对于NAPI,在1个硬件中断中,数据只复制1次。但是,您是否可以在中断发生时澄清此时以太网帧的数据:以太网卡上的硬件缓冲区中还是已经存在于CPU-RAM缓冲区中? – Alex 2015-01-22 13:01:42

相关问题