VxWorks與SNMP代理的開發(fā)(圖)
目前嵌入式應(yīng)用領(lǐng)域的一個(gè)發(fā)展方向是采用實(shí)時(shí)操作系統(tǒng)(real time operation system,rtos)。實(shí)時(shí)操作系統(tǒng)是一段在嵌入式系統(tǒng)啟動(dòng)后首先執(zhí)行的程序,用戶的應(yīng)用程序是運(yùn)行于rtos之上的各個(gè)任務(wù),rtos根據(jù)各個(gè)任務(wù)的要求,進(jìn)行資源管理、消息管理、任務(wù)調(diào)度、異常處理等工作。應(yīng)當(dāng)根據(jù)優(yōu)先級(jí)的高低對(duì)任務(wù)進(jìn)行切換,只有優(yōu)先服務(wù)方式的rtos才是真正的實(shí)時(shí)操作系統(tǒng),時(shí)間分片方式和協(xié)作方式的rtos都不是嚴(yán)格意義上的“實(shí)時(shí)”。vxworks是美國(guó)windriver公司于1983年開發(fā)的一種嵌入式實(shí)時(shí)操作系統(tǒng),以其良好的擴(kuò)展能力、高性能的內(nèi)核,以及友好的用戶開發(fā)環(huán)境,在嵌入式實(shí)時(shí)操作系統(tǒng)領(lǐng)域占據(jù)了重要的一席之地。
vxworks操作系統(tǒng)
vxworks 操作系統(tǒng)包括了進(jìn)程管理、存儲(chǔ)管理、設(shè)備管理、文件系統(tǒng)管理、網(wǎng)絡(luò)協(xié)議及系統(tǒng)應(yīng)用等幾個(gè)部分。vxworks只需很小的存儲(chǔ)空間,并可高度裁剪,保證了系統(tǒng)能以較高的效率運(yùn)行。vxworks主要由以下幾個(gè)部分組成。
1.操作系統(tǒng)核心
vxworks 的核心被稱作wind,用優(yōu)先級(jí)搶占方式進(jìn)行多任務(wù)調(diào)度,執(zhí)行任務(wù)間的同步、進(jìn)程間通信和中斷處理,對(duì)看門狗和內(nèi)存進(jìn)行管理。一個(gè)多任務(wù)環(huán)境允許實(shí)時(shí)應(yīng)用程序以一套獨(dú)立任務(wù)的方式構(gòu)筑,每個(gè)任務(wù)擁有獨(dú)立的執(zhí)行線程和自己的系統(tǒng)資源。進(jìn)程間通信機(jī)制可以保證任務(wù)的同步與協(xié)調(diào)。
wind使用中斷驅(qū)動(dòng)和優(yōu)先級(jí)的方式,縮短了上下文轉(zhuǎn)換的時(shí)間開銷和中斷時(shí)延。在vxworks中,任何例程都可以被啟動(dòng)為一個(gè)單獨(dú)的任務(wù),擁有自己的上下文和堆棧。還有一些其他的任務(wù)機(jī)制可以使任務(wù)掛起、繼續(xù)、刪除、延時(shí)或者改變優(yōu)先級(jí)。
wind核提供信號(hào)量作為任務(wù)間同步和互斥的標(biāo)志。wind核針對(duì)不同的應(yīng)用需求,有二進(jìn)制信號(hào)量、計(jì)數(shù)信號(hào)量、互斥信號(hào)量和 posix信號(hào)量幾種。這些信號(hào)量除了應(yīng)用在開發(fā)設(shè)計(jì)過程中,還被廣泛地應(yīng)用到vxworks高層應(yīng)用系統(tǒng)中。對(duì)于進(jìn)程間通信,wind 核也提供了諸如消息隊(duì)列、管道、套接字和信號(hào)等機(jī)制。
2.i/o 系統(tǒng)
vxworks提供了一個(gè)快速靈活、與ansi c兼容的i/o系統(tǒng),包括 unix 標(biāo)準(zhǔn)的緩沖i/o和 posix標(biāo)準(zhǔn)的異步i/o。vxworks 包括以下驅(qū)動(dòng)程序:網(wǎng)絡(luò)驅(qū)動(dòng)、管道驅(qū)動(dòng)、ram盤驅(qū)動(dòng)、scsi驅(qū)動(dòng)、鍵盤驅(qū)動(dòng)、顯示驅(qū)動(dòng)、磁盤驅(qū)動(dòng)、并口驅(qū)動(dòng)等。
3.文件系統(tǒng)
vxworks提供的快速文件系統(tǒng)適合于實(shí)時(shí)系統(tǒng)應(yīng)用,包括幾種支持使用塊設(shè)備的本地文件系統(tǒng)。這些設(shè)備都使用一個(gè)標(biāo)準(zhǔn)的接口從而使得文件系統(tǒng)能夠被靈活地在設(shè)備驅(qū)動(dòng)程序上移植。另外,vxworks 也支持scsi磁帶設(shè)備的本地文件系統(tǒng),vxworks i/o體系結(jié)構(gòu)甚至還支持在一個(gè)單獨(dú)的vxworks系統(tǒng)上同時(shí)并存幾個(gè)不同的文件系統(tǒng)。vxworks支持dosfs、rt11fs、rawfs和tapefs四種文件系統(tǒng)。
普通數(shù)據(jù)文件和外部設(shè)備都統(tǒng)一作為文件處理,使用相同的語法定義和保護(hù)機(jī)制,這樣既簡(jiǎn)化了系統(tǒng)設(shè)計(jì)又便于用戶使用。
4.板級(jí)支持包 bsp(board support package)
vxworks bsp包含了開發(fā)人員在特定的目標(biāo)機(jī)上運(yùn)行vxworks時(shí)所需的一切支持,包括支持特定目標(biāo)機(jī)的軟件(如驅(qū)動(dòng)程序等)和從主機(jī)通過網(wǎng)絡(luò)引導(dǎo)vxworks的boot rom。windriver提供支持不同廠商的200多種bsp,另外還提供bsp移植包,幫助用戶移植vxworks到特定硬件上。
5.網(wǎng)絡(luò)設(shè)施
vxworks的網(wǎng)絡(luò)結(jié)構(gòu)提供了對(duì)其他網(wǎng)絡(luò)和tcp/ip網(wǎng)絡(luò)系統(tǒng)的“透明”訪問,包括與bsd套接字兼容的編程接口、遠(yuǎn)程過程調(diào)用、遠(yuǎn)程文件訪問以及bootp和arp代理。vxworks網(wǎng)絡(luò)機(jī)制遵循標(biāo)準(zhǔn)的internet協(xié)議。
windnet snmp
windnet snmp代理將工業(yè)標(biāo)準(zhǔn)網(wǎng)絡(luò)管理引入實(shí)時(shí)嵌入系統(tǒng)中,windriver是第一個(gè)提供集成支持snmpv2c協(xié)議的snmp代理軟件的嵌入產(chǎn)品廠商。windnet snmp v1/v2c代理只需要很少的內(nèi)存,并和傳輸層獨(dú)立,可以在不同的協(xié)議棧上使用同一個(gè)代理程序,只需要配置其初始化過程。windnet snmp代理支持rfc 1155、 rfc 1157、rfc 1212、rfc 1213及rfc 1901等協(xié)議。
windnet snmp v1/v2c代理軟件提供mib工具可以減輕操作mib文檔費(fèi)時(shí)而且易錯(cuò)的工作,mib工具將簡(jiǎn)明的mib格式或snmp v2c格式的mib文檔轉(zhuǎn)化成代理使用的更高效的文件格式。mib編譯器產(chǎn)生訪問mib變量的函數(shù)代碼,減輕了開發(fā)工作。vxworks操作系統(tǒng)還有穩(wěn)定可靠、實(shí)時(shí)性好、可縮放裁剪、開放性好、易用等優(yōu)點(diǎn),再加上強(qiáng)大的網(wǎng)絡(luò)功能,特別適合于網(wǎng)絡(luò)設(shè)備的開發(fā)。
網(wǎng)絡(luò)管理工作站(管理站)通常是一臺(tái)pc或工作站,管理整個(gè)網(wǎng)絡(luò)上的設(shè)備,管理站軟件不是windnet snmp v1/v2c的一部分,但windnet snmp v1/v2c可以和絕大部分管理站軟件一起工作,如hp openview和sunnet管理器。因?yàn)閣indnet snmp v1/v2c支持兩個(gè)協(xié)議,所以可以和運(yùn)行snmpv1或snmpv2c的管理站通信。整個(gè)系統(tǒng)構(gòu)成如圖1所示。
snmp代理的設(shè)計(jì)與實(shí)現(xiàn)
1. snmp代理模塊工作流程
snmp代理模塊包括6個(gè)子模塊,如圖2所示。
snmp代理是一個(gè)單任務(wù),采用先進(jìn)先出隊(duì)列,一次處理一個(gè)pdu。代理從管理站接收pdu后,對(duì)其進(jìn)行語法分析,將其轉(zhuǎn)換成一個(gè)可用的內(nèi)部數(shù)據(jù)結(jié)構(gòu),將mib變量映射成本地變量,判斷請(qǐng)求的mib對(duì)象是否在代理的mib樹中,如果存在,調(diào)用對(duì)應(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代理在啟動(dòng)時(shí)通過調(diào)用usrsnmpinit( )產(chǎn)生一個(gè)任務(wù)tsnmpd,進(jìn)入任務(wù)的主要入口函數(shù)是snmpiomain( )。在初始化工作結(jié)束后,snmpiomain( )調(diào)用snmpdinitfinish( ),并由snmpdinitfinish( )向管理站發(fā)送trap,通知它代理已經(jīng)開始工作,然后進(jìn)入消息處理循環(huán),如圖3所示。
(2)消息處理循環(huán)
首先支持例程snmpiobody( )在udp端口161收聽消息,收到消息后交給snmpdpktprocess()處理,snmpdpktprocess( )將消息傳給snmpiocommunityvalidate( ),snmpiocommunityvalidate( )驗(yàn)證共同體名是否合法。共同體名的系統(tǒng)缺省設(shè)置為:對(duì)于具有共同體名pub或public的管理站只能執(zhí)行g(shù)et操作,而具有共同體名priv或private的管理站可以進(jìn)行set操作。通過共同體名驗(yàn)證后,代理調(diào)用用戶定義的mib訪問函數(shù),并將其所提供的信息構(gòu)成pdu,交給snmpiowrite( )返回給管理站。
(3) 退出代理程序
當(dāng)用戶需要停止snmp代理,調(diào)用snmpdexit( ),由它調(diào)用 mib 中止例程并且釋放所有代理的資源,之后所有的snmp 服務(wù)都不再被支持。
開發(fā)snmp代理主要包括兩方面的工作即mib的轉(zhuǎn)化和擴(kuò)展mib,以下將分別介紹。
2. mib的轉(zhuǎn)化
由于mib都是用asn.1編寫的,需要將其轉(zhuǎn)化成c/c++的數(shù)據(jù)結(jié)構(gòu),才能用程序?qū)崿F(xiàn)。對(duì)mib文文件的轉(zhuǎn)化工作是費(fèi)時(shí)而且易錯(cuò)的,所幸的是windnet snmpv1/v2軟件包中提供的mibcomp可以將mib編譯成c代碼,并將每一個(gè)mib變量與其相應(yīng)的讀寫例程聯(lián)系在一起。具體操作過程如下。
(1)檢查mib中是否存在錯(cuò)誤
這一步是對(duì)要轉(zhuǎn)化的mib(如example.mib)進(jìn)行語法檢查,標(biāo)準(zhǔn)mib文件一般都定義得很規(guī)范,語法上很少出錯(cuò),而對(duì)于自定義的mib來說,這一步很重要,它可以幫助mib編寫者檢查一些疏忽的語法錯(cuò)誤。它使用的命令如下。
mibcomp -check example.mib
(2)創(chuàng)建mib樹
每個(gè)代理都有一棵自己支持的mib樹,如果管理站所要查詢或設(shè)置的變量不在該mib樹內(nèi),代理向管理站返回nosuchname 的錯(cuò)誤信息。
在創(chuàng)建mib樹的過程中,同時(shí)在mib樹中每個(gè)葉子結(jié)點(diǎn)中賦予get、set等操作的函數(shù)指針,使用如下命令生成c代碼文件exampletree.c。
mibcomp -o exampletree.c -stub example.mib
使用如下命令生成頭文件exampleleaf.h,它是用來定義每個(gè)葉子值的。
mibcomp -o exampleleaf.h -leaf example.mib
(3)生成例程函數(shù)的頭文件及c代碼文件
通過使用mibcomp的-skel和-stub兩個(gè)參數(shù)可以分別生成例程函數(shù)相應(yīng)的用作函數(shù)聲明的頭文件和例程函數(shù)的c代碼文件。但是實(shí)際開發(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.?dāng)U展mib的實(shí)現(xiàn)
vxworks已經(jīng)完成對(duì)mib-ii的實(shí)現(xiàn),并支持?jǐn)U展mib的實(shí)現(xiàn)。對(duì)mib的擴(kuò)展實(shí)際上是為網(wǎng)絡(luò)設(shè)備所支持的各mib編寫訪問函數(shù),同時(shí)根據(jù)自己的需要對(duì)mib-ii的相關(guān)組重新編寫,具體過程如下。
首先,利用mib編譯器可以把用asn.1語言描寫的mib文件編譯成c語言代碼的mib樹、get、set、next、test函數(shù)的接口及相應(yīng)的頭文件,極大地方便了代理軟件的開發(fā)。在mib樹的節(jié)點(diǎn)中存放了get,set,next,test函數(shù)的指針及一個(gè)稱為cookie的域,process_received_snmp_packed根據(jù)收到的pdu中的oid在mib樹中搜索到相應(yīng)的管理變量對(duì)應(yīng)的節(jié)點(diǎn),然后調(diào)用這些函數(shù)從其他模塊得到具體實(shí)例值。
然后為mib中的表型變量定義數(shù)據(jù)結(jié)構(gòu),存儲(chǔ)具體數(shù)值,以rfc1643中的統(tǒng)計(jì)組舉例如下。
typedef struct
{
unsigned long dot3statsindex;
unsigned long dot3statsalignmenterrors;
unsigned long dot3statsinternalmactransmiterrors;
... ...
m2_objectid dot3statsetherchipset;
} dot3_statistic_table; /*rfc1643統(tǒng)計(jì)表結(jié)構(gòu)*/
第三步是編寫訪問函數(shù), snmp代理的代碼編寫工作集中在訪問函數(shù)的編寫上。如前所述,在創(chuàng)建代理mib樹時(shí),訪問函數(shù)名已經(jīng)賦給了mib樹葉節(jié)點(diǎn)中的訪問函數(shù)指針,這樣當(dāng)查找到相應(yīng)的葉子節(jié)點(diǎn)時(shí),就會(huì)通過訪問函數(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ù)分別完成對(duì)get、getnext、set命令的響應(yīng)。
最后是編寫相關(guān)協(xié)議模塊與代理的接口函數(shù),通過這些接口函數(shù),可以獲得各種實(shí)際信息,比如通過交換芯片的驅(qū)動(dòng)模塊,可以獲得實(shí)時(shí)的計(jì)數(shù)器信息;通過訪問內(nèi)存中的系統(tǒng)信息表,可以獲得有關(guān)系統(tǒng)的各種基本信息,等等。
結(jié)束語
windnet snmp v1/v2c代理軟件為開發(fā)網(wǎng)管代理提供了很多方便,它還支持主從式代理的概念,使主代理駐留在系統(tǒng)中核心部件,它和一般代理一樣實(shí)現(xiàn)各種功能,其他部件上運(yùn)行從代理,從代理可以看成主代理的簡(jiǎn)化版,有自己的mib樹,以及訪問函數(shù),從而使整個(gè)系統(tǒng)具備良好的性能和可擴(kuò)展性。
評(píng)論