網卡驅動程序

    我們知道,Linux下的驅動分爲字符設備驅動、塊設備驅動和網絡設備驅動,網絡設備是通過socket通信實現對數據的接收和傳遞,並不會像字符設備一樣會打開某一個文件。網絡設備驅動中包含着對網卡等內部比較複雜的硬件操作和各種協議,所以現在暫時還實現不了像之前字符設備塊設備一樣從頭到尾對着某個網卡來寫一個完整的驅動程序,現在就構造一個虛擬網卡,重點是弄清楚網卡驅動的基本框架.

網卡驅動在系統中的框架如圖:

wKioL1aPwZ-S-Q2wAACmpOI2aSA123.png

如圖所示,應用程序通過socket編程需要實現網絡包的發送和接收,需要發送的消息內容需要經過若干層網絡協議的包裝,構造成一個sk_buff結構體,再由驅動程序中的hard_start_xmit函數發送出去,接包時則是使用驅動程序中對應的netif_rx函數。

怎麼寫網卡驅動程序?

a. 分配一個net_device結構體

b. 設置:

(1) 發包函數: hard_start_xmit

(2) 收到數據時(在中斷處理函數裏)用netif_rx上報數據

(3) 其他設置

c. 註冊: register_netdevice

程序的框架還是挺簡單的,重點和難點在於對網卡的硬件設置和協議(此略)。

例子:構造一個虛擬網卡,實現ping通同一網段的ip(例子主要是爲了弄清楚框架,並不能實現真正的網卡功能)

wKioL1aPw93Dn_CqAAJTQxwWr48396.png

wKiom1aPw-XgTXYXAAFJCfn9dCg506.png

測試該驅動程序:

  1. 裝載驅動程序

  2. ifconfig查看網卡信息

  3. 用ifconfig vir0 2.2.2.2構造一個虛擬網卡,通過ifconfig命令即可看到比之前多了一個vir0網卡

  4. 通過ping 2.2.2.3可以ping通,並且看到hard_start_xmit被調用。

  5. wKioL1aPxNWBGzomAABgHQxOvo4848.png

    wKiom1aPxLvzAx-WAAAhmYsUtfA146.png

    注意:如果驅動程序中沒有實現對應的hard_start_xmit函數,則當ping同一網段的ip時,系統會被卡死。通過實現的net_device結構體中對應成員,還可以實現設置mask地址、顯示發送/接收包的數量。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章