我试图了解数据包到达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驱动程序中发生的事情吗?
答案 0 :(得分:1)
根据这个slideshare,正确的行动顺序是:
因此,与传统的DMA传输相比,其中的一个轻微变体是关于CPU的参与。
在这种情况下,我们在数据传输到DMA环形缓冲区之后涉及CPU,这与传统的DMA传输不同,我们在数据可用时立即生成中断,并期望CPU使用适当的存储器位置初始化DMA设备以实现数据传输
请阅读此内容:https://www.safaribooksonline.com/library/view/linux-device-drivers/0596000081/ch13s04.html