我們知道,Linux下的驅動分爲字符設備驅動、塊設備驅動和網絡設備驅動,網絡設備是通過socket通信實現對數據的接收和傳遞,並不會像字符設備一樣會打開某一個文件。網絡設備驅動中包含着對網卡等內部比較複雜的硬件操作和各種協議,所以現在暫時還實現不了像之前字符設備塊設備一樣從頭到尾對着某個網卡來寫一個完整的驅動程序,現在就構造一個虛擬網卡,重點是弄清楚網卡驅動的基本框架.
網卡驅動在系統中的框架如圖:
如圖所示,應用程序通過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(例子主要是爲了弄清楚框架,並不能實現真正的網卡功能)
測試該驅動程序: