5.文件系统
VxWorks提供了强大的本几文件系统供使用。提供了与MS-DOS兼容的FAT32文件系统,另外还提供支持硬盘、CD-ROM、磁带设备和FLASH的文件系统,并且在一个VxWorks系统中,允许多个文件系统同时存在。VxWorks文件系统中,文件名可以设成是大小写敏感的,并且长度不限于DOS中的8+3。
VxWorks中,文件的读写接口是标准接口:fopen(), fclose(), fread(), fwirte(), fseek()。
VxWorks支持磁带文件系统,对于磁带,其实是被看成一个大文件来读写,没有文件夹。所有对该文件的操作都是从磁带起始位置开始的。
另外VxWorks提供的TrueFFS文件系统,是支持FLASH设备的;VxWorks提供的TSFS文件系统,是支持 网络功能的,它可以用来实现和Tornado服务器程序通信,从而在服务器上存取本机文件。
6.网络功能(需要再看network program 文档)
VxWorks的网络功能是通过socket来实现的,它提供了与BSD一致的socket接口。即socket(), read(), write(), close(),connect()等。并且同样可以使用TCP或UDP协议作为传输层的传输协议。所谓socket就是对TCP或UDP协议、IP地址和端口的绑定,它是唯一的。
VxWorks的网络功能也是很强大的,它提供的网络驱动接口MUX,运行在IP层和数据链路层之间,从而用户可以在MUX中加进自己的协议,并且用户还可以增加自己的网络驱动。VxWorks的网络功能主要包括下面的内容:
(1) 数据链路层
(2) TCP/IP协议族
(3) 网络配置协议族
(4) 选路协议
(5) SOCKET API接口
(6) DNS(域名解析系统)
(7) 简单时间传送协议和远程进程调用
(8) 远程文件的存取和PING、TELNET功能
下面详细讲述各部分内容:
(1) 数据链路层
数据链路层是硬件驱动层,它是上层协议的基础,VxWorks给数据链路层提供了三种驱动:以太网驱动;SLIP(串行线协议驱动);共享内存网络驱动。其PPP协议的实现包括:PAP(PPP认证协议)、IPCP(PPP以太网控制协议)和PPP协议。它所实现的PPP协议有下面的特点:
① 客户端和服务器连接功能的支持;
② 有16个PPP连接可以被同时激活;
③ 可以指定控制字符以免被底层MODEM软件误解;
④ VJ压缩功能,可以把40 bytes的TCP/IP头压缩至3~8bytes;
⑤ PPP协议的地址控制和协议字段同样有压缩功能;
⑥ 具有PPP连接状态查询功能,这样用户可以监测PPP连接;
⑦ IP地址协商功能,一个主机可以通过协商为另一个主机分配IP地址;
⑧ 具有数据回显和数据应答功能;
⑨ 用户可以为PPP的连接和断开设置钩子函数,这样用户就可以知道每一个PPP连接和断开的过程;
⑩ 提供了握手认证协议和口令认证协议功能以及代理服务器路由功能。
它的不足之处是:
最多只有16个PPP连接;并且驱动是串口驱动,没有提供对MODEM或者以
太网卡驱动的支持;只支持标准的CHAP(客户握手认证协议)而不支持微软的扩展CHAP,如果想要支持扩展CHAP,只有使用WindNet的PPP产品。
SLIP和PPP协议都是用于两台终端之间的互相通信,但它们各有优缺点,如下表所示:
协议 功能 |
SLIP |
PPP |
效率 |
高 |
低 |
支持上层协议 |
IP |
IP及用户自定义 |
可扩展性 |
差 |
好 |
错误校验 |
无 |
有(CRC 校验) |
对连接的管理 |
无 |
有,可对主机之间的连接进行管理,例如修改选项和身份认证等,选项协商为主机之间修改各自的选项提供了机会,例如,一台主机可以通过PPP协议协商来限制另一台主机的PPP连接数目 |
需要注意的是,PPP所提供的身份认证功能,客户端会不停的向服务器端发送
ID/PASSWORD直到通过了认证或者连接中止,并且密码是以明文方式发送的,这样对于重复攻击没有防御能力。而CHAP协议具有更好的安全性,它是需要客户端通过哈希算法根据一定的数据算出一个值,发送到服务器端,服务器把该值与自己计算的值相比较,从而决定能否通过认证。
另外,VxWorks还提供了DES加密算法包,可对用户密码进行加密,这样为认
证过程又提供了安全性。用户还可以调用usrPPPInit()来重新配置PPP结构中的选项,例如可以设置建立一个PPP连接的超时时间。用户调用pppInit()也可以达到同样的目的,与usrPPPInit()不同的是,pppInit()可在运行时调用,其传入的参数是一个PPP_OPTIONS的结构,修改其中相应的字段即可修改PPP连接参数。或者用户也可以修改配置文件来修改PPP参数。
VxWorks向用户提供了众多的参数供修改:是否显示调试信息;是否在协商IP地址成功后,把对方添加进路由表;是否允许IP地址协商功能;是否使用密码数据库作为密码认证。另外,用户可以调用pppInfoGet()来判断一个PPP连接是否成功,有两种途径来删除一个PPP连接:
从对方主机接收到一个断开请求的数据包;调用pppDelete()。
值得注意的是,重启机器或者删除一个任务并不会断开一个PPP连接,而只会断开TCP/IP的连接。
VxWorks对于PPP的默认设置是,只能作为客户端发送认证信息,而不能作为服务器来验证用户的认证请求。当然用户可以修改默认参数。
VxWorks还提供共享内存网络驱动作为同一台主机上的多个CPU间的通信手段,作为同一台主机上的多个CPU,都有一个单独的IP地址,都可以单独与网络上的其它主机通信,同样,多个CPU之间也可以使用SOCKET互相通信。
(2) TCP/IP协议族
TCP/IP协议运行于链路层之上,VxWorks除提供对TCP/IP的标准支持外,还有自己的特点。在VxWorks中,TCP/IP参数可以在运行时修 改 ,用户可以手动修 改路由表,通常在系统中,这是由选路协议自动修改的。VxWorks提供的可修改的TCP/IP部分参数如下表所示:
参数宏 |
意义 |
TCP_SND_SIZE_DFLT |
TCP默认发送缓存大小 |
TCP_RCV_SIZE_DFLT |
TCP默认接收缓存大小 |
TCP_CON_TIMEO_DFLT |
TCP默认连接超时时间 |
IP_TTL_DFLT |
IP包的最大HOPS数目 |
IP_QLEN_DFLT |
IP包的队列大小(即最多可同时存放多少个IP包) |
VxWorks提供的众多参数为开发者提供了最大的灵活性,但是用户在修改TCP的接收窗口大小(Window size)时,必须在调用connect()或listen()之前,因为窗口大小是在调用connect()时协商决定的,所以如果在调用之后修改数据包窗口大小,就没有任何作用,因为这时窗口大小已协商完毕。VxWorks默认的接收窗口大小是258,111 bytes,当接收缓存满时,window size自动变为0。此外,VxWorks提供的丰富的接口又为开发者提供了便捷,部分函数如下图所示
函数名 |
功能 |
ipAttach() |
绑定一个IP地址到本机 |
ipDetach() |
去处绑定的IP地址 |
ifMaskSet() |
设置子网掩码 |
MRouteAdd() |
添加路由 |
mRouteDelete() |
删除路由 |
VxWorks默认包含四个协议模块:TCP、UDP、ICMP、IGMP,用户也可以根据自己的需求添加或减少协议。TCP和UDP都是传输层的协议,但是它们有很大的不同,如下表所示:
协议 特征 |
TCP |
UDP |
传输形式 |
字节流 |
数据报文 |
开销 |
大 |
小 |
可靠性 |
好 |
差 |
传输数据前是否需要建立连接 |
需要 |
不需要 |
VxWorks中协议栈所用的内存空间是单独分配的,是以扇区的形式分配的。每个扇区的大小和扇区的总数决定了协议栈所用的内存大小。它是存放在表clDescTbl中的,用户可以修改它。而且VxWorks提供了多种扇区,如64 bytes大小的,128 bytes大小的等。用户也可以指定自己的扇区大小,但是不能有两种扇区,它们的大小在2的两个连续幂之间,如34和49不能同时指定,因为它们都位于32和64之间。
VxWorks用mBlk和cBlk结构来存放协议栈所用的数据。mBlk结构变量以链表形式存储,这样只用知道链表头,就可以得到全部数据。mBlk结构中包含一个cBlk结构变量,从而多个mBlk结构可以共享一个cBlk,进而共享其数据,这样提高了数据传输的效率,而不用拷贝。使用cBlk结构而不直接使用指针存储数据的好处是,cBlk结构中保含了一个变量,用来记录有多少mBlk公用了它,从而在释放其数据空间时可以相应处理。如果cBlk被引用的数目减少到0,那么它将自动被从内存中删除。
用户还可以调用netMblkClChainGet()来分配一个mBlk块,并设定其内容,在用户使用完该块后,调用netMblkClChainFree()来释放它。
VxWorks还提供了ping功能,接口函数是ping(主机名,次数,选项)。用来查看和远程的主机是否可以连通。如果ping发送的数据包无法到达目的主机,那么接收到该数据包的最后一个路由将返回一个ICMP错误报文。
在VxWorks中,除调用API接口来绑定IP到本机、设置子网掩码等外,还可以从boot行设定,格式是:e = IP:子网掩码
对于广播地址,VxWorks有两种认定,IP地址中,除子网掩码外的所有bit均为1或0。但RFC标准规定的是应该全为1,VxWorks这样作是为了和一些老的系统相兼容。
路由表中的条目可以分为三种:本机路由,静态路由和由RIP协议动态添加的路由。用户可以调用routeProtoPrioritySet()来设定各种路由的优先级。
VxWorks还为用户提供了ARP 代理服务器功能,该代理服务器在接收到子网内的ARP请求时,会修改该ARP数据包,把自己的物理地址写进去,再以广播形式发送。
另外,VxWorks不支持二级代理功能。用户可以调用proxyPortFwdOn()来设定UDP协议的广播端口,可以调用proxyPortFwdOff()来关闭该广播端口。
在VxWorks中,用户有两种方法在一个子网内分配IP地址:手动和自动(包含INCLUDE_SM_SEQ_ADDR宏)。采用自动方式时,除了Server外的其它机器的IP地址从Server的IP地址开始依次累 增。VxWorks还提供了网络字节排序(低字节在前,高字节在后)和主机字节排序(相反)的转换宏。
(3) 网络配置协议
VxWorks提供对包括BOOTP、DHCP和SNMP协议的支持。DHCP协议和BOOTP协议都可以为主机分配IP地址,但是DHCP是动态分配IP地址的,而BOOTP分配的地址是固定不变的。
BOOTP服务器有自己的数据库文件,内容是:BOOT目录和BOOT时所传输的启动文件;可以从本服务器BOOT的主机IP地址、物理地址,主机名和子网掩码。当一台客户端主机向本服务器发送BOOT请求时,服务器首先根据其物理地址从数据库中查找匹配的条目,如果找到,那么判断该主机有无IP地址,如果没有则给它分配相应的IP地址;如果没有找到匹配条目,那么丢弃该请求。服务器在查找BOOT文件时,首先根据 文件名.主机名来查找文件,如果没有找到,则查找文件名文件,如找到则发送该文件。
DHCP服务器不仅可以接收DHCP消息,而且还可以接收BOOTP消息,VxWorks对DHCP的实现,在客户端主机IP地址改变时,DHCP服务器必须重新连接主机,否则会导致连接中断,解决的办法是,用户可以配置DHCP,使它可以为主机分配永久IP地址。
VxWorks为用户提供了接口dhcpOptionSet()来修改DHCP的参数,比如IP地址保持不变的最短和最长时间。另外,DHCP动态分配的IP地址优先级低于用户自己手动分配的IP地址。用户调用dhcpBind()来给各主机分配IP地址。VxWorks实现的SNMP协议支持标准的管理信息库(MIB),个人也可以扩展该库。
(4) 选路协议
VxWorks提供对RIP、OSPF选路协议的支持,RIP协议的缺点是TTL数不能超过15, 这在现在某些情况下是不够使用了。OSPF则没有此限制,但是OSPF的复杂性使得配
置OSPF服务器变得很麻烦。
用户可以调用ripRouteShow()函数来显示路由信息。该函数可以打印以下信息:
被数据包广播到的路由;
接力传送该数据包的路由;
相应的子网掩码;
该路由的超时丢弃数据包值;
标志值。
(5) socket API接口
VxWorks提供和BSD一致的Socket接口,而且,在VxWorks中,socket不仅可以用来实现以太网上不同主机的任务之间的通信,还可以用来实现本机任务之间的通信。
多播功能是属于IP层的,但是一般应用使用UDP来实现它。VxWorks提供的多播接口包括:mCastSend(), mCastRcv()。主机要接收/发送多播数据,必须首先加入该多播组。
VxWorks提供的zbuf-Socket接口,使得应用程序和网络层之间无需拷贝数据,而只是简单的移动指针即可。这样提高了系统效率,降低了开销,实际上,zbuf-socket的缓存是以字符串指针数组的形式存放的。
(6) DNS
VxWorks提供对DNS的支持。用户可以调用hostAdd()手动添加域名和地址的映
射,可以调用hostShow()查看主机名和IP地址的映射表。可以调用resolvGetHostByName()函数来根据主机名获得相应的IP地址,可以调用resolvGetHostByAddr()函数来根据IP地址来获得相应的主机名。
(7) SNTP和RPC
VxWorks提供对SNTP协议的支持,它可以用于客户端来查询其它机器上的时
间,或者服务器向其它主机提供时间。另外,RPC(远程进程调用)功能只能在任务中使用,每个任务在调用RPC之前都必须调用rpcTaskInit()函数。
(8) 远程文件存取和telnet
VxWorks提供的远程文件存取功能所使用的协议是RSH和FTP。另外用户也可以
使用NFS(网络文件系统)来实现文件的传输。其不同点是:RSH/FTP协议使用netDrv驱动,在传送文件时会把整个文件传送过来,存在本机内存中,用户修改完文件后,再传送回去;而NFS使用nfsDrv驱动,它只把用户要修改的部分传送过来,修改完后传送回去,提高了效率。
用户可以把本机配置成为FTP服务器,可设定登录密码。VxWorks提供telnet功能,但是telnet的目的主机也必须是运行的VxWorks系统。
7.对任务的实时监控
VxWorks提供了对系统的实时监控(Spy)功能,它可以提供每个任务运行所耗时间信息、系统所花在中断上的时间信息以及CPU的空闲时间等,其单位是时钟周期,并可以以百分比的形式显示。更强大的监视工具(仿真器)是WindView,用于程序调试。
这样可以帮助用户分析各个任务以及中断的执行状态是否正常。
8.BSP模块的支持
BSP模块主要用于系统的初始化,包括硬件的初始化、加载系统库并加载应用程序从而运行整个系统等,它可以被掩膜到ROM中,从而不会被修改。另外,sysLib和sysAlib是必须加载的,因为它们提供了对各种硬件目标板的支持,他们包括了硬件初始化、中断处理、硬件时钟和定时器管理、内存的映射和大小改变功能等。
9.多CPU的支持
VxWorks的一个特点就是对于多CPU有较好的支持,运行在多个CPU上的任务可以通信,这是由VxMP模块实现的,采用共享信号量和共享消息队列以及共享内存管理的方法。采用共享信号量可以同步不同CPU上的多个任务,就像在本机上使用一样。采用共享消息队列可以让在不同CPU上的任务之间交换数据。采用共享内存可以让在不 同CPU上的任务之间共享数据。
10.系统灵活性强
VxWorks强大的灵活性体现在它的各个功能模块都是单独的库,可以根据需要在运行时动态加载。比如任务管理库是taskLib,信号量库是semLib,中断管理库是sysLib和intLib,网络库是sockLib,I/O库是ioLib等,这些库可以根据需要在运行时动态加载、卸载,从而增强的系统的灵活性,节省了系统空间。
11. 其他
VxWorks还有其他操作系统所共有的功能,为开发者提供了方便。比如看门狗功能,可以在系统进入死机状态时,给用户以处理的机会。