VxWorks與SNMP代理的開發(fā)
目前嵌入式應(yīng)用領(lǐng)域的一個發(fā)展方向是采用實時操作系統(tǒng)(Real Time Operation System,RTOS)。實時操作系統(tǒng)是一段在嵌入式系統(tǒng)啟動后首先執(zhí)行的程序,用戶的應(yīng)用程序是運行于RTOS之上的各個任務(wù),RTOS根據(jù)各個任務(wù)的要求,進(jìn)行資源管理、消息管理、任務(wù)調(diào)度、異常處理等工作。應(yīng)當(dāng)根據(jù)優(yōu)先級的高低對任務(wù)進(jìn)行切換,只有優(yōu)先服務(wù)方式的RTOS才是真正的實時操作系統(tǒng),時間分片方式和協(xié)作方式的RTOS都不是嚴(yán)格意義上的“實時”。VxWorks是美國WindRiver公司于1983年開發(fā)的一種嵌入式實時操作系統(tǒng),以其良好的擴展能力、高性能的內(nèi)核,以及友好的用戶開發(fā)環(huán)境,在嵌入式實時操作系統(tǒng)領(lǐng)域占據(jù)了重要的一席之地。
VxWorks操作系統(tǒng)
VxWorks 操作系統(tǒng)包括了進(jìn)程管理、存儲管理、設(shè)備管理、文件系統(tǒng)管理、網(wǎng)絡(luò)協(xié)議及系統(tǒng)應(yīng)用等幾個部分。VxWorks只需很小的存儲空間,并可高度裁剪,保證了系統(tǒng)能以較高的效率運行。VxWorks主要由以下幾個部分組成。
1.操作系統(tǒng)核心
VxWorks 的核心被稱作wind,用優(yōu)先級搶占方式進(jìn)行多任務(wù)調(diào)度,執(zhí)行任務(wù)間的同步、進(jìn)程間通信和中斷處理,對看門狗和內(nèi)存進(jìn)行管理。一個多任務(wù)環(huán)境允許實時應(yīng)用程序以一套獨立任務(wù)的方式構(gòu)筑,每個任務(wù)擁有獨立的執(zhí)行線程和自己的系統(tǒng)資源。進(jìn)程間通信機制可以保證任務(wù)的同步與協(xié)調(diào)。
wind使用中斷驅(qū)動和優(yōu)先級的方式,縮短了上下文轉(zhuǎn)換的時間開銷和中斷時延。在VxWorks中,任何例程都可以被啟動為一個單獨的任務(wù),擁有自己的上下文和堆棧。還有一些其他的任務(wù)機制可以使任務(wù)掛起、繼續(xù)、刪除、延時或者改變優(yōu)先級。
wind核提供信號量作為任務(wù)間同步和互斥的標(biāo)志。wind核針對不同的應(yīng)用需求,有二進(jìn)制信號量、計數(shù)信號量、互斥信號量和 POSIX信號量幾種。這些信號量除了應(yīng)用在開發(fā)設(shè)計過程中,還被廣泛地應(yīng)用到VxWorks高層應(yīng)用系統(tǒng)中。對于進(jìn)程間通信,wind 核也提供了諸如消息隊列、管道、套接字和信號等機制。
2.I/O 系統(tǒng)
VxWorks提供了一個快速靈活、與ANSI C兼容的I/O系統(tǒng),包括 UNIX 標(biāo)準(zhǔn)的緩沖I/O和 POSIX標(biāo)準(zhǔn)的異步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è)備都使用一個標(biāo)準(zhǔn)的接口從而使得文件系統(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ā)人員在特定的目標(biāo)機上運行VxWorks時所需的一切支持,包括支持特定目標(biāo)機的軟件(如驅(qū)動程序等)和從主機通過網(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)提供了對其他網(wǎng)絡(luò)和TCP/IP網(wǎng)絡(luò)系統(tǒng)的“透明”訪問,包括與BSD套接字兼容的編程接口、遠(yuǎn)程過程調(diào)用、遠(yuǎn)程文件訪問以及BOOTP和ARP代理。VxWorks網(wǎng)絡(luò)機制遵循標(biāo)準(zhǔn)的Internet協(xié)議。
WindNet SNMP
WindNet SNMP代理將工業(yè)標(biāo)準(zhǔn)網(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ù),采用先進(jìn)先出隊列,一次處理一個PDU。代理從管理站接收PDU后,對其進(jìn)行語法分析,將其轉(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,進(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( )驗證共同體名是否合法。共同體名的系統(tǒng)缺省設(shè)置為:對于具有共同體名pub或public的管理站只能執(zhí)行g(shù)et操作,而具有共同體名priv或private的管理站可以進(jìn)行set操作。通過共同體名驗證后,代理調(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)化和擴展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)進(jìn)行語法檢查,標(biāo)準(zhǔn)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.?dāng)U展MIB的實現(xiàn)
Vxworks已經(jīng)完成對MIB-II的實現(xiàn),并支持?jǐn)U展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ù)指針,這樣當(dāng)查找到相應(yīng)的葉子節(jié)點時,就會通過訪問函數(shù)指針調(diào)用相應(yīng)的訪問函數(shù)。訪問函數(shù)主要包括Get函數(shù)、Next函數(shù)、Test函數(shù)、Set函數(shù)以及Undo函數(shù),其中Get函數(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)具備良好的性能和可擴展性。
評論
查看更多