QNX操作系統及網(wǎng)絡(luò )設備驅動(dòng)模塊

發(fā)布時(shí)間:2010-11-17 12:37    發(fā)布者:designer
介紹嵌入式操作系統QNX的微內核結構、基于io-net的網(wǎng)絡(luò )子系統、網(wǎng)絡(luò )設備驅動(dòng)程序的組成;給出以以太網(wǎng)網(wǎng)設備驅動(dòng)程序為例的詳細說(shuō)明,包括初始化、從網(wǎng)絡(luò )設備接收數據,向網(wǎng)絡(luò )設備發(fā)送數據和網(wǎng)絡(luò )設備信息的統計。

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

1 QNX內核簡(jiǎn)介  

QNX的微內核結構是它區別于其它操作系統的顯著(zhù)特點(diǎn)。目前嵌入式系統中,操作系統和應用程序之間的關(guān)系大概可以歸納為圖1~圖3所示的三種情況。  

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

大內核內存結構,如圖2所示,操作系統內核和各種驅動(dòng)程序、網(wǎng)絡(luò )協(xié)議在同一個(gè)地址空間,應用程序在單獨空間;內核模塊同處于一個(gè)保護空間,運行效率高,



應用程序無(wú)法直接訪(fǎng)問(wèn)保護空間,系統穩定性大大提高。缺點(diǎn)是,由于內核模塊(例如網(wǎng)絡(luò )驅動(dòng))處于保護空間,因此調試困難,任何驅動(dòng)程序的修改都要重新編譯內核,無(wú)法做到驅動(dòng)的動(dòng)態(tài)加載和卸載。  

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

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

在具有高可靠性?xún)群说幕A上,QNX的創(chuàng )新設計使它同樣具有很高的效率。QNX最為引人注目的地方是,它是UNIX的同胞異構體,保持了和UNIX的高度相似性,絕大多數UNIX或LINUX應用程序可以在QNX下直接編譯生成。這意味著(zhù)為數眾多的穩定成熟的UNIX、LINUX應用可以直接移植到QNX這個(gè)更加穩定高效的實(shí)時(shí)嵌入式平臺上來(lái)。  

2 QNX網(wǎng)絡(luò )結構  

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

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

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

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

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

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

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

(1)初始化  

初始化包括兩個(gè)方面,一方面是初始化網(wǎng)絡(luò )設備,使其正常工作;另一個(gè)方面,是向io-net正確注冊驅動(dòng)模塊,表明自己的屬性,方便上層正確操作。



網(wǎng)絡(luò )設備的初始化工作和硬件緊密相關(guān),這里就不一一描述。  

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

①io-net搜索全局的符合io_net_dll_entry。它定義了驅動(dòng)的初始化函數,io-net會(huì )直接調用這個(gè)函數。  
②初始化函數向io-net注冊驅動(dòng)和相應的函數。  
③初始化函數告訴io-net和它的模塊自己的通信能力。  

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

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

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

①通過(guò)DMA將包取回來(lái);  
②做相應的必要處理,如通知網(wǎng)絡(luò )設備釋放當前幀的緩存,配置寄存器讓網(wǎng)絡(luò )設備等待下一幀到來(lái)等;  
③通過(guò)調用io-net的tx_up_start()函數把包傳遞給上層模塊。  

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

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

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--本驅動(dòng)在io-net中的句柄,注冊時(shí)由io-net生成;  
nptk_t *npkt --需要處理的包的指針;  
int off--底層協(xié)議包頭長(cháng)度,如以太網(wǎng)幀頭部長(cháng)度;  
int framelen_sub--尾部填充的長(cháng)度,對于以太網(wǎng)這個(gè)值為零;  
uint16_t cell、uint16_t endpoint--endpoint和cell是io-net在注冊的時(shí)候分配的用來(lái)區別不同的驅動(dòng);  
uint16_t iface--接口號,可以讓同一個(gè)驅動(dòng)負現多個(gè)相同硬件;  
void *done_hdl--該指針指向tx_done()函數需要的額外數據。  

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

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

int(*rx_down)(npkt_t*npkt,  
void *func_hdl)  

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

表1   

cell、endpoint、iface
需要處理該包的硬件標識

buffers
指向包的指針

tot_iov
包含數據包的所有I/O矢量

Framelen
所有數據的長(cháng)度,以字節為單位

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

4 網(wǎng)絡(luò )設備信息的統計  

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

需要維護的數據結構中,主要的是Nic_t,它包括四個(gè)子結構;  

CustNicStats--網(wǎng)絡(luò )信息入口;  
EthernesStats_t--以太網(wǎng)狀態(tài);  
GenStats_t--常用統計信息;  
NetStats_t--網(wǎng)絡(luò )信息(包含常用統計信息)。  

以上是驅動(dòng)程序需要維護的數據。當用戶(hù)或應用程序要查詢(xún)這些信息的時(shí)候,它們就通過(guò)Nicinfo工具對/dev/io-net/en0調用devctl()函數來(lái)取得網(wǎng)絡(luò )信息。信息的取得是必須通過(guò)io-net來(lái)完成的,io-net對信息的查詢(xún)則是通過(guò)調用io_net_register_funs_t結構中所指向的函數來(lái)取得信息的。例:  

#include  
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);  
}  



結語(yǔ)  

網(wǎng)絡(luò )設備的驅動(dòng)是網(wǎng)絡(luò )系統的最低層和最基礎的模塊,是如今嵌入式開(kāi)發(fā)中首先要解決的問(wèn)題之一。由于QNX具有微內核的特點(diǎn),其網(wǎng)絡(luò )設備驅動(dòng)程序的開(kāi)發(fā)不需要內核調試,更適合初學(xué)者掌握。本文對QNX操作系統及網(wǎng)絡(luò )設備驅動(dòng)程序的介紹,可以幫助讀者對相關(guān)內容作初步了解。
本文地址:http://selenalain.com/thread-40046-1-1.html     【打印本頁(yè)】

本站部分文章為轉載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀(guān)點(diǎn)和對其真實(shí)性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問(wèn)題,我們將根據著(zhù)作權人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復 返回頂部 返回列表
午夜高清国产拍精品福利|亚洲色精品88色婷婷七月丁香|91久久精品无码一区|99久久国语露脸精品|动漫卡通亚洲综合专区48页