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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > VxWorks與SNMP代理的開發(fā)(圖)

          VxWorks與SNMP代理的開發(fā)(圖)

          ——
          作者: 時間:2007-02-06 來源: 收藏
          前言
            目前嵌入式應(yīng)用領(lǐng)域的一個發(fā)展方向是采用實時操作系統(tǒng)(real time operation system,rtos)。實時操作系統(tǒng)是一段在嵌入式系統(tǒng)啟動后首先執(zhí)行的程序,用戶的應(yīng)用程序是運行于rtos之上的各個任務(wù),rtos根據(jù)各個任務(wù)的要求,進行資源管理、消息管理、任務(wù)調(diào)度、異常處理等工作。應(yīng)當根據(jù)優(yōu)先級的高低對任務(wù)進行切換,只有優(yōu)先服務(wù)方式的rtos才是真正的實時操作系統(tǒng),時間分片方式和協(xié)作方式的rtos都不是嚴格意義上的“實時”。vxworks是美國windriver公司于1983年開發(fā)的一種嵌入式實時操作系統(tǒng),以其良好的擴展能力、高性能的內(nèi)核,以及友好的用戶開發(fā)環(huán)境,在嵌入式實時操作系統(tǒng)領(lǐng)域占據(jù)了重要的一席之地。

          vxworks操作系統(tǒng)
            vxworks 操作系統(tǒng)包括了進程管理、存儲管理、設(shè)備管理、文件系統(tǒng)管理、網(wǎng)絡(luò)協(xié)議及系統(tǒng)應(yīng)用等幾個部分。vxworks只需很小的存儲空間,并可高度裁剪,保證了系統(tǒng)能以較高的效率運行。vxworks主要由以下幾個部分組成。
            1.操作系統(tǒng)核心
            vxworks 的核心被稱作wind,用優(yōu)先級搶占方式進行多任務(wù)調(diào)度,執(zhí)行任務(wù)間的同步、進程間通信和中斷處理,對看門狗和內(nèi)存進行管理。一個多任務(wù)環(huán)境允許實時應(yīng)用程序以一套獨立任務(wù)的方式構(gòu)筑,每個任務(wù)擁有獨立的執(zhí)行線程和自己的系統(tǒng)資源。進程間通信機制可以保證任務(wù)的同步與協(xié)調(diào)。
          wind使用中斷驅(qū)動和優(yōu)先級的方式,縮短了上下文轉(zhuǎn)換的時間開銷和中斷時延。在vxworks中,任何例程都可以被啟動為一個單獨的任務(wù),擁有自己的上下文和堆棧。還有一些其他的任務(wù)機制可以使任務(wù)掛起、繼續(xù)、刪除、延時或者改變優(yōu)先級。
            wind核提供信號量作為任務(wù)間同步和互斥的標志。wind核針對不同的應(yīng)用需求,有二進制信號量、計數(shù)信號量、互斥信號量和 posix信號量幾種。這些信號量除了應(yīng)用在開發(fā)設(shè)計過程中,還被廣泛地應(yīng)用到vxworks高層應(yīng)用系統(tǒng)中。對于進程間通信,wind 核也提供了諸如消息隊列、管道、套接字和信號等機制。
            2.i/o 系統(tǒng)
            vxworks提供了一個快速靈活、與ansi c兼容的i/o系統(tǒng),包括 unix 標準的緩沖i/o和 posix標準的異步i/o。vxworks 包括以下驅(qū)動程序:網(wǎng)絡(luò)驅(qū)動、管道驅(qū)動、ram盤驅(qū)動、scsi驅(qū)動、鍵盤驅(qū)動、顯示驅(qū)動、磁盤驅(qū)動、并口驅(qū)動等。
            3.文件系統(tǒng)
            vxworks提供的快速文件系統(tǒng)適合于實時系統(tǒng)應(yīng)用,包括幾種支持使用塊設(shè)備的本地文件系統(tǒng)。這些設(shè)備都使用一個標準的接口從而使得文件系統(tǒng)能夠被靈活地在設(shè)備驅(qū)動程序上移植。另外,vxworks 也支持scsi磁帶設(shè)備的本地文件系統(tǒng),vxworks i/o體系結(jié)構(gòu)甚至還支持在一個單獨的vxworks系統(tǒng)上同時并存幾個不同的文件系統(tǒng)。vxworks支持dosfs、rt11fs、rawfs和tapefs四種文件系統(tǒng)。
            普通數(shù)據(jù)文件和外部設(shè)備都統(tǒng)一作為文件處理,使用相同的語法定義和保護機制,這樣既簡化了系統(tǒng)設(shè)計又便于用戶使用。
            4.板級支持包 bsp(board support package)
            vxworks bsp包含了開發(fā)人員在特定的目標機上運行vxworks時所需的一切支持,包括支持特定目標機的軟件(如驅(qū)動程序等)和從主機通過網(wǎng)絡(luò)引導vxworks的boot rom。windriver提供支持不同廠商的200多種bsp,另外還提供bsp移植包,幫助用戶移植vxworks到特定硬件上。
            5.網(wǎng)絡(luò)設(shè)施
            vxworks的網(wǎng)絡(luò)結(jié)構(gòu)提供了對其他網(wǎng)絡(luò)和tcp/ip網(wǎng)絡(luò)系統(tǒng)的“透明”訪問,包括與bsd套接字兼容的編程接口、遠程過程調(diào)用、遠程文件訪問以及bootp和arp代理。vxworks網(wǎng)絡(luò)機制遵循標準的internet協(xié)議。


          windnet snmp
            windnet snmp代理將工業(yè)標準網(wǎng)絡(luò)管理引入實時嵌入系統(tǒng)中,windriver是第一個提供集成支持snmpv2c協(xié)議的snmp代理軟件的嵌入產(chǎn)品廠商。windnet snmp v1/v2c代理只需要很少的內(nèi)存,并和傳輸層獨立,可以在不同的協(xié)議棧上使用同一個代理程序,只需要配置其初始化過程。windnet snmp代理支持rfc 1155、 rfc 1157、rfc 1212、rfc 1213及rfc 1901等協(xié)議。
            windnet snmp v1/v2c代理軟件提供mib工具可以減輕操作mib文檔費時而且易錯的工作,mib工具將簡明的mib格式或snmp v2c格式的mib文檔轉(zhuǎn)化成代理使用的更高效的文件格式。mib編譯器產(chǎn)生訪問mib變量的函數(shù)代碼,減輕了開發(fā)工作。vxworks操作系統(tǒng)還有穩(wěn)定可靠、實時性好、可縮放裁剪、開放性好、易用等優(yōu)點,再加上強大的網(wǎng)絡(luò)功能,特別適合于網(wǎng)絡(luò)設(shè)備的開發(fā)。
            網(wǎng)絡(luò)管理工作站(管理站)通常是一臺pc或工作站,管理整個網(wǎng)絡(luò)上的設(shè)備,管理站軟件不是windnet snmp v1/v2c的一部分,但windnet snmp v1/v2c可以和絕大部分管理站軟件一起工作,如hp openview和sunnet管理器。因為windnet snmp v1/v2c支持兩個協(xié)議,所以可以和運行snmpv1或snmpv2c的管理站通信。整個系統(tǒng)構(gòu)成如圖1所示。


          snmp代理的設(shè)計與實現(xiàn)
            1. snmp代理模塊工作流程
            snmp代理模塊包括6個子模塊,如圖2所示。
            snmp代理是一個單任務(wù),采用先進先出隊列,一次處理一個pdu。代理從管理站接收pdu后,對其進行語法分析,將其轉(zhuǎn)換成一個可用的內(nèi)部數(shù)據(jù)結(jié)構(gòu),將mib變量映射成本地變量,判斷請求的mib對象是否在代理的mib樹中,如果存在,調(diào)用對應(yīng)的mib變量處理例程來處理,命令執(zhí)行完之后,再將內(nèi)部數(shù)據(jù)格式轉(zhuǎn)換回asn.1格式創(chuàng)建響應(yīng)pdu,調(diào)用socket的sendto()函數(shù)將它發(fā)送給管理站。
            (1)初始化
            snmp代理在啟動時通過調(diào)用usrsnmpinit( )產(chǎn)生一個任務(wù)tsnmpd,進入任務(wù)的主要入口函數(shù)是snmpiomain( )。在初始化工作結(jié)束后,snmpiomain( )調(diào)用snmpdinitfinish( ),并由snmpdinitfinish( )向管理站發(fā)送trap,通知它代理已經(jīng)開始工作,然后進入消息處理循環(huán),如圖3所示。
            (2)消息處理循環(huán)
            首先支持例程snmpiobody( )在udp端口161收聽消息,收到消息后交給snmpdpktprocess()處理,snmpdpktprocess( )將消息傳給snmpiocommunityvalidate( ),snmpiocommunityvalidate( )驗證共同體名是否合法。共同體名的系統(tǒng)缺省設(shè)置為:對于具有共同體名pub或public的管理站只能執(zhí)行g(shù)et操作,而具有共同體名priv或private的管理站可以進行set操作。通過共同體名驗證后,代理調(diào)用用戶定義的mib訪問函數(shù),并將其所提供的信息構(gòu)成pdu,交給snmpiowrite( )返回給管理站。
            (3) 退出代理程序
            當用戶需要停止snmp代理,調(diào)用snmpdexit( ),由它調(diào)用 mib 中止例程并且釋放所有代理的資源,之后所有的snmp 服務(wù)都不再被支持。
            開發(fā)snmp代理主要包括兩方面的工作即mib的轉(zhuǎn)化和擴展mib,以下將分別介紹。
            2. mib的轉(zhuǎn)化
            由于mib都是用asn.1編寫的,需要將其轉(zhuǎn)化成c/c++的數(shù)據(jù)結(jié)構(gòu),才能用程序?qū)崿F(xiàn)。對mib文文件的轉(zhuǎn)化工作是費時而且易錯的,所幸的是windnet snmpv1/v2軟件包中提供的mibcomp可以將mib編譯成c代碼,并將每一個mib變量與其相應(yīng)的讀寫例程聯(lián)系在一起。具體操作過程如下。
            (1)檢查mib中是否存在錯誤
            這一步是對要轉(zhuǎn)化的mib(如example.mib)進行語法檢查,標準mib文件一般都定義得很規(guī)范,語法上很少出錯,而對于自定義的mib來說,這一步很重要,它可以幫助mib編寫者檢查一些疏忽的語法錯誤。它使用的命令如下。
          mibcomp -check example.mib
            (2)創(chuàng)建mib樹
            每個代理都有一棵自己支持的mib樹,如果管理站所要查詢或設(shè)置的變量不在該mib樹內(nèi),代理向管理站返回nosuchname 的錯誤信息。
            在創(chuàng)建mib樹的過程中,同時在mib樹中每個葉子結(jié)點中賦予get、set等操作的函數(shù)指針,使用如下命令生成c代碼文件exampletree.c。
            mibcomp -o exampletree.c -stub example.mib
            使用如下命令生成頭文件exampleleaf.h,它是用來定義每個葉子值的。
            mibcomp -o exampleleaf.h -leaf example.mib
            (3)生成例程函數(shù)的頭文件及c代碼文件
            通過使用mibcomp的-skel和-stub兩個參數(shù)可以分別生成例程函數(shù)相應(yīng)的用作函數(shù)聲明的頭文件和例程函數(shù)的c代碼文件。但是實際開發(fā)中發(fā)現(xiàn)生成c代碼不能適用要求,需要自己重新編寫。
            使用如下命令生成頭文件examplehead.h。
            mibcomp -o examplehead.h - skel example.mib
            使用如下命令生成c文件examplec.c。
            mibcomp -o examplec.c - stub example.mib
            (4)為管理站創(chuàng)建.rt文件
            .rt文件是用來向管理站說明代理的mib樹,通過如下命令生成。
            mibcomp -o examplemib.rt -readtree. example.mib
            至此,就基本上完成了mib的轉(zhuǎn)化工作。
            3.擴展mib的實現(xiàn)
            vxworks已經(jīng)完成對mib-ii的實現(xiàn),并支持擴展mib的實現(xiàn)。對mib的擴展實際上是為網(wǎng)絡(luò)設(shè)備所支持的各mib編寫訪問函數(shù),同時根據(jù)自己的需要對mib-ii的相關(guān)組重新編寫,具體過程如下。
            首先,利用mib編譯器可以把用asn.1語言描寫的mib文件編譯成c語言代碼的mib樹、get、set、next、test函數(shù)的接口及相應(yīng)的頭文件,極大地方便了代理軟件的開發(fā)。在mib樹的節(jié)點中存放了get,set,next,test函數(shù)的指針及一個稱為cookie的域,process_received_snmp_packed根據(jù)收到的pdu中的oid在mib樹中搜索到相應(yīng)的管理變量對應(yīng)的節(jié)點,然后調(diào)用這些函數(shù)從其他模塊得到具體實例值。
            然后為mib中的表型變量定義數(shù)據(jù)結(jié)構(gòu),存儲具體數(shù)值,以rfc1643中的統(tǒng)計組舉例如下。
            typedef struct
              {
                unsigned long dot3statsindex;
                unsigned long dot3statsalignmenterrors;
                unsigned long dot3statsinternalmactransmiterrors;
                ... ...
                m2_objectid dot3statsetherchipset;
               } dot3_statistic_table; /*rfc1643統(tǒng)計表結(jié)構(gòu)*/
            第三步是編寫訪問函數(shù), snmp代理的代碼編寫工作集中在訪問函數(shù)的編寫上。如前所述,在創(chuàng)建代理mib樹時,訪問函數(shù)名已經(jīng)賦給了mib樹葉節(jié)點中的訪問函數(shù)指針,這樣當查找到相應(yīng)的葉子節(jié)點時,就會通過訪問函數(shù)指針調(diào)用相應(yīng)的訪問函數(shù)。訪問函數(shù)主要包括get函數(shù)、next函數(shù)、test函數(shù)、set函數(shù)以及undo函數(shù),其中g(shù)et函數(shù)、next函數(shù)、set函數(shù)分別完成對get、getnext、set命令的響應(yīng)。
            最后是編寫相關(guān)協(xié)議模塊與代理的接口函數(shù),通過這些接口函數(shù),可以獲得各種實際信息,比如通過交換芯片的驅(qū)動模塊,可以獲得實時的計數(shù)器信息;通過訪問內(nèi)存中的系統(tǒng)信息表,可以獲得有關(guān)系統(tǒng)的各種基本信息,等等。


          結(jié)束語
            windnet snmp v1/v2c代理軟件為開發(fā)網(wǎng)管代理提供了很多方便,它還支持主從式代理的概念,使主代理駐留在系統(tǒng)中核心部件,它和一般代理一樣實現(xiàn)各種功能,其他部件上運行從代理,從代理可以看成主代理的簡化版,有自己的mib樹,以及訪問函數(shù),從而使整個系統(tǒng)具備良好的性能和可擴展性。



          關(guān)鍵詞:

          評論


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