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