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