天天看點

DM9000網卡裝置驅動程式中資料發送過程分析

在Linux核心中,核心為支援的網絡裝置提供了一套公共接口,使用該接口可以管理一個網卡裝置,編寫驅動程式時不需要考慮網絡資料傳輸的協定,對資料的解析和包裝皆由協定層處理,驅動程式實作底層的硬體操作接口,提供給上層調用(發送資料過程),接收資料過程在中斷函數中用硬體操作(寄存器讀寫)的方式讀網卡晶片裡面的資料,送出給上層後,核心就會自動處理好,發送給應用程式。

資料發送過程:以DM9000網卡為例:

        -應用程式sento()發送一個UDP資料

        --調用核心空間的 sock_writev()函數

        ---sock_sendmsg()函數處理

        ----調用inet_sendmsg()函數處理

        -----要發送的資料交給傳輸層的 udp_sendmsg()函數處理

        --------udp_sendmsg()函數在資料前加入UDP頭,把資料交給 ip_build_xmit()函數處理

        ---------ip_build_xmit根據 socket提供的目的 IP和端口資訊構造IP頭

        ----------調用 output_maybe_reroute()函數處理,檢查資料包是否需要經過路由

        -----------交給 ip_output()函數寫入到發送隊列

        ------------由 ip_finish_output()函數處理後續工作

        -------------鍊路層的 dev_queue_xmit()函數處理發送隊列

        --------------調用 DM9000網卡的發送資料包函數 dm9000_xmit()

        ---------------調用 dm9000_xmit_done函數處理發送結果

使用者程式sento()系統調用經過不同層次的調用後, 最終執行統一的接口,不過這個接口需要驅動程式根據具體的裝置實作硬體的操作,網卡裝置結構體的注冊,為系統調用接口的查找提供了“線索”。

資料發送結束後,會進入中斷函數,判斷是否還有資料包要發送,開啟發送隊列。該中斷函數與接收資料的中斷函數是同一個中斷。

繼續閱讀