Linux素來以其強大的網絡功能著名,同時, 網絡設備也作為三大設備之一, 成為Linux驅動學習中必不可少的設備類型, 此外, 由于歷史原因, Linux并沒有強制對網絡設備貫徹其"一切皆文件"的思想, 網絡設備不以/dev下的設備文件為接口,用戶程序通過socket作為訪問硬件的接口。本文以Linux3.14.0內核為例, 討論Linux中的網絡驅動模型
Linux的網絡設備并不使用文件作為用戶程序訪問網絡設備的接口,所以/sys/dev下和/dev下并沒有相應的網絡設備文件,在Linux中,用戶程序最終使用套接字來訪問網絡設備。
框架
上圖就是經典的OSI 7層模型,Linux的網卡驅動程序處于OSI模型中的數據鏈路層,他的職責就是將上上層的協(xié)議棧傳過來的信息通過網卡發(fā)送出去,\
Linux的網絡驅動模型采用4層結構:
協(xié)議接口層 向網絡協(xié)議提供統(tǒng)一的數據包發(fā)送接口,上層任何形式的協(xié)議都通過dev_queue_xmit()發(fā)送,通過netif_rx()接收,都使用sk_buff作為數據的載體
設備接口層向協(xié)議接口層提供統(tǒng)一的用于描述具體網絡設備屬性和操作的結構體net_device,這個結構從整體規(guī)劃了具體操作硬件的設備驅動功能層的結構,是設備驅動功能層的各個函數的容器,開發(fā)網絡驅動的主要工作就是編寫驅動功能層的相關函數以填充net_device數據結構的內容并將net_device注冊到內核
驅動功能層的各個函數是網絡設備接口層net_device數據結構的具體成員,是驅動 網絡設備硬件完成相應動作的程序,它通過ndo_start_xmit()函數啟動發(fā)送動作,并通過網絡設備上的中斷觸發(fā)接收操作,通過中斷或POLL機制接收
設備與媒介層 是完成數據收發(fā)的物理實體,網卡被設備驅動層中的函數在物理上驅動,對于Linux系統(tǒng)而言,網絡設備和媒介都可以是虛擬的
第2 and 第3層是驅動開發(fā)主要關心的層次
核心類與方法簡述
在分析核心對象與核心方法的時候, 找到在哪向上提供接口, 在哪向下操作硬件.????
核心類
sk_buff是網絡驅動框架中信息的載體, 是網絡分層模型中對數據進行層層打包以及層層解包的載體
net_device對象描述了一個網絡設備, **其中的struct net_device_ops *netdev