Linux素來以其強(qiáng)大的網(wǎng)絡(luò)功能著名,同時(shí), 網(wǎng)絡(luò)設(shè)備也作為三大設(shè)備之一, 成為Linux驅(qū)動(dòng)學(xué)習(xí)中必不可少的設(shè)備類型, 此外, 由于歷史原因, Linux并沒有強(qiáng)制對(duì)網(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è)備。

框架

萬碼學(xué)堂,電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),Java培訓(xùn),JavaEE開發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)

上圖就是經(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注冊(cè)到內(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),對(duì)于Linux系統(tǒng)而言,網(wǎng)絡(luò)設(shè)備和媒介都可以是虛擬的

第2 and 第3層是驅(qū)動(dòng)開發(fā)主要關(guān)心的層次

核心類與方法簡述

在分析核心對(duì)象與核心方法的時(shí)候, 找到在哪向上提供接口, 在哪向下操作硬件.????

核心類