在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > QNX操作系統(tǒng)及網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)模塊

            QNX操作系統(tǒng)及網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)模塊

            作者: 時(shí)間:2004-12-10 來源:網(wǎng)絡(luò) 收藏
            摘要:介紹嵌入式的微內(nèi)核結(jié)構(gòu)、基于io-net的子系統(tǒng)、程序的組成;給出以以太網(wǎng)網(wǎng)程序?yàn)槔脑敿?xì)說明,包括初始化、從設(shè)備接收數(shù)據(jù),向網(wǎng)絡(luò)設(shè)備發(fā)送數(shù)據(jù)和網(wǎng)絡(luò)設(shè)備信息的統(tǒng)計(jì)。

            關(guān)鍵詞: 網(wǎng)絡(luò) 驅(qū)動(dòng)程序

            是業(yè)界公認(rèn)的X86平臺(tái)上最好的嵌入式實(shí)時(shí)之一。它具有獨(dú)一無二的微內(nèi)核實(shí)時(shí)平臺(tái),建立在微內(nèi)核和完全地址空間保護(hù)基礎(chǔ)之上,實(shí)時(shí)、穩(wěn)定、可靠,已經(jīng)完成到PowerPC、MIPS、ARM等內(nèi)核的移植,成為在國內(nèi)廣泛應(yīng)用的嵌入式實(shí)時(shí)。本文簡單介紹QNX內(nèi)核和網(wǎng)絡(luò)結(jié)構(gòu)的特點(diǎn),針對目前熱門的網(wǎng)絡(luò)應(yīng)用環(huán)境,討論QNX網(wǎng)絡(luò)程序的結(jié)構(gòu)和編寫。

            1 QNX內(nèi)核簡介

            QNX的微內(nèi)核結(jié)構(gòu)是它區(qū)別于其它操作系統(tǒng)的顯著特點(diǎn)。目前嵌入式系統(tǒng)中,操作系統(tǒng)和應(yīng)用程序之間的關(guān)系大概可以歸納為圖1~圖3所示的三種情況。

            平板式內(nèi)存結(jié)構(gòu),如圖1所示,所有的程序都使用同一個(gè)地址空間,不加保護(hù);應(yīng)用程序可以自由訪問所有空間,效率較高,但是任何應(yīng)用程序指針錯(cuò)誤都可能會(huì)導(dǎo)致內(nèi)核崩潰。

            大內(nèi)核內(nèi)存結(jié)構(gòu),如圖2所示,操作系統(tǒng)內(nèi)核和各種驅(qū)動(dòng)程序、網(wǎng)絡(luò)協(xié)議在同一個(gè)地址空間,應(yīng)用程序在單獨(dú)空間;內(nèi)核同處于一個(gè)保護(hù)空間,運(yùn)行效率高,應(yīng)用程序無法直接訪問保護(hù)空間,系統(tǒng)穩(wěn)定性大大提高。缺點(diǎn)是,由于內(nèi)核(例如網(wǎng)絡(luò)驅(qū)動(dòng))處于保護(hù)空間,因此調(diào)試?yán)щy,任何驅(qū)動(dòng)程序的修改都要重新編譯內(nèi)核,無法做到驅(qū)動(dòng)的動(dòng)態(tài)加載和卸載。

            QNX的微內(nèi)核結(jié)構(gòu),如圖3所示,內(nèi)核獨(dú)立自處于一個(gè)被保護(hù)的地址空間;驅(qū)動(dòng)程序、網(wǎng)絡(luò)協(xié)議和應(yīng)用程序處地程序空間中。

            微內(nèi)核結(jié)構(gòu)的優(yōu)點(diǎn):①驅(qū)動(dòng)程序、網(wǎng)絡(luò)協(xié)議、文件系統(tǒng)等操作系統(tǒng)和內(nèi)核相互獨(dú)立,任何模塊的故障都不會(huì)導(dǎo)致內(nèi)核的崩潰;②驅(qū)動(dòng)程序、網(wǎng)絡(luò)協(xié)議、文件系統(tǒng)和應(yīng)用程序都處于程序空間,都調(diào)用相同的內(nèi)核API,開發(fā)與調(diào)試和應(yīng)用程序沒有區(qū)別;③操作系統(tǒng)功能模塊可以根據(jù)需要?jiǎng)討B(tài)地加載或卸載,不需要編譯內(nèi)核。在高可靠性要求的情況下,可以編寫監(jiān)視模塊,對可靠性要求高的模塊進(jìn)行監(jiān)視,必要的時(shí)候重新啟動(dòng)或重新加載而無須重啟系統(tǒng)。高可靠性的內(nèi)核結(jié)構(gòu)使QNX具備了高可靠性嵌入式操作系統(tǒng)的本質(zhì)特征。

            在具有高可靠性內(nèi)核的基礎(chǔ)上,QNX的創(chuàng)新設(shè)計(jì)使它同樣具有很高的效率。QNX最為引人注目的地方是,它是UNIX的同胞異構(gòu)體,保持了和UNIX的高度相似性,絕大多數(shù)UNIX或LINUX應(yīng)用程序可以在QNX下直接編譯生成。這意味著為數(shù)眾多的穩(wěn)定成熟的UNIX、LINUX應(yīng)用可以直接移植到QNX這個(gè)更加穩(wěn)定高效的實(shí)時(shí)嵌入式平臺(tái)上來。

            2 QNX網(wǎng)絡(luò)結(jié)構(gòu)

            QNZ網(wǎng)絡(luò)子系統(tǒng)由三個(gè)部分組成:網(wǎng)絡(luò)管理模塊(io-net)、網(wǎng)絡(luò)協(xié)議模塊(npm-qnet.so、npm-tcpip.so)、網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)模塊(devn-ne2000.so)。

            模塊之間的層次關(guān)系如圖4所示。

            圖4中的每個(gè)模塊各自具有不同的功能,但是它們具有一些相同的屬性。如:網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)、TCP/IP協(xié)議棧分別對上層io-net模塊和應(yīng)用程序產(chǎn)生數(shù)據(jù),兩者都可以被看作數(shù)據(jù)源;同時(shí)它們也接受上層發(fā)來的數(shù)據(jù),又可以同時(shí)被看作數(shù)據(jù)的消費(fèi)者。過濾模塊對向上的數(shù)據(jù)進(jìn)行篩選,分協(xié)議進(jìn)行處理;對向下的數(shù)據(jù)則進(jìn)行相應(yīng)的轉(zhuǎn)換,如進(jìn)行網(wǎng)絡(luò)地址轉(zhuǎn)換NAT。轉(zhuǎn)換模塊負(fù)責(zé)不同協(xié)議幀結(jié)構(gòu)的轉(zhuǎn)換,在以太網(wǎng)的工作環(huán)境下,它就負(fù)責(zé)對IP數(shù)據(jù)報(bào)進(jìn)行以太網(wǎng)幀的封裝和解包。

            和QNX其它服務(wù)進(jìn)程一樣,QNX的網(wǎng)絡(luò)子系統(tǒng)也在內(nèi)核外部空間運(yùn)行。應(yīng)用程序面對的是一個(gè)統(tǒng)一的網(wǎng)絡(luò)接口,硬件相關(guān)的內(nèi)容被完全包裝在網(wǎng)絡(luò)子系統(tǒng)內(nèi)。

            QNX網(wǎng)絡(luò)子系統(tǒng)的三個(gè)子模塊按層次分開,io-net模塊處于中心,是QNX網(wǎng)絡(luò)的核心和重點(diǎn),其它模塊都掛接在它上面。數(shù)據(jù)和信息的流動(dòng)都必須經(jīng)由io-net調(diào)度與轉(zhuǎn)發(fā),所有其它模塊所面對的就是一個(gè)單一主體。這樣的中心交換結(jié)構(gòu),屏蔽了各個(gè)模塊間相互協(xié)調(diào)的復(fù)雜細(xì)節(jié),在很大程序上方便了模塊的編寫工作;同時(shí),io-net還是QNX的網(wǎng)絡(luò)管理中心。任何網(wǎng)絡(luò)協(xié)議和網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序都必須向io-net注冊,由它來加載,并接受io-net的配置和管理,用戶對網(wǎng)絡(luò)狀態(tài)的查詢和管理也是通過io-net來實(shí)現(xiàn)的。

            3 QNX網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)

            QNX網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)模塊處于網(wǎng)絡(luò)硬件和io-net模塊之間。驅(qū)動(dòng)模塊負(fù)責(zé)配置硬件使其正常工作,向io-net報(bào)告數(shù)據(jù)收發(fā)情況,接收和傳遞數(shù)據(jù),接受io-net的調(diào)度和管理。QNX網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序依照以上功能,分為初始化、接收發(fā)送數(shù)據(jù)、網(wǎng)絡(luò)設(shè)備信息統(tǒng)計(jì)幾個(gè)功能塊。要使網(wǎng)絡(luò)設(shè)備工作正常,驅(qū)動(dòng)程序就要對它進(jìn)行一定的寄存器配置,同時(shí),還要向QNX網(wǎng)絡(luò)子系統(tǒng)注冊自己,表明網(wǎng)絡(luò)設(shè)備的存在和網(wǎng)絡(luò)通信能力,才能為系統(tǒng)和應(yīng)用程序所用。在初始化工作完成以后,網(wǎng)絡(luò)設(shè)備就進(jìn)入了工作狀態(tài),收發(fā)數(shù)據(jù)。設(shè)備信息的統(tǒng)計(jì)也是由設(shè)備驅(qū)動(dòng)程序來完成的。

            (1)初始化

            初始化包括兩個(gè)方面,一方面是初始化網(wǎng)絡(luò)設(shè)備,使其正常工作;另一個(gè)方面,是向io-net正確注冊驅(qū)動(dòng)模塊,表明自己的屬性,方便上層正確操作。網(wǎng)絡(luò)設(shè)備的初始化工作和硬件緊密相關(guān),這里就不一一描述。

            驅(qū)動(dòng)模塊向io-net加載自己的時(shí)候,系統(tǒng)遵循如下工作流程:

            ①io-net搜索全局的符合io_net_dll_entry。它定義了驅(qū)動(dòng)的初始化函數(shù),io-net會(huì)直接調(diào)用這個(gè)函數(shù)。

            ②初始化函數(shù)向io-net注冊驅(qū)動(dòng)和相應(yīng)的函數(shù)。

            ③初始化函數(shù)告訴io-net和它的模塊自己的通信能力。

            經(jīng)過以上流程以后,io-net中就建立起有關(guān)此驅(qū)動(dòng)程序的數(shù)據(jù)和函數(shù)調(diào)用列表。驅(qū)動(dòng)程序必須正確編寫初始化函數(shù),并將該函數(shù)正確鏈接至io_net_dll_entry。

            (2)從網(wǎng)絡(luò)設(shè)備接收數(shù)據(jù)

            當(dāng)有包到達(dá)網(wǎng)絡(luò)設(shè)備的時(shí)候,網(wǎng)絡(luò)設(shè)備就會(huì)用某種方式通知驅(qū)動(dòng)程序(例如中斷),此時(shí),驅(qū)動(dòng)程序就要采取某種策略來處理到來的幀或數(shù)據(jù)。通常驅(qū)動(dòng)程序這時(shí)候需要做以下工作:

            ①通過DMA將包取回來;

            ②做相應(yīng)的必要處理,如通知網(wǎng)絡(luò)設(shè)備釋放當(dāng)前幀的緩存,配置寄存器讓網(wǎng)絡(luò)設(shè)備等待下一幀到來等;

            ③通過調(diào)用io-net的tx_up_start()函數(shù)把包傳遞給上層模塊。

            當(dāng)上層所有的模塊都完成對這個(gè)包的處理以后,io-net調(diào)用我們驅(qū)動(dòng)中的tx_done()函數(shù),它來做最后的處理工作。

            tx_up_start()函數(shù)是設(shè)備驅(qū)動(dòng)中比較關(guān)鍵的函數(shù),下面簡要部分一下這個(gè)函數(shù)的入口參數(shù)。

            npkt_t*(*tx_up_start)(int registrant_hdl,

            nptk_t *npkt,

            int off,

            int framelen_sub,

            uint16_t cell,

            uint 16_t endpoint,

            uint16_t iface,

            void *done_hdl)

            其中:int registrant_hdl--本驅(qū)動(dòng)在io-net中的句柄,注冊時(shí)由io-net生成;

            nptk_t *npkt --需要處理的包的指針;

            int off--底層協(xié)議包頭長度,如以太網(wǎng)幀頭部長度;

            int framelen_sub--尾部填充的長度,對于以太網(wǎng)這個(gè)值為零;

            uint16_t cell、uint16_t endpoint--endpoint和cell是io-net在注冊的時(shí)候分配的用來區(qū)別不同的驅(qū)動(dòng);

            uint16_t iface--接口號(hào),可以讓同一個(gè)驅(qū)動(dòng)負(fù)現(xiàn)多個(gè)相同硬件;

            void *done_hdl--該指針指向tx_done()函數(shù)需要的額外數(shù)據(jù)。

            (3)向網(wǎng)絡(luò)設(shè)備發(fā)送數(shù)據(jù)

            當(dāng)上層模塊需要硬件傳送包的時(shí)候,會(huì)調(diào)用io-net管理器的rx_down()函數(shù)。

            int(*rx_down)(npkt_t*npkt,

            void *func_hdl)

            rx_down函數(shù)入口參數(shù)中,npkt是指向需要傳送的數(shù)據(jù)的結(jié)構(gòu)指針,func_hdl是相應(yīng)驅(qū)動(dòng)模塊在io-net中的句柄。其中npt結(jié)構(gòu)包含許多成員,其中的重要成員如表1所列。

            表1

            cell、endpoint、iface需要處理該包的硬件標(biāo)識(shí)
            buffers指向包的指針
            tot_iov包含數(shù)據(jù)包的所有I/O矢量
            Framelen所有數(shù)據(jù)的長度,以字節(jié)為單位

            驅(qū)動(dòng)模塊在接收到io-net的調(diào)用后,就要配置網(wǎng)絡(luò)設(shè)備,讓它完成數(shù)據(jù)的發(fā)送工作。網(wǎng)絡(luò)設(shè)備發(fā)送數(shù)據(jù)所需要的信息都會(huì)在相應(yīng)的數(shù)據(jù)結(jié)構(gòu)中,如net_buf_t結(jié)構(gòu)中保存了等待傳送的數(shù)據(jù)包的鏈接列表,配置DMA所需的物理地址在net_iov_t中等。驅(qū)動(dòng)模塊要等待硬件完成這些包的傳送,并調(diào)用io-net的tx)done()函數(shù)通知上層模塊驅(qū)動(dòng)程序已經(jīng)完成了數(shù)據(jù)的發(fā)送。

            4 網(wǎng)絡(luò)設(shè)備信息的統(tǒng)計(jì)

            應(yīng)用程序或者用戶可以通過網(wǎng)絡(luò)信息接口nicinfo工具來了解網(wǎng)絡(luò)工作狀態(tài)。信息的查詢都是通過io-net來進(jìn)行的。驅(qū)動(dòng)程序必須維護(hù)相應(yīng)的狀態(tài)數(shù)據(jù),方便io-net的查詢。網(wǎng)絡(luò)設(shè)備有一些共同的狀態(tài)屬性,如收到和發(fā)出的包的個(gè)數(shù)、發(fā)送錯(cuò)誤的包的個(gè)數(shù)等,不同的網(wǎng)絡(luò)設(shè)備還會(huì)具有不同的屬性和狀態(tài),這些都可以在驅(qū)動(dòng)程序中用數(shù)據(jù)結(jié)構(gòu)詳細(xì)列明。

            需要維護(hù)的數(shù)據(jù)結(jié)構(gòu)中,主要的是Nic_t,它包括四個(gè)子結(jié)構(gòu);

            CustNicStats--網(wǎng)絡(luò)信息入口;

            EthernesStats_t--以太網(wǎng)狀態(tài);

            GenStats_t--常用統(tǒng)計(jì)信息;

            NetStats_t--網(wǎng)絡(luò)信息(包含常用統(tǒng)計(jì)信息)。

            以上是驅(qū)動(dòng)程序需要維護(hù)的數(shù)據(jù)。當(dāng)用戶或應(yīng)用程序要查詢這些信息的時(shí)候,它們就通過Nicinfo工具對/dev/io-net/en0調(diào)用devctl()函數(shù)來取得網(wǎng)絡(luò)信息。信息的取得是必須通過io-net來完成的,io-net對信息的查詢則是通過調(diào)用io_net_register_funs_t結(jié)構(gòu)中所指向的函數(shù)來取得信息的。例:

            #includesys/nic.h>

            int generic_eth_devctl(void *hdl,int dcmd,void *data,size_t size,int *ret)

            {

            Nic_t *nic=(Nic_t *)hdl;

            int status;

            status=EOK;

            switch(dcmd){

            case DCMD_IO_NET_NICINFO;

            memcpy(data,nic,min(size,sizeof(Nic_t)));

            break;

            default:

            status=ENOTSUP;

            break;

            }

            return(status);

            }

            結(jié)語

            網(wǎng)絡(luò)設(shè)備的驅(qū)動(dòng)是網(wǎng)絡(luò)系統(tǒng)的最低層和最基礎(chǔ)的模塊,是如今嵌入式開發(fā)中首先要解決的問題之一。由于QNX具有微內(nèi)核的特點(diǎn),其網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序的開發(fā)不需要內(nèi)核調(diào)試,更適合初學(xué)者掌握。本文對QNX操作系統(tǒng)及網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序的介紹,可以幫助讀者對相關(guān)內(nèi)容作初步了解。

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


            評論


            相關(guān)推薦

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

            關(guān)閉