环缓冲区和DMA

时间:2017-04-29 14:49:06

标签: linux-kernel linux-device-driver dma

我试图了解数据包到达NIC之间发生的所有事情,直到目标应用程序收到数据包为止。

假设:缓冲区足以容纳整个数据包。 [我知道并非总是如此,但我不想介绍太多技术细节]

一个选项是:

 1. Packet reaches the NIC.
 2. Interrupt is raised.
 2. Packet is transferred from the NIC buffer to OS's memory by means of DMA.
 3. Interrupt is raised and the OS copies the packet from it's buffer to the relevant application.

上述问题是当数据短暂突发并且内核无法跟上节奏时。另一个问题是每个数据包都会触发一个对我来说效率非常低的中断。

我知道要解决上述问题中的至少一个问题,可以使用几个缓冲区[环形缓冲区]。但是,我不了解允许这项工作的机制。 假设:

 1. Packet arrives to the NIC.
 2. DMA is triggered and the packet is transfered to one of the buffers [from the ring buffer].
 3. Handling of the packet is then scheduled for latter time [bottom half].

这会有用吗? 这是Linux内核中真正的NIC驱动程序中发生的事情吗?

1 个答案:

答案 0 :(得分:1)

根据这个slideshare,正确的行动顺序是:

  • 网络设备接收帧,这些帧将传输到DMA环形缓冲区。
  • 现在进行此传输后,会产生一个中断,让CPU知道已经进行了传输。
  • 在中断处理程序例程中,CPU将数据从DMA环形缓冲区传输到CPU网络输入队列以供日后使用。
  • 底部处理程序例程的一半是处理来自CPU网络输入队列的数据包并将其传递给适当的层。

因此,与传统的DMA传输相比,其中的一个轻微变体是关于CPU的参与。

在这种情况下,我们在数据传输到DMA环形缓冲区之后涉及CPU,这与传统的DMA传输不同,我们在数据可用时立即生成中断,并期望CPU使用适当的存储器位置初始化DMA设备以实现数据传输

请阅读此内容:https://www.safaribooksonline.com/library/view/linux-device-drivers/0596000081/ch13s04.html