新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 嵌入式Linux網絡驅動程序的開發及實現原理

        嵌入式Linux網絡驅動程序的開發及實現原理

        作者: 時間:2009-12-29 來源:網絡 收藏
        2.3.4數據包的接收和中斷處理
        設備是異步地接收外來的數據包并且主動的“請求”將硬件獲得的數據包壓入內核。設備接收數據包是通過中斷的。對于網絡接口,接收到新數據包,發送完成或者報告錯誤信息及連接狀態等都會觸發中斷,通常中斷處理程序通過檢測硬件狀態寄存器判斷是哪種情況。
        當設備收到數據后會產生一個中斷,由硬件通知有數據包到達。在中斷處理程序中申請一塊sk_buff(一般定義為skb)緩沖區,然后從硬件讀出數據放到申請好的緩沖區里,接下來填充sk_buff中的部分信息:包括接收到數據的設備結構體指針填入skb->dev;收到數據幀的類型填入skb->protocol;把指針skb->mac.raw指向硬件數據并丟棄硬件針頭(skb_pull);設置skb->pkt_type,標明鏈路層數據類型。最后調用協議接口層函數netif_rx() 把接收到的數據包傳輸到網絡上層協議處理。這里,netif_rx()只是負責把數據放入工作隊列就返回,真正的處理是在中斷返回以后,這樣可減少中斷處理的時間。幾乎每個中斷處理程序的編寫都要涉及底半部機制,這樣可以保證中斷的高效處理。
        實例中數據接收函數cs8900_receive()由網絡驅動的中斷處理函數調用,主要完成如下工作:
        a.通過從I/O口讀取RxStatus和RxLength的值,確定接收數據幀的狀態信息和長度;
        b.判斷接收數據幀的狀態是否正常,若異常則記錄相關錯誤信息,然后函數返回;
        c.正常情況下,在內存中申請一塊sk_buff緩存,并將數據從CS8900A的片內存儲器傳送到sk_buff緩存中;d.從數據幀中獲取協議頭并賦給skb->protocol;
        e.通過調用netif_rx()函數將接收到的數據送往上層協議棧進行處理;
        f.記錄接收數據的時間并更新統計信息;
        3將設備驅動模塊編譯進內核
        設計好模塊化的網絡后,我們就可以編譯這個內核模塊,并將這個自定義的內核模塊作為系統源碼的一部分編譯出新的系統。下面介紹的內容均在2.6.18內核上編譯通過,可以在2.6.x版本內核中通用。如前所述,由于2.6內核引入了kbuild的新機制,使得編譯新的內核模塊或者將自己編寫的內核模塊集成到內核源碼中都變得非常簡單了。
        Linux2.6內核中,編譯內核模塊首先要在/usr/src下正確配置和構造內核源碼樹,即把需要版本的內核源碼解壓在/usr/src/,并在內核源碼的主目錄下(這里為/usr/src/linux-2.6.18.3),使用make menuconfig或者make gconfig命令配置內核,然后使用make all完整編譯內核。
        下面以作者的CS8900A網卡驅動為實例,介紹如何將網絡設備驅動模塊編譯進內核。
        a.在系統源碼樹drivers目錄下創建新目錄Cs8900;
        b.將編寫好的文件cs8900.c和cs8900.h拷貝到drivers/Cs8900目錄下;
        c.在drivers/Cs8900目錄下,編寫Makefile文件:
        #Makefile for CS8900A Network Driver
        obj -$(CONFIG_DRIVER_CS8900A) +=cs8900.o
        d.在drivers/Cs8900目錄下,編寫Kconfig文件:
        #Just for CS8900A Network Interface
        menu CS8900A Network Interface support
        config DRIVER_CS8900A
        tristate CS8900A support
        --------help--------
        This is a network driver module for CS8900A.
        endmenu
        e.在driver目錄下的Kconfig文件endmenu語句前,加入一行:
        source drivers/Cs8900/Kconfig
        這樣在內核源碼樹的主目錄下,通過make menuconfig或者make gconfig命令就可以在Device Drivers選項的下面找到CS8900A Network Interface support選項,并找到CS8900A support的選擇菜單,它有三種狀態:未選中(不編譯)、選中(M)一編譯為模塊、選中(*)一編譯為新系統一部分。
        重新編譯內核即可得到支持CS8900A網卡的內核,然后將內核下載到FS2410的板上,通過配置網絡參數,就可以測試網卡驅動程序的行為了。
        4 結束語
        在這個信息爆炸的時代,人們對于網絡的需求愈發強烈,越來越多的設備都需要具有以太網的接入功能,因此網絡驅動程序對于很多產品的研發至關重要。具體開發Linux網絡驅動程序時,可以參照內核中已經支持的網絡驅動源代碼,在重點理解Linux網絡驅動的基礎上,按照模塊設計較為固定的開發模式,結合具體物理設備的硬件手冊,移植編寫需要的模塊化的網絡驅動程序。

        本文引用地址:http://www.104case.com/article/152169.htm
        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)

        上一頁 1 2 3 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 兴义市| 昭苏县| 横山县| 朔州市| 梅河口市| 宁武县| 育儿| 五莲县| 两当县| 前郭尔| 连江县| 大新县| 璧山县| 聂荣县| 彝良县| 陆良县| 营山县| 景洪市| 西峡县| 阜阳市| 神农架林区| 福贡县| 汕头市| 永春县| 虎林市| 伊宁县| 江安县| 涞源县| 镇康县| 中阳县| 班戈县| 锡林浩特市| 秦安县| 海伦市| 平度市| 澄江县| 盐池县| 大厂| 瑞昌市| 南召县| 泌阳县|