我试图了解从数据包到达网卡到目标应用程序收到数据包之间发生的所有事情。
假设:缓冲区足够大,可以容纳整个数据包。 [我知道情况并非总是如此,但我不想介绍太多技术细节]
一种选择是:
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内核中真正的网卡驱动程序中发生的情况吗?
根据这个幻灯片分享 https://www.slideshare.net/divyekapoor/linux-tcp-ip-presentation正确的操作顺序是:
- 网络设备接收帧并将这些帧传输到 DMA 环形缓冲区。
- 现在,在进行此传输后,会引发一个中断,让 CPU 知道传输已完成。
- 在中断处理程序中,CPU 将数据从 DMA 环形缓冲区传输到 CPU 网络输入队列以供稍后使用。
- 处理程序例程的下半部分是处理来自 CPU 网络输入队列的数据包并将其传递到适当的层。
因此,与传统 DMA 传输相比,这里的一个细微变化是 CPU 的参与。
在此,我们在数据传输到 DMA 环形缓冲区后涉及 CPU,这与传统的 DMA 传输不同,在传统的 DMA 传输中,一旦数据可用,我们就会生成中断,并期望 CPU 使用适当的内存位置初始化 DMA 设备,以实现数据传输。
也请阅读以下内容:https://www.safaribooksonline.com/library/view/linux-device-drivers/0596000081/ch13s04.html https://www.safaribooksonline.com/library/view/linux-device-drivers/0596000081/ch13s04.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)