嵌入式系統(tǒng)以太網(wǎng)接口設(shè)計(jì)附linux內(nèi)核網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)_第1頁(yè)
嵌入式系統(tǒng)以太網(wǎng)接口設(shè)計(jì)附linux內(nèi)核網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)_第2頁(yè)
嵌入式系統(tǒng)以太網(wǎng)接口設(shè)計(jì)附linux內(nèi)核網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)_第3頁(yè)
已閱讀5頁(yè),還剩8頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、嵌入式系統(tǒng)地以太網(wǎng)接口設(shè)計(jì)及l(fā)inux驅(qū)動(dòng)1以太網(wǎng)概述以太網(wǎng)(Ethernet)是當(dāng)今局域網(wǎng)采用地最通用地通信協(xié)議標(biāo)準(zhǔn).在以太網(wǎng)中, 所有計(jì)算機(jī)被連接在一條電纜上,采用帶沖突檢測(cè)地載波偵聽(tīng)多路訪(fǎng)問(wèn)(CSMA/CD) 方法,采用競(jìng)爭(zhēng)機(jī)制和總線(xiàn)拓?fù)浣Y(jié)構(gòu).基本上,以太網(wǎng)由共享傳輸媒體,如雙絞線(xiàn) 電纜或同軸電纜、多端口集線(xiàn)器、網(wǎng)橋或交換機(jī)構(gòu)成按照 OSI(Open System Interconnection Referenee Model,開(kāi)放式系統(tǒng)互聯(lián)參考模型)7層參考模型,以太網(wǎng)定義地是物理層(PHY)和數(shù)據(jù)鏈路層(對(duì)應(yīng)以 太網(wǎng)地MACg)地標(biāo)準(zhǔn).2嵌入式處理器上擴(kuò)展以太網(wǎng)接口以太網(wǎng)接口控制器主

2、要包括 MAC乘PHYS部分,如圖1所示為嵌入式處理器 集成MAC!控制器.MACg控制器和PHY地連接是通過(guò)Mil、RMII等接口實(shí)現(xiàn)地.在IEEE802地 標(biāo)準(zhǔn)系列中,數(shù)據(jù)鏈路層包括LLC和MACS個(gè)子層其中MA(負(fù)責(zé)完成數(shù)據(jù)幀地封 裝、解封、發(fā)送和接受功能.PHY層地結(jié)構(gòu)隨著傳輸速率地不同而有一定地差異. 對(duì)于lOBaseT等網(wǎng)絡(luò),從以太網(wǎng)PHY芯片輸出地就是傳輸所需地差分信號(hào).但是還 需要一個(gè)網(wǎng)絡(luò)隔離變壓器組成圖2地結(jié)構(gòu).網(wǎng)絡(luò)隔離變壓器可起到抑制共模干 擾、隔離線(xiàn)路以及 阻抗匹配等作用本文介紹一種新款網(wǎng)絡(luò)接口芯片 DM9000A它可以很方便地實(shí)現(xiàn)與嵌入式 CPU地接口 ,實(shí)現(xiàn)擴(kuò)展以太網(wǎng)

3、口地功能.DM9000A是中國(guó)臺(tái)灣DAVICO公司推出地 一款高速以太網(wǎng)接口芯片,其基本特征是:集成10/100M物理層接口;內(nèi)部帶有 16K字節(jié)SRAMB作接收發(fā)送地FIFO緩存;支持8/16bit兩種主機(jī)工作模式:通 過(guò)HP認(rèn)證地AUTO-Mdix支持直接互連自動(dòng)翻轉(zhuǎn))功能;支持TCP/IP加速,減輕 CPU負(fù)擔(dān),提高整機(jī)效能;10ns I/O讀寫(xiě)時(shí)間.DM9000A以太網(wǎng)控制器遵循IEEE 頒布地802.3以太網(wǎng)傳輸協(xié)議.該電路還集成了 EEPRO接口,自舉時(shí)通過(guò)EEPROM 接口輸入到芯片中 , 從而實(shí)現(xiàn)自動(dòng)初始化 .芯片和處理器地連接原理圖就不列圖表示了 , 處理器這里選擇AT91R

4、M9200,DM900(與處理器連接時(shí)要注意:總線(xiàn)寬度讀/寫(xiě)等待周期、時(shí)序匹配問(wèn)題 CS8900A芯片復(fù)位后,在總線(xiàn)上地默認(rèn)地址如何配置與保存默認(rèn)地中斷號(hào)及中斷觸發(fā)模式問(wèn)題 ( 上升沿, 還是下降沿;低電平 , 還是高 電平觸發(fā))系統(tǒng)上電時(shí),AT91RM920通過(guò)總線(xiàn)配置DM9000A內(nèi)部網(wǎng)絡(luò)控制寄存器(NCR)、 中斷寄存器(ISR)等,完成DM9000A地初始化.隨后QM9000A進(jìn)入數(shù)據(jù)收發(fā)等待狀 態(tài).當(dāng)AT91RM920向以太網(wǎng)發(fā)送數(shù)據(jù)時(shí),先將數(shù)據(jù)打包成UDP或 IP數(shù)據(jù)包,并通 過(guò)16 bit總線(xiàn)發(fā)送到DM9000A地?cái)?shù)據(jù)發(fā)送緩存中,然后將數(shù)據(jù)長(zhǎng)度等信息填充到 DM9000A地相應(yīng)寄

5、存器內(nèi),使能發(fā)送.當(dāng)DM9000A接收到外部網(wǎng)絡(luò)送來(lái)地以太網(wǎng)數(shù) 據(jù)時(shí),首先檢測(cè)數(shù)據(jù)幀地合法性,如果幀頭標(biāo)志有誤或存在CRC校驗(yàn)錯(cuò)誤,則將該 幀數(shù)據(jù)丟棄.否則將數(shù)據(jù)幀緩存到內(nèi)部RAM并通過(guò)中斷標(biāo)志位通知AT91RM9200, 由AT91RM920對(duì)DM9000AS收到地?cái)?shù)據(jù)進(jìn)行處理.3 linux 網(wǎng)絡(luò)驅(qū)動(dòng)程序3.1 Linux 網(wǎng)絡(luò)驅(qū)動(dòng)程序體系結(jié)構(gòu)Linux地網(wǎng)絡(luò)系統(tǒng)主要是基于BSDUNIX地套接字(socket)機(jī)制.在系統(tǒng)和驅(qū) 動(dòng)程序之間定義有專(zhuān)門(mén)地?cái)?shù)據(jù)結(jié)構(gòu) (sk_buff) 進(jìn)行數(shù)據(jù)傳輸 . 系統(tǒng)支持對(duì)發(fā)送數(shù) 據(jù)緩存, 提供流量控制機(jī)制 , 提供對(duì)多協(xié)議地支持 .Linux 網(wǎng)絡(luò)驅(qū)動(dòng)程

6、序地體系結(jié) 構(gòu)可劃分為圖2所示地4個(gè)層次.Linux內(nèi)核中提供了網(wǎng)絡(luò)設(shè)備接口及以上層次 地代碼, 所以移植(或編寫(xiě) )特定網(wǎng)絡(luò)硬件地驅(qū)動(dòng)程序最主要地工作就是完成設(shè)備 驅(qū)動(dòng)功能層 , 主要是包括數(shù)據(jù)地接收 , 發(fā)送等控制 .dev qitcuc xmiH)initdli/c cpcn、ck)!ic- bard_xmi< config' tniemipt handkr > resources-別血 等方法網(wǎng)絡(luò)設(shè)毎接口層發(fā)送敷據(jù)包到碩件 hard. $tart 5m rt()中虧處理 從饋件摟收數(shù)據(jù)包設(shè)備食動(dòng)功能層備媒弁圏2 Linux網(wǎng)堵設(shè)務(wù)張功程序的定探Linux中所有地網(wǎng)絡(luò)

7、設(shè)備都抽象為一個(gè)接口 ,有結(jié)構(gòu)體struct net_device 來(lái)表示網(wǎng)絡(luò)設(shè)備在內(nèi)核中地運(yùn)行情況,即網(wǎng)絡(luò)設(shè)備接口,此結(jié)構(gòu)體位于網(wǎng)絡(luò)驅(qū)動(dòng) 層地核心地位.net_device中有很多供系訪(fǎng)問(wèn)和協(xié)議層調(diào)用地設(shè)備方法.網(wǎng)絡(luò)驅(qū) 動(dòng)就是要實(shí)現(xiàn)這些具體地設(shè)備方法3.2網(wǎng)絡(luò)設(shè)備地初始化由結(jié)構(gòu)體net_device中地init函數(shù)指針?biāo)赶虻爻跏蓟瘮?shù)來(lái)完成.網(wǎng)絡(luò) 地初始化是設(shè)備工作地第一步.當(dāng)系統(tǒng)加載網(wǎng)絡(luò)驅(qū)動(dòng)模塊地時(shí)候,就會(huì)調(diào)用初始 化過(guò)程.首先利用函數(shù):request_mem_region映射DM9000A地?cái)?shù)據(jù)、地址端口, 通過(guò)dmfe_probe函數(shù)檢測(cè)網(wǎng)絡(luò)物理設(shè)備是否存在,檢測(cè)DM9000A內(nèi)部串

8、行NIC 地值是否正確,然后再對(duì)設(shè)備進(jìn)行資源配置,構(gòu)造設(shè)備地net_device數(shù)據(jù)結(jié)構(gòu). 包括一些低層硬件信息:base_addr(網(wǎng)絡(luò)接口地I/O基地址),irq(安排地中斷號(hào))3.3打開(kāi)設(shè)備和關(guān)閉設(shè)備open方法在網(wǎng)絡(luò)設(shè)備被激活地時(shí)被調(diào)用,具體DM9000地硬件初始化工作放 到這里來(lái)做.對(duì)于DMOO0需要完成地初始化包括:對(duì)DM9000A內(nèi)部上電,軟件復(fù) 位,通過(guò)NCF寄存器設(shè)置網(wǎng)絡(luò)工作模式,可以選擇設(shè)置內(nèi)部或者外部 PHY全雙工 或者半雙工模式、使能喚醒事件等網(wǎng)絡(luò)操作,對(duì)RX/TX中斷使能,使能數(shù)據(jù)接收功 能.調(diào)用request_jrq() 申請(qǐng)中斷號(hào)登記中斷處理函數(shù),調(diào)用netif_

9、carrier_on 偵測(cè)連接狀態(tài).啟動(dòng)定時(shí)器,調(diào)用netif_start_queue激活設(shè)備發(fā)送隊(duì)列.這里對(duì)DM9000A地中斷設(shè)計(jì)做了一個(gè)特殊處理:通常 AT91RM920提供最多 32個(gè)中斷源,默認(rèn)提供7個(gè)外部中斷源,但對(duì)于較復(fù)雜地嵌入式系統(tǒng),可能會(huì)面臨 中斷源不夠用地情況由于AT9IRM920哋PIO可以實(shí)現(xiàn)功能復(fù)用,因此可以把多 余地IO引腳配置為可用地中斷源.故本系統(tǒng)中,設(shè)計(jì)DM9000A中斷源與 AT91RM920外部I/O 口 PD8引腳相連.一個(gè)PIO端口地32個(gè)引腳共享一個(gè)中斷 ID, 只需要在中斷狀態(tài)寄存器中區(qū)分具體哪個(gè)引腳引起中斷 , 然后轉(zhuǎn)向特定地中 斷處理函數(shù)執(zhí)行操

10、作,就可以實(shí)現(xiàn)中斷處理.close所做地工作和open相反,主要 釋放 open 獲得地資源 , 以減少系統(tǒng)負(fù)擔(dān) .3.4 數(shù)據(jù)包發(fā)送數(shù)據(jù)包地發(fā)送和接收是實(shí)現(xiàn) Linux 網(wǎng)絡(luò)驅(qū)動(dòng)程序中兩個(gè)最關(guān)鍵地過(guò)程 , 對(duì)這 兩個(gè)過(guò)程處理地好壞將直接影響到驅(qū)動(dòng)程序地整體運(yùn)行質(zhì)量 .數(shù)據(jù)傳輸通過(guò) hard_start_xmit 函數(shù)實(shí)現(xiàn) , 首先把存放在套接字緩沖區(qū)中地 數(shù)據(jù)發(fā)送到網(wǎng)絡(luò)芯片DM9000AS部地TX FIFO SRAI中,該緩沖區(qū)是由數(shù)據(jù)結(jié)構(gòu) sk buff表示,把要傳送地?cái)?shù)據(jù)長(zhǎng)度寫(xiě)入DM9000A中地傳輸包長(zhǎng)度寄存器TXPLL 和TXPLH中.然后使能傳輸.如果數(shù)據(jù)發(fā)送成功,則會(huì)觸發(fā)一次中斷

11、實(shí)際中會(huì)出 現(xiàn)多個(gè)數(shù)據(jù)幀傳輸 , 需要考慮做并發(fā)處理 . 在發(fā)送時(shí)檢測(cè)傳輸隊(duì)例暫時(shí)滿(mǎn)載時(shí)就 要通過(guò) netif_stop_queue 來(lái)暫停, 當(dāng)發(fā)送完成觸發(fā)中斷處理時(shí) , 調(diào)用 netif_wake_queue 函數(shù)來(lái)重新啟動(dòng)傳輸隊(duì)例 . 網(wǎng)絡(luò)傳輸由于系統(tǒng)忙或硬件地問(wèn) 題發(fā)生延遲 , 則會(huì)調(diào)用傳送超時(shí)處理函數(shù) tx_timeout, 對(duì)硬件復(fù)位操作 .3.5 數(shù)據(jù)包接收數(shù)據(jù)包地接收是通過(guò)中斷處理 , 當(dāng)有數(shù)據(jù)到達(dá)時(shí) , 就產(chǎn)生中斷信號(hào) , 網(wǎng)絡(luò)設(shè)備 驅(qū)動(dòng)功能層就調(diào)用數(shù)據(jù)包接收程序來(lái)處理數(shù)據(jù)包地接收 , 然后網(wǎng)絡(luò)協(xié)議接口層調(diào) 用 netif_rx 函數(shù)把接收到地?cái)?shù)據(jù)包傳輸?shù)骄W(wǎng)絡(luò)協(xié)議地上層進(jìn)行處

12、理 .DM9000A接收緩存區(qū)中地每幀數(shù)據(jù)由4字節(jié)長(zhǎng)地首部、有效數(shù)據(jù)和CRC校驗(yàn) 序列構(gòu)成首部4字節(jié)依次是01H以太網(wǎng)幀狀態(tài)、以太網(wǎng)幀長(zhǎng)度低字節(jié)和長(zhǎng)度 高字節(jié),數(shù)據(jù)包接收程序首先檢測(cè)如果第一個(gè)字節(jié)是01H,則說(shuō)明有數(shù)據(jù);如果是00H,則說(shuō)明無(wú)數(shù)據(jù),需要進(jìn)行復(fù)位.然后調(diào)用函數(shù)dev_alloc_skb申請(qǐng)一塊 sK_buff結(jié)構(gòu)緩沖區(qū),從DM9000讀出數(shù)據(jù)放置到緩沖區(qū)里,根據(jù)獲取地長(zhǎng)度信息, 判斷是否讀完一幀如果讀完,接著讀下一幀,直到遇到首字節(jié)是00H地幀,說(shuō)明 接收數(shù)據(jù)已讀完 . 接下來(lái)填充 sK_buff 中地一些信息 , 使之成為規(guī)范地 sk_buff 結(jié)構(gòu), 最后調(diào)用 netif_r

13、x() 函數(shù)將接收到地?cái)?shù)據(jù)傳輸?shù)骄W(wǎng)絡(luò)協(xié)議地上層 .最后 , 可通過(guò)兩種方法加載網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序:系統(tǒng)內(nèi)核加載和模塊加載 .4 網(wǎng)絡(luò)地應(yīng)用及測(cè)試通過(guò)讀取 procnet 中地信息得到當(dāng)前系統(tǒng)中地網(wǎng)絡(luò)設(shè)備 , 通過(guò)它來(lái)測(cè) 試:#cat procnet devLinux 網(wǎng)絡(luò)配置可在應(yīng)用程序中通過(guò) ifconfig 和 router 兩個(gè)命令實(shí)現(xiàn) , 它 們都可以在busybox軟件包中找到.可用以下命令來(lái)配置ip、網(wǎng)關(guān)、子網(wǎng)掩碼和 域名解析服務(wù)器:# route add -net default gw 54 n etmask 255.255.255 .0#最后,通過(guò)Ping命

14、令,來(lái)測(cè)試一下和主機(jī)地通信是否聯(lián)通.在本系統(tǒng)中通過(guò).在嵌入式應(yīng)用程序開(kāi)發(fā)及調(diào)試中,NFS起著非常重要地應(yīng)用.不但可以通過(guò) NFS文件系統(tǒng)共享遠(yuǎn)程硬盤(pán)地文件,我們還可以mount遠(yuǎn)程文件系統(tǒng)直接作為嵌 入式地根文件系統(tǒng).5結(jié)論本文完成了 Linux下擴(kuò)展以太網(wǎng)接口及測(cè)試網(wǎng)絡(luò)接口地研究,采用了以太網(wǎng) 芯片DM9000圍繞太分析了嵌入式Linux 網(wǎng)絡(luò)地基本原理.最后我地嵌入式設(shè) 備順利連上網(wǎng)絡(luò).同時(shí)本文為移植2.6內(nèi)核地網(wǎng)絡(luò)部分提供了移植方法.淺談Linux內(nèi)核開(kāi)發(fā)之網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)趙 昊翔,軟件工程師,Cisco Systems簡(jiǎn)介:本文介紹了網(wǎng)絡(luò)設(shè)備地基本概念 ,并從Linux內(nèi)核地角度出發(fā),介紹

15、了網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)地開(kāi)發(fā)方法和開(kāi) 發(fā)中地注意事項(xiàng).網(wǎng)絡(luò)設(shè)備介紹網(wǎng)絡(luò)設(shè)備是計(jì)算機(jī)體系結(jié)構(gòu)中必不可少地一部分,處理器如果想與外界通信,通常都會(huì)選擇網(wǎng)絡(luò)設(shè)備作為通信接口 .眾所周知,在OSI (Open Systems Interconnection,開(kāi)放網(wǎng)際互連)中,網(wǎng)絡(luò)被劃分為七個(gè)層次,從下到上分別是物理層、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層、會(huì)話(huà)層、表示層和應(yīng)用層.我們所講地網(wǎng)絡(luò)設(shè)備也包括兩個(gè)層次,一層叫做 MAC( Media Access Control )層,對(duì)應(yīng)于 OSI地?cái)?shù)據(jù)鏈路層;另一層叫做PHY(Physical Layer )層,對(duì)應(yīng)于物理層.常用地網(wǎng)絡(luò)設(shè)備有很多,比如PPC85XX 地T

16、SEC、AMCC 440GX 地EMAC、INTEL地82559等,它們 地工作原理基本相同.DMA介紹網(wǎng)絡(luò)設(shè)備地核心處理模塊是一個(gè)被稱(chēng)作DMA( Direct Memory Access )地控制器,DMA模塊能夠協(xié)助處理器處理數(shù)據(jù)收發(fā).對(duì)于數(shù)據(jù)發(fā)送來(lái)說(shuō),它能夠?qū)⒔M織好地?cái)?shù)據(jù)自動(dòng)發(fā)岀,無(wú)需處理器干預(yù);對(duì)于數(shù)據(jù)接收來(lái) 說(shuō),它能夠?qū)⑹盏降財(cái)?shù)據(jù)以一定地格式組織起來(lái),通知處理器,并等待處理器來(lái)取.DMA模塊收發(fā)數(shù)據(jù)地單元被稱(chēng)為BD ( Buffer Description,緩存描述符),每個(gè)包都會(huì)被分成若干個(gè)幀,而每個(gè)幀則被保存在一個(gè)BD中.BD結(jié)構(gòu)通常包含有以下字段:typedef struct

17、void *bufptr; /*保存當(dāng)前BD對(duì)應(yīng)緩存地起始地址*/int length; /*保存緩存中存儲(chǔ)地?cái)?shù)據(jù)包長(zhǎng)度*/int sc;/*保存當(dāng)前BD地狀態(tài)信息*/ BD_STRUCT;所有地BD就組成了一張 BD表,如圖1所示,一般來(lái)說(shuō)發(fā)送方向和接收方向地BD表是各自獨(dú)立地圖1. BD表結(jié)構(gòu)BD 左BUFFER數(shù)據(jù)發(fā)送流程網(wǎng)絡(luò)設(shè)備通過(guò) DMA進(jìn)行數(shù)據(jù)發(fā)送地流程如 圖2所示.圖2.數(shù)據(jù)發(fā)送流程圖中各步驟地具體含義描述如下:(1) 協(xié)議層通知處理器開(kāi)始發(fā)送數(shù)據(jù);(2 )處理器從 BD表中取岀一個(gè) BD,將需要發(fā)送地?cái)?shù)據(jù)拷貝至當(dāng)前BD對(duì)應(yīng)地緩存內(nèi),并設(shè)置好BD地狀態(tài);(3 )處理器通知網(wǎng)絡(luò)設(shè)備

18、開(kāi)始發(fā)送數(shù)據(jù);(4) MAC模塊通知DMA單元開(kāi)始發(fā)送數(shù)據(jù);(5) DMA 模塊操作 BD 表,取出當(dāng)前有效 BD ;(6) DMA模塊將當(dāng)前 BD對(duì)應(yīng)緩存內(nèi)地?cái)?shù)據(jù)發(fā)送至 MAC模塊;(7) MAC模塊將這些數(shù)據(jù)發(fā)送到網(wǎng)絡(luò)中;(8 )網(wǎng)絡(luò)設(shè)備通知處理器數(shù)據(jù)發(fā)送完畢;(9 )處理器通知協(xié)議層發(fā)送下面一幀數(shù)據(jù).其中步驟(4) ( 8)是硬件自動(dòng)完成地,不需要軟件地干預(yù),如此可以節(jié)省處理器地工作量 .數(shù)據(jù)接收流程網(wǎng)絡(luò)設(shè)備通過(guò) DMA進(jìn)行數(shù)據(jù)接收地流程如圖 3所示.圖3.數(shù)據(jù)接收流程圖中各步驟地具體含義描述如下:(1 )處理器初始化 BD表;(2) 處理器初始化網(wǎng)絡(luò)設(shè)備;(3) MAC模塊從網(wǎng)絡(luò)中接收

19、數(shù)據(jù);(4) MAC模塊通知 DMA模塊來(lái)取數(shù)據(jù);(5) DMA模塊從 BD表中取出合適地 BD ;(6) MAC模塊將數(shù)據(jù)發(fā)送至當(dāng)前 BD對(duì)應(yīng)地緩存內(nèi);(7) 網(wǎng)絡(luò)設(shè)備通知處理器開(kāi)始接收數(shù)據(jù)(以中斷方式或輪詢(xún)方式);(8 )協(xié)議層從當(dāng)前地 BD緩存內(nèi)取走數(shù)據(jù).其中步驟(3) ( 6)是硬件自動(dòng)完成地,不需要軟件地干預(yù),如此可以節(jié)省處理器地工作量回頁(yè)首Lin ux網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)模型數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)Linux內(nèi)核中對(duì)網(wǎng)絡(luò)設(shè)備進(jìn)行描述地核心結(jié)構(gòu)類(lèi)型叫做net_device,net_device結(jié)構(gòu)定義在include/linux/netdevice.h 文件中.該結(jié)構(gòu)地字段可以分為以下幾類(lèi)全局信息該

20、類(lèi)中包含了設(shè)備名(name字段)、設(shè)備狀態(tài)(state字段)、設(shè)備初始化函數(shù)(init字段)等. 硬件信息該類(lèi)中包含了設(shè)備內(nèi)存使用情況(mem_end和mem_start字段)、中斷號(hào)(irq字段)、10基地址(base_addr 字段)等.接口信息該類(lèi)中包含了 MAC地址(dev_addr字段)、設(shè)備屬性(flag字段)、最大傳輸單元(mtu字段)等. 設(shè)備接口函數(shù)該類(lèi)中包含了當(dāng)前設(shè)備所提供地所有接口函數(shù)比如設(shè)備打開(kāi)函數(shù)(open字段),該函數(shù)負(fù)責(zé)打開(kāi)設(shè)備接口當(dāng)用戶(hù)使用ifconfig命令配置網(wǎng)絡(luò)時(shí),該函數(shù)默認(rèn)被調(diào)用;設(shè)備停止函數(shù)( stop字段),該函數(shù)負(fù)責(zé)關(guān)閉設(shè) 備接口;數(shù)據(jù)發(fā)送函數(shù)(h

21、ard_start_xmit字段),當(dāng)用戶(hù)調(diào)用socket開(kāi)始寫(xiě)數(shù)據(jù)時(shí),該函數(shù)被調(diào)用,并負(fù)責(zé) 往網(wǎng)絡(luò)設(shè)備中發(fā)送數(shù)據(jù).函數(shù)接口設(shè)備初始化函數(shù)網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)在 Linux內(nèi)核中是以?xún)?nèi)核模塊地形式存在地,對(duì)應(yīng)于模塊地初始化,需要提供一個(gè)初始化函數(shù) 來(lái)初始化網(wǎng)絡(luò)設(shè)備地硬件寄存器、配置DMA以及初始化相關(guān)內(nèi)核變量等設(shè)備初始化函數(shù)在內(nèi)核模塊被加 載時(shí)調(diào)用,它地函數(shù)形式如下:static int _init xx_init (void) module_init(xx_init); /這句話(huà)表明模塊加載時(shí)自動(dòng)調(diào)用xx_init 函數(shù)設(shè)備初始化函數(shù)主要完成以下功能:1. 硬件初始化因?yàn)榫W(wǎng)絡(luò)設(shè)備主要分為PHY、MA

22、C和DMA三個(gè)硬件模塊,開(kāi)發(fā)者需要分別對(duì)這三個(gè)模塊進(jìn)行初始化.1. 初始化PHY模塊,包括設(shè)置雙工/半雙工運(yùn)行模式、設(shè)備運(yùn)行速率和自協(xié)商模式等2. 初始化MAC模塊,包括設(shè)置設(shè)備接口模式等.3. 初始化DMA模塊,包括建立BD表、設(shè)置BD屬性以及給 BD分配緩存等.2. 內(nèi)核變量初始化初始化并注冊(cè)內(nèi)核設(shè)備.內(nèi)核設(shè)備是屬性為 net_device地一個(gè)變量,開(kāi)發(fā)者需要申請(qǐng)?jiān)撟兞繉?duì)應(yīng)地空間(通 過(guò)alloc_netdev函數(shù))、設(shè)置變量參數(shù)、掛接接口函數(shù)以及注冊(cè)設(shè)備(通過(guò)register_netdev 函數(shù)).常用地掛接接口函數(shù)如下:net_device *dev_p;dev_p->open

23、= xx_open; /設(shè)備打開(kāi)函數(shù)dev_p->stop= xx_stop; /設(shè)備停止函數(shù)dev_p->hard_start_xmit = xx_tx; /數(shù)據(jù)發(fā)送函數(shù)dev_p->do_ioctl= xx_ioctl; /其它地控制函數(shù)數(shù)據(jù)收發(fā)函數(shù)數(shù)據(jù)地接收和發(fā)送是網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)最重要地部分,對(duì)于用戶(hù)來(lái)說(shuō),他們無(wú)需了解當(dāng)前系統(tǒng)使用了什么網(wǎng)絡(luò)設(shè)備、網(wǎng)絡(luò)設(shè)備收發(fā)如何進(jìn)行等,所有地這些細(xì)節(jié)對(duì)于用戶(hù)都是屏蔽地.Linux使用socket做為連接用戶(hù)和網(wǎng)絡(luò)設(shè)備地一個(gè)橋梁.用戶(hù)可以通過(guò) read / write等函數(shù)操作socket,然后通過(guò)socket與具體地網(wǎng)絡(luò)設(shè)備進(jìn) 行交互,從

24、而進(jìn)行實(shí)際地?cái)?shù)據(jù)收發(fā)工作.Linux提供了一個(gè)被稱(chēng)為sk_buff地?cái)?shù)據(jù)接口類(lèi)型,用戶(hù)傳給socket地?cái)?shù)據(jù)首先會(huì)保存在sk_buff對(duì)應(yīng)地緩沖區(qū)中,sk_buff地結(jié)構(gòu)定義在include/linux/skbuff.h 文件中.它保存數(shù)據(jù)包地結(jié)構(gòu)示意圖如下所示.圖4. sk_buff 數(shù)據(jù)結(jié)構(gòu)圖二二二=二二二=1. 數(shù)據(jù)發(fā)送流程當(dāng)用戶(hù)調(diào)用socket開(kāi)始發(fā)送數(shù)據(jù)時(shí),數(shù)據(jù)被儲(chǔ)存到了sk_buff類(lèi)型地緩存中,網(wǎng)絡(luò)設(shè)備地發(fā)送函數(shù)(設(shè)備初始化函數(shù)中注冊(cè)地 hard_start_xmit )也隨之被調(diào)用,流程圖如下所示.圖5.數(shù)據(jù)發(fā)送流程圖a. 用戶(hù)首先創(chuàng)建一個(gè)socket,然后調(diào)用write之類(lèi)地

25、寫(xiě)函數(shù)通過(guò)socket訪(fǎng)問(wèn)網(wǎng)絡(luò)設(shè)備,同時(shí)將數(shù)據(jù)保存在sk_buff類(lèi)型地緩沖區(qū)中.b. socket接口調(diào)用網(wǎng)絡(luò)設(shè)備發(fā)送函數(shù)( hard_start_xmit ) ,hard_start_xmit已經(jīng)在初始化過(guò)程中被掛接成類(lèi)似于xx_tx地具體地發(fā)送函數(shù),xx_tx主要實(shí)現(xiàn)如下步驟.1. 從發(fā)送BD表中取出一個(gè)空閑地BD.bd_p->length = skb_p->len;bd_p->bufptr = virt_to_phys(skb_p->data);3. 修改該BD地狀態(tài)為就緒態(tài),DMA模塊將自動(dòng)發(fā)送處于就緒態(tài)BD中所對(duì)應(yīng)地?cái)?shù)據(jù).4. 移動(dòng)發(fā)送BD表地指針指向下一個(gè)

26、 BD.c. DMA模塊開(kāi)始將處于就緒態(tài)BD緩存內(nèi)地?cái)?shù)據(jù)發(fā)送至網(wǎng)絡(luò)中,當(dāng)發(fā)送完成后自動(dòng)恢復(fù)該BD為空閑態(tài).2. 數(shù)據(jù)接收流程當(dāng)網(wǎng)絡(luò)設(shè)備接收到數(shù)據(jù)時(shí),DMA模塊會(huì)自動(dòng)將數(shù)據(jù)保存起來(lái)并通知處理器來(lái)取,處理器通過(guò)中斷或者輪詢(xún)方式發(fā)現(xiàn)有數(shù)據(jù)接收進(jìn)來(lái)后,再將數(shù)據(jù)保存到 sk_buff緩沖區(qū)中,并通過(guò)socket接口讀出來(lái).流程圖如下所 示.圖6.數(shù)據(jù)接收流程圖取朮ma. 網(wǎng)絡(luò)設(shè)備接收到數(shù)據(jù)后,DMA模塊搜索接收 BD表,取出空閑地BD,并將數(shù)據(jù)自動(dòng)保存到該BD地緩存中,修改BD為就緒態(tài),并同時(shí)觸發(fā)中斷(該步驟可選).b. 處理器可以通過(guò)中斷或者輪詢(xún)地方式檢查接收BD表地狀態(tài),無(wú)論采用哪種方式,它們都需要

27、實(shí)現(xiàn)以下步驟.1. 從接收BD表中取出一個(gè)空閑地BD.2. 如果當(dāng)前BD為就緒態(tài),檢查當(dāng)前BD地?cái)?shù)據(jù)狀態(tài),更新數(shù)據(jù)接收統(tǒng)計(jì).3. 從BD中取出數(shù)據(jù)保存在 sk_buff地緩沖區(qū)中.4. 更新BD地狀態(tài)為空閑態(tài).5. 移動(dòng)接收BD表地指針指向下一個(gè) BD.c. 用戶(hù)調(diào)用read之類(lèi)地讀函數(shù),從sk_buff緩沖區(qū)中讀出數(shù)據(jù),同時(shí)釋放該緩沖區(qū)中斷和輪詢(xún)Linux內(nèi)核在接收數(shù)據(jù)時(shí)有兩種方式可供選擇,一種是中斷方式,另外一種是輪詢(xún)方式.中斷方式如果選擇中斷方式,首先在使用該驅(qū)動(dòng)之前,需要將該中斷對(duì)應(yīng)地中斷類(lèi)型號(hào)和中斷處理程序注冊(cè)進(jìn)去.網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)在初始化時(shí)會(huì)將具體地xx_open函數(shù)掛接在驅(qū)動(dòng)地ope

28、n接口上,xx_open函數(shù)掛接中斷地步驟如下.request_irq(rx_irq, xx_isr_rx,);request_irq(tx_irq, xx_isr_tx,);網(wǎng)絡(luò)設(shè)備地中斷一般會(huì)分為兩種,一種是發(fā)送中斷,另一種是接收中斷.內(nèi)核需要分別對(duì)這兩種中斷類(lèi)型號(hào)進(jìn)行注冊(cè).1. 發(fā)送中斷處理程序(xx_isr_tx )地工作主要是監(jiān)控?cái)?shù)據(jù)發(fā)送狀態(tài)、更新數(shù)據(jù)發(fā)送統(tǒng)計(jì)等2. 接收中斷處理程序(xx_isr_rx )地工作主要是接收數(shù)據(jù)并傳遞給協(xié)議層、監(jiān)控?cái)?shù)據(jù)接收狀態(tài)、更 新數(shù)據(jù)接收統(tǒng)計(jì)等.對(duì)于中斷方式來(lái)說(shuō),由于每收到一個(gè)包都會(huì)產(chǎn)生一個(gè)中斷,而處理器會(huì)迅速跳到中斷服務(wù)程序中去處理收包,因此中斷

29、接收方式地實(shí)時(shí)性高,但如果遇到數(shù)據(jù)包流量很大地情況時(shí),過(guò)多地中斷會(huì)增加系統(tǒng)地負(fù)荷.輪詢(xún)方式如果采用輪詢(xún)方式,就不需要使能網(wǎng)絡(luò)設(shè)備地中斷狀態(tài),也不需要注冊(cè)中斷處理程序.操作系統(tǒng)會(huì)專(zhuān)門(mén)開(kāi)啟一 個(gè)任務(wù)去定時(shí)檢查 BD表,如果發(fā)現(xiàn)當(dāng)前指針指向地 BD非空閑,則將該BD對(duì)應(yīng)地?cái)?shù)據(jù)取岀來(lái),并恢復(fù) BD地空閑狀態(tài).由于是采用任務(wù)定時(shí)檢查地原理,從而輪詢(xún)接收方式地實(shí)時(shí)性較差,但它沒(méi)有中斷那種系統(tǒng)上下文切換地開(kāi)銷(xiāo),因此輪詢(xún)方式在處理大流量數(shù)據(jù)包時(shí)會(huì)顯得更加高效回頁(yè)首Lin ux網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)優(yōu)化隨著科技地不斷發(fā)展,網(wǎng)絡(luò)設(shè)備所能承載地速率在不斷提升,當(dāng)前流行地網(wǎng)絡(luò)設(shè)備普遍都能支持10Mbps /100Mbps /

30、1Gbps 這三種速率.雖然網(wǎng)絡(luò)設(shè)備地硬件性能在不斷地提升,但是實(shí)際在Linux系統(tǒng)中其運(yùn)行性能(收發(fā)包速率)真能達(dá)到多達(dá)1Gbps地水平嗎?這和處理器地性能有關(guān),一般來(lái)說(shuō)我們運(yùn)行地系統(tǒng)中報(bào)文地收發(fā)速率是達(dá)不到1Gbps地(因?yàn)槲覀儾豢赡軐⑺刑幚砥鞯刭Y源都貢獻(xiàn)給報(bào)文地收發(fā)),但是我們可以在有限地條件下盡可能地采取一些優(yōu)化手段提高網(wǎng)絡(luò)設(shè)備地運(yùn)行性能Cache地應(yīng)用Cache位于存儲(chǔ)系統(tǒng)金字塔地頂層(下面一層是內(nèi)存),Cache地容量不大(一級(jí)Cache 一般是幾十 KB, 二級(jí)Cache 一般是幾 MB),但是它地訪(fǎng)問(wèn)速率卻是內(nèi)存地幾十倍 .因此如果處理器通過(guò) Cache來(lái)訪(fǎng)問(wèn)內(nèi) 存,將會(huì)極大

31、地提高訪(fǎng)問(wèn)速率.在網(wǎng)絡(luò)設(shè)備地?cái)?shù)據(jù)收發(fā)中,恰當(dāng)?shù)貞?yīng)用 Cache可以?xún)?yōu)化驅(qū)動(dòng)地性能.下面列舉 幾點(diǎn)Cache地優(yōu)化措施.合理設(shè)置內(nèi)存屬性?xún)?nèi)存地頁(yè)表有多種屬性,其中有一項(xiàng)就是是否通過(guò)Cache訪(fǎng)問(wèn).在給BD表配置內(nèi)存時(shí),這些被分配地內(nèi)存屬性需要支持 Cache訪(fǎng)問(wèn).Cache地訪(fǎng)問(wèn)還有兩種方式:一種是寫(xiě)回操作( Write Back ),處理器更新內(nèi)存數(shù)據(jù)時(shí),該數(shù)據(jù)首先保存在 Cache中,Cache并不及時(shí)將數(shù)據(jù)更新進(jìn)內(nèi)存,而是等到 Cache需要再次更新時(shí)才會(huì)將數(shù)據(jù)寫(xiě)回到內(nèi)存 中.另一種是寫(xiě)穿操作(Write Through ),處理器更新內(nèi)存數(shù)據(jù)時(shí),該數(shù)據(jù)首先保存在 Cache中,Cache

32、隨 即將數(shù)據(jù)立刻更新進(jìn)內(nèi)存.顯而易見(jiàn),寫(xiě)回操作地性能比寫(xiě)穿操作更高,通常我們?cè)O(shè)置內(nèi)存頁(yè)表屬性為寫(xiě)回方 式.數(shù)據(jù)收發(fā)時(shí)地 Cache操作在內(nèi)存支持 Cache且采用寫(xiě)回方式地情況下,當(dāng)發(fā)送數(shù)據(jù)時(shí),處理器先將數(shù)據(jù)寫(xiě)進(jìn) Cache,如果DMA模 塊直接從內(nèi)存中取出數(shù)據(jù)發(fā)送地話(huà),該數(shù)據(jù)將與 Cache并不一致,因此在驅(qū)動(dòng)程序中,需要將Cache中地 數(shù)據(jù)更新到內(nèi)存,然后再通知 DMA進(jìn)行發(fā)送.當(dāng)接收數(shù)據(jù)時(shí),DMA模塊會(huì)將數(shù)據(jù)收到內(nèi)存中,如果這時(shí)候處理器從該內(nèi)存接收數(shù)據(jù)地話(huà),處理器會(huì)從Cache中取數(shù)據(jù),但是Cache并不知道內(nèi)存已經(jīng)被更新,這就會(huì)導(dǎo)致接收到地?cái)?shù)據(jù)與實(shí)際不符,因此在驅(qū)動(dòng) 程序中,需要在接收數(shù)據(jù)之前刷新一下該Cache,以保證Cache與內(nèi)存地一致性.需要說(shuō)明地是,并不是所有處理器都需要以上操作,有地處理器所帶地 DMA控制器是能感知 Cache(IO-Cache Coherence )地,它們能夠自動(dòng)進(jìn)行上述地Cache操作,因此對(duì)于這類(lèi)處理器,驅(qū)動(dòng)程序中無(wú)需關(guān)注Cache.中斷還是輪詢(xún)?前面曾經(jīng)介紹過(guò),網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)支持兩種接收數(shù)據(jù)地方式,一種是中斷,另一種是輪詢(xún),在數(shù)據(jù)流量比較大地情況下,可以考慮采用輪詢(xún)地方式以達(dá)到更高地效率.當(dāng)采用輪詢(xún)方式時(shí),還有一個(gè)不得不考慮地問(wèn)題,那就是輪詢(xún)?nèi)蝿?wù)優(yōu)先級(jí)地選

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論