前言 目前嵌入式應用領(lǐng)域的一個(gè)發(fā)展方向是采用實(shí)時(shí)操作系統(Real Time Operation System,RTOS)。實(shí)時(shí)操作系統是一段在嵌入式系統啟動(dòng)后首先執行的程序,用戶(hù)的應用程序是運行于RTOS之上的各個(gè)任務(wù),RTOS根據各個(gè)任務(wù)的要求,進(jìn)行資源管理、消息管理、任務(wù)調度、異常處理等工作。應當根據優(yōu)先級的高低對任務(wù)進(jìn)行切換,只有優(yōu)先服務(wù)方式的RTOS才是真正的實(shí)時(shí)操作系統,時(shí)間分片方式和協(xié)作方式的RTOS都不是嚴格意義上的“實(shí)時(shí)”。VxWorks是美國WindRiver公司于1983年開(kāi)發(fā)的一種嵌入式實(shí)時(shí)操作系統,以其良好的擴展能力、高性能的內核,以及友好的用戶(hù)開(kāi)發(fā)環(huán)境,在嵌入式實(shí)時(shí)操作系統領(lǐng)域占據了重要的一席之地。 VxWorks操作系統 VxWorks 操作系統包括了進(jìn)程管理、存儲管理、設備管理、文件系統管理、網(wǎng)絡(luò )協(xié)議及系統應用等幾個(gè)部分。VxWorks只需很小的存儲空間,并可高度裁剪,保證了系統能以較高的效率運行。VxWorks主要由以下幾個(gè)部分組成。 1.操作系統核心 VxWorks 的核心被稱(chēng)作wind,用優(yōu)先級搶占方式進(jìn)行多任務(wù)調度,執行任務(wù)間的同步、進(jìn)程間通信和中斷處理,對看門(mén)狗和內存進(jìn)行管理。一個(gè)多任務(wù)環(huán)境允許實(shí)時(shí)應用程序以一套獨立任務(wù)的方式構筑,每個(gè)任務(wù)擁有獨立的執行線(xiàn)程和自己的系統資源。進(jìn)程間通信機制可以保證任務(wù)的同步與協(xié)調。 wind使用中斷驅動(dòng)和優(yōu)先級的方式,縮短了上下文轉換的時(shí)間開(kāi)銷(xiāo)和中斷時(shí)延。在VxWorks中,任何例程都可以被啟動(dòng)為一個(gè)單獨的任務(wù),擁有自己的上下文和堆棧。還有一些其他的任務(wù)機制可以使任務(wù)掛起、繼續、刪除、延時(shí)或者改變優(yōu)先級。 wind核提供信號量作為任務(wù)間同步和互斥的標志。wind核針對不同的應用需求,有二進(jìn)制信號量、計數信號量、互斥信號量和 POSIX信號量幾種。這些信號量除了應用在開(kāi)發(fā)設計過(guò)程中,還被廣泛地應用到VxWorks高層應用系統中。對于進(jìn)程間通信,wind 核也提供了諸如消息隊列、管道、套接字和信號等機制。 2.I/O 系統 VxWorks提供了一個(gè)快速靈活、與ANSI C兼容的I/O系統,包括 UNIX 標準的緩沖I/O和 POSIX標準的異步I/O。VxWorks 包括以下驅動(dòng)程序:網(wǎng)絡(luò )驅動(dòng)、管道驅動(dòng)、RAM盤(pán)驅動(dòng)、SCSI驅動(dòng)、鍵盤(pán)驅動(dòng)、顯示驅動(dòng)、磁盤(pán)驅動(dòng)、并口驅動(dòng)等。 3.文件系統 VxWorks提供的快速文件系統適合于實(shí)時(shí)系統應用,包括幾種支持使用塊設備的本地文件系統。這些設備都使用一個(gè)標準的接口從而使得文件系統能夠被靈活地在設備驅動(dòng)程序上移植。另外,VxWorks 也支持SCSI磁帶設備的本地文件系統,VxWorks I/O體系結構甚至還支持在一個(gè)單獨的VxWorks系統上同時(shí)并存幾個(gè)不同的文件系統。VxWorks支持dosFs、rt11Fs、rawFs和tapeFs四種文件系統。 普通數據文件和外部設備都統一作為文件處理,使用相同的語(yǔ)法定義和保護機制,這樣既簡(jiǎn)化了系統設計又便于用戶(hù)使用。 4.板級支持包 BSP(Board Support Package) VxWorks BSP包含了開(kāi)發(fā)人員在特定的目標機上運行VxWorks時(shí)所需的一切支持,包括支持特定目標機的軟件(如驅動(dòng)程序等)和從主機通過(guò)網(wǎng)絡(luò )引導VxWorks的Boot ROM。WindRiver提供支持不同廠(chǎng)商的200多種BSP,另外還提供BSP移植包,幫助用戶(hù)移植VxWorks到特定硬件上。 5.網(wǎng)絡(luò )設施 VxWorks的網(wǎng)絡(luò )結構提供了對其他網(wǎng)絡(luò )和TCP/IP網(wǎng)絡(luò )系統的“透明”訪(fǎng)問(wèn),包括與BSD套接字兼容的編程接口、遠程過(guò)程調用、遠程文件訪(fǎng)問(wèn)以及BOOTP和ARP代理。VxWorks網(wǎng)絡(luò )機制遵循標準的Internet協(xié)議。 WindNet SNMP WindNet SNMP代理將工業(yè)標準網(wǎng)絡(luò )管理引入實(shí)時(shí)嵌入系統中,WindRiver是第一個(gè)提供集成支持SNMPv2c協(xié)議的SNMP代理軟件的嵌入產(chǎn)品廠(chǎng)商。WindNet SNMP v1/v2c代理只需要很少的內存,并和傳輸層獨立,可以在不同的協(xié)議棧上使用同一個(gè)代理程序,只需要配置其初始化過(guò)程。WindNet SNMP代理支持RFC 1155、 RFC 1157、RFC 1212、RFC 1213及RFC 1901等協(xié)議。 WindNet SNMP v1/v2c代理軟件提供MIB工具可以減輕操作MIB文檔費時(shí)而且易錯的工作,MIB工具將簡(jiǎn)明的MIB格式或SNMP v2c格式的MIB文檔轉化成代理使用的更高效的文件格式。MIB編譯器產(chǎn)生訪(fǎng)問(wèn)MIB變量的函數代碼,減輕了開(kāi)發(fā)工作。VxWorks操作系統還有穩定可靠、實(shí)時(shí)性好、可縮放裁剪、開(kāi)放性好、易用等優(yōu)點(diǎn),再加上強大的網(wǎng)絡(luò )功能,特別適合于網(wǎng)絡(luò )設備的開(kāi)發(fā)。 網(wǎng)絡(luò )管理工作站(管理站)通常是一臺PC或工作站,管理整個(gè)網(wǎng)絡(luò )上的設備,管理站軟件不是WindNet SNMP v1/v2c的一部分,但WindNet SNMP v1/v2c可以和絕大部分管理站軟件一起工作,如HP OpenView和SunNet管理器。因為WindNet SNMP v1/v2c支持兩個(gè)協(xié)議,所以可以和運行SNMPv1或SNMPv2c的管理站通信。整個(gè)系統構成如圖1所示。 SNMP代理的設計與實(shí)現 1. SNMP代理模塊工作流程 SNMP代理模塊包括6個(gè)子模塊,如圖2所示。 SNMP代理是一個(gè)單任務(wù),采用先進(jìn)先出隊列,一次處理一個(gè)PDU。代理從管理站接收PDU后,對其進(jìn)行語(yǔ)法分析,將其轉換成一個(gè)可用的內部數據結構,將MIB變量映射成本地變量,判斷請求的MIB對象是否在代理的MIB樹(shù)中,如果存在,調用對應的MIB變量處理例程來(lái)處理,命令執行完之后,再將內部數據格式轉換回ASN.1格式創(chuàng )建響應PDU,調用Socket的sendto()函數將它發(fā)送給管理站。 (1)初始化 SNMP代理在啟動(dòng)時(shí)通過(guò)調用usrSnmpInit( )產(chǎn)生一個(gè)任務(wù)tSnmpd,進(jìn)入任務(wù)的主要入口函數是snmpIoMain( )。在初始化工作結束后,snmpIoMain( )調用snmpdInitFinish( ),并由snmpdInitFinish( )向管理站發(fā)送trap,通知它代理已經(jīng)開(kāi)始工作,然后進(jìn)入消息處理循環(huán),如圖3所示。 (2)消息處理循環(huán) 首先支持例程snmpIoBody( )在UDP端口161收聽(tīng)消息,收到消息后交給snmpdPktProcess()處理,snmpdPktProcess( )將消息傳給snmpIoCommunityValidate( ),snmpIoCommunityValidate( )驗證共同體名是否合法。共同體名的系統缺省設置為:對于具有共同體名pub或public的管理站只能執行g(shù)et操作,而具有共同體名priv或private的管理站可以進(jìn)行set操作。通過(guò)共同體名驗證后,代理調用用戶(hù)定義的MIB訪(fǎng)問(wèn)函數,并將其所提供的信息構成pdu,交給snmpIoWrite( )返回給管理站。 (3) 退出代理程序 當用戶(hù)需要停止snmp代理,調用snmpdExit( ),由它調用 MIB 中止例程并且釋放所有代理的資源,之后所有的SNMP 服務(wù)都不再被支持。 開(kāi)發(fā)SNMP代理主要包括兩方面的工作即MIB的轉化和擴展MIB,以下將分別介紹。 2. MIB的轉化 由于MIB都是用ASN.1編寫(xiě)的,需要將其轉化成C/C++的數據結構,才能用程序實(shí)現。對MIB文文件的轉化工作是費時(shí)而且易錯的,所幸的是WindNet SNMPv1/v2軟件包中提供的mibcomp可以將MIB編譯成c代碼,并將每一個(gè)MIB變量與其相應的讀寫(xiě)例程聯(lián)系在一起。具體操作過(guò)程如下。 (1)檢查MIB中是否存在錯誤 這一步是對要轉化的MIB(如example.mib)進(jìn)行語(yǔ)法檢查,標準MIB文件一般都定義得很規范,語(yǔ)法上很少出錯,而對于自定義的MIB來(lái)說(shuō),這一步很重要,它可以幫助MIB編寫(xiě)者檢查一些疏忽的語(yǔ)法錯誤。它使用的命令如下。 mibcomp -check example.mib (2)創(chuàng )建MIB樹(shù) 每個(gè)代理都有一棵自己支持的MIB樹(shù),如果管理站所要查詢(xún)或設置的變量不在該MIB樹(shù)內,代理向管理站返回noSuchName 的錯誤信息。 在創(chuàng )建MIB樹(shù)的過(guò)程中,同時(shí)在MIB樹(shù)中每個(gè)葉子結點(diǎn)中賦予get、set等操作的函數指針,使用如下命令生成c代碼文件exampleTree.c。 mibcomp -o exampleTree.c -stub example.mib 使用如下命令生成頭文件exampleLeaf.h,它是用來(lái)定義每個(gè)葉子值的。 mibcomp -o exampleLeaf.h -leaf example.mib (3)生成例程函數的頭文件及c代碼文件 通過(guò)使用mibcomp的-skel和-stub兩個(gè)參數可以分別生成例程函數相應的用作函數聲明的頭文件和例程函數的c代碼文件。但是實(shí)際開(kāi)發(fā)中發(fā)現生成c代碼不能適用要求,需要自己重新編寫(xiě)。 使用如下命令生成頭文件exampleHead.h。 mibcomp -o exampleHead.h - skel example.mib 使用如下命令生成c文件exampleC.c。 mibcomp -o exampleC.c - stub example.mib (4)為管理站創(chuàng )建.rt文件 .rt文件是用來(lái)向管理站說(shuō)明代理的MIB樹(shù),通過(guò)如下命令生成。 mibcomp -o exampleMib.rt -readtree. example.mib 至此,就基本上完成了MIB的轉化工作。 3.擴展MIB的實(shí)現 Vxworks已經(jīng)完成對MIB-II的實(shí)現,并支持擴展MIB的實(shí)現。對MIB的擴展實(shí)際上是為網(wǎng)絡(luò )設備所支持的各MIB編寫(xiě)訪(fǎng)問(wèn)函數,同時(shí)根據自己的需要對MIB-II的相關(guān)組重新編寫(xiě),具體過(guò)程如下。 首先,利用MIB編譯器可以把用ASN.1語(yǔ)言描寫(xiě)的MIB文件編譯成C語(yǔ)言代碼的MIB樹(shù)、Get、Set、Next、Test函數的接口及相應的頭文件,極大地方便了代理軟件的開(kāi)發(fā)。在MIB樹(shù)的節點(diǎn)中存放了get,set,next,test函數的指針及一個(gè)稱(chēng)為cookie的域,process_received_SNMP_packed根據收到的PDU中的OID在MIB樹(shù)中搜索到相應的管理變量對應的節點(diǎn),然后調用這些函數從其他模塊得到具體實(shí)例值。 然后為MIB中的表型變量定義數據結構,存儲具體數值,以RFC1643中的統計組舉例如下。 typedef struct { unsigned long dot3StatsIndex; unsigned long dot3StatsAlignmentErrors; unsigned long dot3StatsInternalMacTransmitErrors; ... ... M2_OBJECTID dot3StatsEtherChipSet; } DOT3_STATISTIC_TABLE; /*rfc1643統計表結構*/ 第三步是編寫(xiě)訪(fǎng)問(wèn)函數, SNMP代理的代碼編寫(xiě)工作集中在訪(fǎng)問(wèn)函數的編寫(xiě)上。如前所述,在創(chuàng )建代理MIB樹(shù)時(shí),訪(fǎng)問(wèn)函數名已經(jīng)賦給了MIB樹(shù)葉節點(diǎn)中的訪(fǎng)問(wèn)函數指針,這樣當查找到相應的葉子節點(diǎn)時(shí),就會(huì )通過(guò)訪(fǎng)問(wèn)函數指針調用相應的訪(fǎng)問(wèn)函數。訪(fǎng)問(wèn)函數主要包括Get函數、Next函數、Test函數、Set函數以及Undo函數,其中Get函數、Next函數、Set函數分別完成對Get、GetNext、Set命令的響應。 最后是編寫(xiě)相關(guān)協(xié)議模塊與代理的接口函數,通過(guò)這些接口函數,可以獲得各種實(shí)際信息,比如通過(guò)交換芯片的驅動(dòng)模塊,可以獲得實(shí)時(shí)的計數器信息;通過(guò)訪(fǎng)問(wèn)內存中的系統信息表,可以獲得有關(guān)系統的各種基本信息,等等。 結束語(yǔ) WindNet SNMP v1/v2c代理軟件為開(kāi)發(fā)網(wǎng)管代理提供了很多方便,它還支持主從式代理的概念,使主代理駐留在系統中核心部件,它和一般代理一樣實(shí)現各種功能,其他部件上運行從代理,從代理可以看成主代理的簡(jiǎn)化版,有自己的MIB樹(shù),以及訪(fǎng)問(wèn)函數,從而使整個(gè)系統具備良好的性能和可擴展性。 |