一篇文章告訴你:Linux 網絡驅動,網卡原理,它們之間怎麼交互?

Linux 文章 中央處理器 底層軟件架構 2019-07-02

驅動和網卡的交互過程很少人會關注,但是如果你懂這方面的知識,會對用戶態的網絡編程更加理解深刻和通透。

一篇文章告訴你:Linux 網絡驅動,網卡原理,它們之間怎麼交互?

驅動和網卡之間是異步通信。驅動在請求發送數據之後CPU就去幹別的事情去了。網卡發送完包之後通過中斷通知CPU,CPU再通過驅動程序瞭解到結果。和發送數據一樣,接收數據也是異步的。網卡把數據倒騰到主存之後再通過中斷通知CPU。

因此,預留一些空間來緩存發送和接受的buffer是必要的。大多數情況下,網卡使用環結構,這個環基本上就是一個隊列,它具有固定的條目數,每一個條目存儲一個發送或者接受的數據。條目被順序的輪流使用,可以複用。如下圖所示,可以看到數據傳送過程。


一篇文章告訴你:Linux 網絡驅動,網卡原理,它們之間怎麼交互?

發送數據流

驅動接收上層的數據並創建一個網卡可以理解的數據包描述(send descriptor),包含了主存地址和大小。由於網卡只認識物理地址,所以驅動還需將虛擬地址轉換成物理地址,之後把send descriptor放到Tx ring之中。下一步通過通知網卡有新的數據了,之後網卡通過DMA(直接內存訪問)獲取元數據和數據發送出去。發送完之後通過DMA把結果寫回,之後發送中斷通知。

數據的接收和發送反推過程差不多,自己看圖:


一篇文章告訴你:Linux 網絡驅動,網卡原理,它們之間怎麼交互?


不多說了,自己看圖也能理解了。

本片文章內容非常精簡,但不代表知識量少,大家可能也發現了源理君的文章篇幅不是很長,但會把知識講清楚、明白。

相關推薦

推薦中...