VxWorks与SNMP代理的开发

来源:互联网 发布:超好听的伤感网络歌曲 编辑:程序博客网 时间:2024/05/22 13:10
前言

  目前嵌入式应用领域的一个发展方向是采用实时操作系统(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树,以及访问函数,从而使整个系统具备良好的性能和可扩展性。