<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 嵌入式Linux網(wǎng)絡(luò)驅(qū)動程序的開發(fā)及實現(xiàn)原理

          嵌入式Linux網(wǎng)絡(luò)驅(qū)動程序的開發(fā)及實現(xiàn)原理

          作者: 時間:2009-12-29 來源:網(wǎng)絡(luò) 收藏
          0 引言
          隨著人們對開放源代碼軟件熱情的日益增高,作為一個功能強(qiáng)大而穩(wěn)定的開源操作系統(tǒng),越來越受到成千上萬的計算機(jī)專家和愛好者的青睞。在領(lǐng)域,通過對進(jìn)行小型化裁剪后,使其能夠固化在容量只有幾十兆字節(jié)的存儲器芯片或單片機(jī)中,成為應(yīng)用于特定場合的系統(tǒng)。Linux強(qiáng)大的支持功能了對包括TCP/IP在內(nèi)的多種協(xié)議的支持,滿足了面向21世紀(jì)的系統(tǒng)應(yīng)用聯(lián)網(wǎng)的需求。因此,在嵌入式系統(tǒng)調(diào)試時,接口幾乎成為不可或缺的模塊。
          1 嵌入式Linux介紹
          Linux網(wǎng)絡(luò)作為Linux網(wǎng)絡(luò)子系統(tǒng)的一部分,位于TCP/IP網(wǎng)絡(luò)體系結(jié)構(gòu)的網(wǎng)絡(luò)接口層,主要上層協(xié)議棧與網(wǎng)絡(luò)設(shè)備的數(shù)據(jù)交換。Linux的網(wǎng)絡(luò)系統(tǒng)主要是基于BSD Unix的套接字(socket)機(jī)制,網(wǎng)絡(luò)設(shè)備與字符設(shè)備和塊設(shè)備不同,沒有對應(yīng)地映射到文件系統(tǒng)中的設(shè)備節(jié)點(diǎn)。
          通常,Linux有兩種加載方式:一種是靜態(tài)地編譯進(jìn)內(nèi)核,內(nèi)核啟動時自動加載;另一種是編寫為內(nèi)核模塊,使用insmod命令將模塊動態(tài)加載到正在運(yùn)行的內(nèi)核,不需要時可用rmmod命令將模塊卸載。Linux 2.6內(nèi)核引入了kbuild機(jī)制,將外部內(nèi)核模塊的編譯同內(nèi)核源碼樹的編譯統(tǒng)一起來,大大簡化了特定的參數(shù)和宏的設(shè)置。這樣將編寫好的驅(qū)動模塊加入內(nèi)核源碼樹,只需要修改相應(yīng)目錄的Kconfig文件,把新的驅(qū)動加入內(nèi)核的配置菜單,然后需要修改相應(yīng)子目錄中與模塊編譯相關(guān)的Kbuild Makefile,即可使新的驅(qū)動在內(nèi)核源碼樹中被編譯。在嵌入式系統(tǒng)驅(qū)動時,常常將驅(qū)動程序編寫為內(nèi)核模塊,方便調(diào)試。調(diào)試完畢后,就可以將驅(qū)動模塊編譯進(jìn)內(nèi)核,并重新編譯出支持特定物理設(shè)備的Linux內(nèi)核。
          2 嵌入式Linux網(wǎng)絡(luò)驅(qū)動程序的體系結(jié)構(gòu)和
          2.1 Linux網(wǎng)絡(luò)設(shè)備驅(qū)動的體系結(jié)構(gòu)
          如圖1所示,Linux網(wǎng)絡(luò)驅(qū)動程序的體系結(jié)構(gòu)可劃分為4個層次。Linux內(nèi)核源代碼中提供了網(wǎng)絡(luò)設(shè)備接口及以上層次的代碼,因此移植特定網(wǎng)絡(luò)硬件的驅(qū)動程序的主要工作就是完成設(shè)備驅(qū)動功能層的相應(yīng)代碼,根據(jù)底層具體的硬件特性,定義網(wǎng)絡(luò)設(shè)備接口struct net_device類型的結(jié)構(gòu)體變量,并實現(xiàn)其中相應(yīng)的操作函數(shù)及中斷處理程序。
          Linux中所有的網(wǎng)絡(luò)設(shè)備都抽象為一個統(tǒng)一的接口,即網(wǎng)絡(luò)設(shè)備接口,通過struct net_device類型的結(jié)構(gòu)體變量表示網(wǎng)絡(luò)設(shè)備在內(nèi)核中的運(yùn)行情況,這里既包括回環(huán)(loopback)設(shè)備,也包括硬件網(wǎng)絡(luò)設(shè)備接口。內(nèi)核通過以dev_base為頭指針的設(shè)備鏈表來管理所有的網(wǎng)絡(luò)設(shè)備。


          2.2 net_device 數(shù)據(jù)結(jié)構(gòu)
          struct net_device結(jié)構(gòu)體是整個網(wǎng)絡(luò)驅(qū)動結(jié)構(gòu)的核心,其中定義了很多供網(wǎng)絡(luò)協(xié)議接口層調(diào)用設(shè)備的標(biāo)準(zhǔn)方法,該結(jié)構(gòu)在2.6內(nèi)核源碼樹文件中定義,下面只列出其中主要的成員。
          2.2.1全局信息及底層硬件信息
          name:網(wǎng)絡(luò)設(shè)備名稱,默認(rèn)是以太網(wǎng);
          *next:指向全局鏈表下一個設(shè)備的指針,驅(qū)動程序中不修改;
          mem_,rmem_:發(fā)送和接收緩沖區(qū)的起始,結(jié)束位置;
          base_addr,irq:網(wǎng)絡(luò)設(shè)備的I/O基地址,中斷號,ifconfig命令可顯示和修改;
          hard_header_len:硬件頭的長度,以太網(wǎng)中值為14;
          mtu:最大傳輸單元,以太網(wǎng)中值為1500B;
          dev_addr[MAX_ADDR_LEN]:硬件(MAC)地址長度及設(shè)備硬件地址,以太網(wǎng)地址長度是48bit,ether_setup會對其進(jìn)行正確的設(shè)置;

          linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

          上一頁 1 2 3 下一頁

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();