vxbus
This driver is designed to work with VxBus. Therefore, it requires the
default VxBus components to be present in the target image.
VXBUS是指在vxworks中用于支持设备驱动的特有架构。功能:
1、允许设备驱动匹配对应设备;
2、提供驱动程序访问硬件的机制;
3、软件其他部分访问设备功能;
4、在vxworks系统实现驱动的模块化。
vxworks在总线控制器驱动程序服务的支持下,能在总线上发现设备,并执行一些初始化工作,使驱动与硬件设备之间正常通讯。
作为vxworks系统组件的一部分,vxbus使得各种驱动和支持组件的添加与删除完全可以在worksbench工程中进行,不需要bsp和驱动相关的知识,也不会在添加或者删除驱动时增加管理vxworks工程的额外工作。
vxBus下对设备管理做了更为详细的划分,简单说来,硬件称为device,软件叫做driver。如果一个device出现在硬件列表中,启动时需要到driver的队列中去找相应的driver,如果找到,二者结合成一个instance,否则在vxBusShow里可以看到一个orphan。使用vxBusShow可以比较清晰的看到driver列表和device列表以及orphan列表。
如果需要增加一个设备,首先要修改的是hcfDeviceList,这是hwconf.c中的一个数组,这个数组中列有本系统中所有需要初始化的硬件设备。例如:
HCF_DEVICE hcfDeviceList[] = {
#ifdef DRV_SIO_ns16550
{ "ns16550", 0, VXB_BUSID_PLB, 0, ns1655x1Num, ns1655x1Resources },
{ "ns16550", 1, VXB_BUSID_PLB, 0, ns1655x2Num, ns1655x2Resources },
#endif
第二个ns16550是新加的。在参数中指明了它的名字“ns16550”,初始化的时候根据这个名字去搜索驱动。它的unit是1,区别与前面的0,初始化结束以后,会在设备列表中看到这个unit number。ns1655x2Resources是前面定义的一组资源,跟ns1655x1Resources类似,只是regBase和irq按照实际情况做区分。ns1655x2Num是ns1655x2Resources的长度。
对于单核CPU,配置到这里就结束了。如果是多核,还需要修改一下sysDeviceFilter,这个函数决定一个设备在哪个核上初始化。如果还有hypervisor,还需要修改wrhvConfig.xml和vxworksX.xml,将特定的终端放开到指定的核。
驱动开发
设备驱动初始化
内核预初始化阶段
在vxworks内核预初始化早期,bsp的sysHwInit()函数被执行,在这个函数汇总,设备驱动初始化工作第一步被执行。sysHwInit( )函数执行一些早期的初始化,调用hardWareInterFaceInit( )函数,执行初始化硬件内存分配机制,限制为设备驱动分配内存,这个函数接着调用hardWareInterFaceBusInit( ),在hardWareInterFaceBusInit( )函数中完成所有设备驱动和模块的注册工作。PCI2040的注册函数是vxbPci2040Register()。vxbPci2040Register()通过数据结构,向系统注册一些设备初始化函数。
当所有驱动在VxWorks注册之后,sysHwInit( ) 完成非VxBus 驱动的初始化并返回。sysHwInit( ) 函数返回后,VxWorks内核被初始化。
为了使设备和驱动能够在VxWorks系统中使用,让应用程序、中间件、VxWorks内核模块访问设备,执行一些操作,最基本的方法是在VxWorks中采用VxBus方法来实现硬件设备的访问。VxBus方法是在驱动中公开一个入口,使VxBus中API函数可以调用这些入口函数。 采用VxBus驱动的一个主要优点是:设备的驱动程序可以被看成VxWorks 系统的一个组件,通过集成的Workbench开发环境来配置设备驱动。
ARP
ip协议栈
ifnet
是协议栈中的接口的概念,跟ARP相关处理的最重要的三个成员是:
if_ioctl用于接口上的ioctl命令;
if_resolve用于进行地址解析的函数;
if_output用于在接口上发送数据包。
在ipAttach时,这三个值都进行了初始化:
pIfp->if_ioctl = (FUNCPTR)ipIoctl;
pIfp->if_outpu = ipOutput;
pIfp->if_resolve = muxAddrResFuncGet(mib2Tbl.ifType,0800);
其中if_resolve的值,实际上就是arpresolve函数。
arpresolve函数:功能是进行目的ip地址到mac地址的转换映射。
ARP输入处理
arp输入由arpintr驱动,调用in_arpinput以处理跟ip相碰的arp报文。
首先,in_arpinput会调用arplookup,以检查发送者是不是在我们当前的arp缓存中(如果在前面发送了arp请求,那么就应该存在一个无效的arp项,如果是对方主请求,那么说明对方想与我们通讯,也需要检查对方在不在)。arplookup传入的第二个参数,表示在不存在arp项时候,是不是要建立,什么时候建立呢?由于arp请求是广播发送的,所以我们可能接收到请求的目的ip不是我们自己的ip地址,在这种情况下,只需要更新arp信息(时标,以防止老化),只有请求是针对我们自己的情况下(因为对方可能要与我通讯了,我马上要使用对方的mac地址了),才会创建新的arp项。
arp表项的建立
arp就是主机直接路由,通过clone接口子网路由产生。
接口网络路由的建立
当给接口增加/删除地址时,都会影响路由表,通过设置地址/掩码,也就确定一个可以直达的网络,如ifAddrAdd("mottsec2","10.0.0.8","10.0.255.255",0xffff0000).这个函数经过一系列传递后,会调用到in_control,然后调用到in_ifinit。
clone路由的产生
当调用rtalloc查找主机路由时,它实际调用的是rtalloc1,首先在路由表中查找路由,如果找到了并具有clone标志RTF_CLONING,则需要调用rtrequest进行RTM_RESOLVE,这个过程就是clone过程,也就是建立主机直接路由的过程,也就是建立arp过程。
被动创建的arp项
当对方请求本地接口地址的Mac信息时,我们会创建相应的arp项,这其实是通过arplookup实现的,其实arplookup也是通过调用rtalloc1的。
组件
组件构成
组件实际上是一个功能部件具体实现部分的描述信息,它定义了与组件相关的源代码或目标代码、集成信息以及与组件相关的参数。组件包含以下元素:
(1)NAME:一个可读的名称,在工程组件管理器中出现在组件图标旁边。
(2)SYNOPSIS:对组件的简洁的描述。
(3)MODULES:与组件关联的目标文件。
(4)HDR_FILES:使用该组件时需要用到的相关头文件。
(5)CFG_PARAMS:与组件相关的一些配置参数,通常为一系列的宏。
Wind River公司将部分组件安装在其传统位置上。
(1)源码模块可在target/src或target/config目录下找到。
(2)标题头至于target/h中;目标模块在target/lib/objARCH中。
(3)组件描述文件在target/config/comps/VxWorks中。
(4)组件配置文件(源码片段)位于target/config/copms/src。
在同一NET内的所以机器是通过MAC地址通讯。方法为,PC和另一台设备通讯,PC会先寻找对方的IP地址,然后在通过ARP(ARP
表里面有所以可以通讯IP和IP所对应的MAC地址)调出相应的MAC地址。通过MAC地址与对方通讯。也就是说在内网中各设备
互相寻找和用来通讯的地址是MAC地址,而不是IP地址。
组件network utility components下arpLib
linkSyms.c和prjConfig.c工程动态产生的配置文件,包含组件初始化和缩放支持;
romInit.c,sysAlib.s,sysLib.s,romStart.c总的开始文件;
usrAppInit.c初始化用户程序,用户需要修改此文件来满足自己要求;
prjComps.h和prjParam.h工程动态产生的头文件,包含组件选择和参数值。
vxworks image所有可加载的部件和功能,黑体显示的是包含部件,浅平显示的是未包含进来的部件,斜体显示的是无效的部件。选中每个部件时,右击可以include或者exclude此部件,并可修改此部件的属性。
如果没被选上,则相应的功能没有。
ARP表
设备通过ARP解析到目的MAC地址后,将会在自己的ARP表中增加IP地址到MAC地址的映射表项,以用于后续到同一目的地报文的转发。
ARP表项分为动态ARP表项和静态ARP表项
动态ARP表项
动态ARP表项由ARP协议通过ARP报文自动生成和维护,可以被老化,可以被新的ARP报文更新,可以被静态ARP表项覆盖。当到达老化时间、接口down时会删除相应的动态ARP表项。
静态ARP表项
静态ARP表项通过手工配置和维护,不会被老化,不会被动态ARP表项覆盖。
配置静态ARP表项可以增加通信的安全性。静态ARP表项可以限制和指定IP地址的设备通信时只使用指定的MAC地址,此时攻击报文无法修改此表项的IP地址和MAC地址的映射关系,从而保护了本设备和指定设备间的正常通信。
静态ARP表项分为短静态ARP表项和长静态ARP表项。
在配置长静态ARP表项时,除了配置IP地址和MAC地址项外,还必须配置该ARP表项所在VLAN和出接口。长静态ARP表项可以直接用于报文转发。
在配置短静态ARP表项时,只需要配置IP地址和MAC地址项。如果出接口是三层以太网接口,短静态ARP表项可以直接用于报文转发;如果出接口是VLAN虚接口,短静态ARP表项不能直接用于报文转发,当要发送IP数据包时,先发送ARP请求报文,如果收到的响应报文中的源IP地址和源MAC地址与所配置的IP地址和MAC地址相同,则将接收ARP响应报文的接口加入该静态ARP表项中,之后就可以用于IP数据包的转发。