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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > Linux網(wǎng)絡(luò)驅(qū)動(dòng)程序功能分析

          Linux網(wǎng)絡(luò)驅(qū)動(dòng)程序功能分析

          作者: 時(shí)間:2012-05-30 來(lái)源:網(wǎng)絡(luò) 收藏

           //解析包的協(xié)議

          本文引用地址:http://www.ex-cimer.com/article/148970.htm

            skb->protocol = eth_type_trans(skb, tp->dev);

            //把包送到協(xié)議層

            netif_rx(skb);

            //記錄收包時(shí)間

            tp->dev->last_rx = jiffies;

            }

            10.讀取包的網(wǎng)卡收發(fā)包的狀態(tài),統(tǒng)計(jì)數(shù)據(jù)

            static struct net_device_stats *tg3_get_stats(struct net_device *dev)

            {

            //從硬件相關(guān)的寄存器讀取數(shù)據(jù),累加

            //stats->rx_packets, stats->tx_packets, stats->rx_bytes, stats->tx_bytes等

            }

            11.用戶的ioctl命令系統(tǒng)調(diào)用

            static int tg3_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)

            {

            struct mii_ioctl_data *data = (struct mii_ioctl_data *)ifr->ifr_data;

            switch(cmd) {

            //ethtool程序命令的調(diào)用

            case SIO*HTOOL:

            return tg3_ethtool_ioctl(dev, (void *) ifr->ifr_data);

            //mii程序命令的調(diào)用

            case SIOCGMIIREG: {

            err = tg3_readphy(tp, data->reg_num 0x1f, mii_regval)

            data->val_out = mii_regval;

            return err;

            }

            ……

            }

            }

            12.PCI設(shè)備的掛起和恢復(fù)函數(shù)

            static int tg3_suspend(struct pci_dev *pdev, u32 state)

            {

            //停用網(wǎng)卡的中斷寄存器

            tg3_disable_ints(tp);

            //停止網(wǎng)卡收發(fā)包

            netif_device_detach(dev);

            //停止網(wǎng)卡某些硬件,fireware的一些

            tg3_halt(tp);

            //設(shè)置網(wǎng)卡的電源狀態(tài)

            tg3_set_power_state(tp, state);

            }

            static int tg3_resume(struct pci_dev *pdev)

            {

            //恢復(fù)網(wǎng)卡電源

            tg3_set_power_state(tp, 0);

            //允許網(wǎng)卡收發(fā)包

            netif_device_attach(dev);

            //初始化收發(fā)包的緩沖區(qū)

            tg3_init_rings(tp);

            //初始化網(wǎng)卡硬件

            tg3_init_hw(tp);

            //打開(kāi)網(wǎng)卡中斷寄存器

            tg3_enable_ints(tp);

            }

            13.參數(shù)設(shè)置

            在里還提供一些方法供系統(tǒng)對(duì)設(shè)備的參數(shù)進(jìn)行設(shè)置和讀取信息。一般只有超級(jí)用戶(root)權(quán)限才能對(duì)設(shè)備參數(shù)進(jìn)行設(shè)置。設(shè)置方法有:

            tg3_set_mac_addr (dev->set_mac_address)

            當(dāng)用戶調(diào)用ioctl類型為SIOCSIFHWADDR時(shí)是要設(shè)置這個(gè)設(shè)備的mac地址。一般對(duì)mac地址的設(shè)置沒(méi)有太大意義的。

            dev->set_config()

            當(dāng)用戶調(diào)用ioctl時(shí)類型為SIOCSIFMAP時(shí),系統(tǒng)會(huì)調(diào)用的set_config方法

            用戶會(huì)傳遞一個(gè)ifmap結(jié)構(gòu)包含需要的I/O、中斷等參數(shù)。

            總結(jié):

            所有的遵循通用的接口。設(shè)計(jì)時(shí)采用的是面向?qū)ο蟮姆椒?。一個(gè)設(shè)備就是一個(gè)對(duì)象(net_device 結(jié)構(gòu)),它內(nèi)部有自己的數(shù)據(jù)和方法。一個(gè)設(shè)備最基本的方法有初始化,發(fā)送和接收。

            驅(qū)動(dòng)程序的體系結(jié)構(gòu)可以劃分為四層:

            網(wǎng)絡(luò)協(xié)議接口,網(wǎng)絡(luò)設(shè)備接口,設(shè)備驅(qū)動(dòng),網(wǎng)絡(luò)設(shè)備和網(wǎng)絡(luò)媒介層

            網(wǎng)絡(luò)驅(qū)動(dòng)程序,最主要的工作就是完成設(shè)備驅(qū)動(dòng)層。在中所有網(wǎng)絡(luò)設(shè)備都抽象為一個(gè)接口,這個(gè)接口提供了對(duì)所有網(wǎng)絡(luò)設(shè)備的操作集合。由數(shù)據(jù)結(jié)構(gòu)struct net_device來(lái)表示網(wǎng)絡(luò)設(shè)備在內(nèi)核中的運(yùn)行情況,即網(wǎng)絡(luò)設(shè)備接口。它既包括純軟件網(wǎng)絡(luò)設(shè)備接口,如環(huán)路(Loopback),也包括硬件網(wǎng)絡(luò)設(shè)備接口,如以太網(wǎng)卡。而由以dev_base為頭指針的設(shè)備鏈表來(lái)集體管理所有網(wǎng)絡(luò)設(shè)備,該設(shè)備鏈表中的每個(gè)元素代表一個(gè)網(wǎng)絡(luò)設(shè)備接口。數(shù)據(jù)結(jié)構(gòu)net_device中有很多供系統(tǒng)訪問(wèn)和協(xié)議層調(diào)用的設(shè)備方法,包括初始化,打開(kāi)和關(guān)閉網(wǎng)絡(luò)設(shè)備的open和stop函數(shù),處理數(shù)據(jù)包發(fā)送的hard_start_xmit函數(shù),以及中斷處理函數(shù)等。

            網(wǎng)絡(luò)設(shè)備在Linux里做專門的處理。Linux的網(wǎng)絡(luò)系統(tǒng)主要是基于BSD unix的socket機(jī)制。在系統(tǒng)和驅(qū)動(dòng)程序之間定義有專門的數(shù)據(jù)結(jié)構(gòu)(sk_buff)進(jìn)行數(shù)據(jù)的傳遞。系統(tǒng)里支持對(duì)發(fā)送數(shù)據(jù)和接收數(shù)據(jù)的緩存,提供流量控制機(jī)制,提供對(duì)多協(xié)議的支持。

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

          上一頁(yè) 1 2 3 下一頁(yè)

          評(píng)論


          相關(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); })();