一、網路驅動程序:
使用net_device描述設備,使用套接字描述符sk_buff封裝數據。
二、設備的註冊:
alloc_ethdev分配net_device結構和私有的數據區、並初始化以太網設備結構、標誌、硬件地址、初始化緩衝區描述符、申請中斷號並註冊中斷處理函數,最後向全局網絡設備鏈表添加初始化後的網絡設備。
三、數據的發送:
1.內核發送數據包的時候,使用套接字sk_buff作爲參數,調用驅動的ndo_start_xmit發送函數,套接字包含有要傳輸數據的指針和數據的長度、以及網絡子系統已經添加的軟件和硬件協議頭(tcp、ip、以太網頭),IP協議頭是14個字節,爲了對齊,一般分配16個字節。
2.然後通過DMA映射,將數據傳到網絡設備的設備內存。
3.最後硬件邏輯通過RJ45接口將數據發送出去。
4.網卡在成功發送數據時候引發中斷,在中斷處理函數中,釋放網絡子系統傳遞給驅動程序的套接字緩衝區sk_buff,並更新接口數據統計結構。
四、數據的接收:
1.數據到達時,網卡通過更新放在特定位置的緩衝區描述符,從而告知所接收到數據的長度和地址,並引發中斷。
2.中斷處理函數,會禁止中斷,並進入輪詢模式。
3.輪詢函數會在原子上下文,分配套接字sk_buff來容納接收到的數據,並刪除硬件頭,添加校驗和,數據類型,協議號等信息。
4.然後調用網絡子系統的接收函數,將套接字sk_buff傳給網絡子系統,網絡子系統的接收函數運行在軟件中斷上下文,使用了頂半部和底半部機制,並負責釋放驅動分配的套接字結構。
五、中斷函數:
1.讀設備狀態的寄存器,區分中斷的類型是發送成功、接收到數據包、還是發生錯誤。
2.發送,釋放sk_buff,更新接口數據統計統計結構。
3.接收,禁止中斷,進入輪詢模式。
六、性能優化:
DMA直接內存訪問和輪詢模式。