VxWorks网络协议栈初始化流程Word文档格式.docx
《VxWorks网络协议栈初始化流程Word文档格式.docx》由会员分享,可在线阅读,更多相关《VxWorks网络协议栈初始化流程Word文档格式.docx(11页珍藏版)》请在冰豆网上搜索。
/*XXXselectbetweenmemPartLibInit*/
初始化内存;
调用sysClkConnect((FUNCPTR)usrClock,0);
/*connectclockinterruptroutine*/
sysClkRateSet(60);
/*setsystemclockrate*/
sysClkEnable();
/*startit*/初始化系统时钟;
调用iosInit(NUM_DRIVERS,NUM_FILES,"
/null"
);
初始化文件系统;
根据配置的串口和控制台口个数,初始化串口;
调用wdbConfig();
/*configureandinitializetheWDBagent*/初始化WDB;
调用pipeDrv();
/*installpipedriver*/
excInit();
/*initexceptionhandling*/excHookAdd((FUNCPTR)bootExcHandler);
/*installexchandler*/
logInit(consoleFd,5);
/*initializelogging*/初始化相关功能模块;
调用hashLibInit();
/*hashLibusedbydosFS*/初始化DOS文件系统;
根据配置选择
bootAoutInit();
/*usea.outformat*/#else/*cofforecoff*/
#ifdefined(INCLUDE_ECOFF)
bootEcoffInit();
/*useecoffformat*/#else/*coff*/
#ifdefined(INCLUDE_COFF)
bootCoffInit();
/*usecoffformat*/#else/*coff*/
#ifdefined(INCLUDE_ELF)
bootElfInit();
/*useelfformat*/之上的其一初始化;
调用if(muxLibInit()==ERROR)初始化MUX;
根据END个数加载END;
调用bootCmdLoop创建"
tBoot"
任务,启动下一步初始化;
四、bootCmdLoop()流程
调用key=autoboot(timeout);
启动初始化;
五、autoboot()流程
调用if(bootLoad(BOOT_LINE_ADRS,&
entry)==OK)go(entry);
/*...andneverreturn*/从FLASH中读出BOOTLINE配置的启动文件,并运行该启动文件。
三、usrConfig.C中的usrRoot流程(是版本启动用的)
usrRoot()流程
usrRoot()是VXWORKS进入多任务环境下创建的第一个任务,用来初始化各种系统参数,并启动其它任务。
入口参数:
char*pMemPoolStart,/*startofsystemmemorypartition*/
unsignedmemPoolSize/*initialsizeofmempool*/
/*initializememorypool*/
或memPartLibInit(pMemPoolStart,memPoolSize);
/*initializememorypool*/
初始化系统内存池;
调用memShowInit()初始化内存显示例程;
调用usrMmuInit()初始化MMU单元;
/*connectclockISR*/
/*setsystemclockrate*/sysClkEnable();
/*startit*/
初始化系统时钟;
初始化_func_selWakeupListInit;
初始化I/O系统;
安装控制台驱动,创建控制台设备,设置BAND率;
初始化PC控制台设备;
调用ioGlobalStdSet(STD_IN,consoleFd);
ioGlobalStdSet(STD_OUT,consoleFd);
ioGlobalStdSet(STD_ERR,consoleFd);
将标准输入、输出、错误输出定向到控制台设备上;
调用hashLibInit();
/*initializehashtablepackage*/symLibInit();
/*initializesymboltablepackage*/symShowInit();
/*initializesymboltableshow*/初始化系统符号表;
调用excInit()初始化异常处理;
调用logInit(consoleFd,MAX_LOG_MSGS)初始化登录;
调用sigInit()初始化信号量库;
调用dbgInit()初始化调试库;
调用pipeDrv()初始化管道;
stdioInit();
/*initializestandardI/Olibrary*/stdioShowInit();
初始化标准I/O;
调用sigqueueInit(NUM_SIGNAL_QUEUES);
/*initializequeuedsignals*/
semPxLibInit();
semPxShowInit();
mqPxLibInit(MQ_HASH_SIZE);
mqPxShowInit();
aioPxLibInit(MAX_LIO_CALLS);
aioSysInit(MAX_AIO_SYS_TASKS,AIO_TASK_PRIORITY,AIO_TASK_STACK_SIZE);
初始化POSIX;
/*initializehashtablepackage*/
dosFsInit(NUM_DOSFS_FILES);
/*initdosFsfilesystem*/
初始化DOS文件系统;
调用rawFsInit(NUM_RAWFS_FILES);
/*initrawFsfilesystem*/初始化原始文件系统;
调用rt11FsInit(NUM_RT11FS_FILES)初始化RT11文件系统;
调用ramDrv()初始内存虚拟盘;
初始化SCSI;
调用fdDrv(FD_INT_VEC,FD_INT_LVL)初始化软驱;
调用ideDrv(IDE_INT_VEC,IDE_INT_LVL,IDE_CONFIG)初始化IDE盘;
初始化硬盘驱动;
初始化LPT;
调用pcmciaShowInit();
/*installPCMCIAshowroutines*/
pcmciaInit();
/*initPCMCIALib*/初始化PCMCIA;
调用tffsDrv()初始化TFFS;
调用fioLibInit()初始化格式化I/O;
调用floatInit()初始化浮点设备;
调用mathSoftInit()初始化软浮点设备;
调用mathHardInit()初始化硬浮点设备;
调用spyLibInit()初始化CPU监视工具;
调用timexInit()初始化函数定时工具;
调用envLibInit(ENV_VAR_USE_HOOKS)初始化环境变量;
初始化NTPASSFS;
调用moduleLibInit()初始化模块管理器;
调用symSyncLibInit()同步目标机与主机的符号表;
调用sysFFSMount();
调用
usrBootLineInit(sysStartType);
/*crackthebootline*/
usrNetInit(BOOT_LINE_ADRS);
/*initializenetworksupport*/
初始化网络通讯协议;
初始化PASSFS;
初始化DOS_DISK;
调用usrSmObjInit(BOOT_LINE_ADRS)初始化共享内存对象;
初始化WindMP;
写保护文本段和向量表;
调用selectInit()初始化SELECT;
调用sysSymTbl=symTblCreate(SYM_TBL_HASH_SIZE_LOG2,TRUE,memSysPartId)创建系统符号表;
调用sysSymTbl=symTblCreate(SYM_TBL_HASH_SIZE_LOG2,TRUE,memSysPartId);
netLoadSymTbl()
创建网络符号表;
初始化C++库;
初始化WindWeb服务器;
调用httpd()初始化HTTP;
调用rBuffLibInit();
rBuffShowInit();
/*installrBuffshowroutine*/
初始化RBUFF;
调用windviewConfig()初始化WINDVIEW;
调用wdbConfig();
初始化调试接口;
打印SHELL界面;
初始化交互界面,提示用户输入信息,口令验证;
调用usrUglInit()初始化UGL;
调用javaConfig()初始化JAVA;
调用usrHtmlInit()初始化HTML;
调用USER_APPL_INIT初始化用户应用程序;
TmsAppInit()
四、网络协议栈初始化流程
在usrnetwork.C中:
在usrRoot()中调用
usrNetInit
(
char*bootString/*bootparameterstring*/
)
初始化网络协议栈
将BOOTLINE中的初始化字串写入初始化结构变量中,没有的赋缺省值。
初始化CPU号,以利用VME通讯;
初始化插口层、BSD插口和路由插口;
调用hostTblInit()初始化主机表;
(在hostlib。
C中,该表用于DNS)调用usrNetProtoInit()初始化各种协议,包括IP、RIP、IP过滤、UDP、TCP、ICMP、IGMP、多播路由、OSPF;
调用netLibInit()初始化网络库,包括创建网络任务环、创建网络处理任务、初始化缓冲区、接口初始化、
添加INTE域、INTE域初始化、路由表初始化、增强路由初始化、多播HASH表初始化、网络类型初始化;
调用muxLibInit()初始化MUX;
调用muxAddrResFuncAdd(M2_ifType_ethernet_csmacd,0x800,ipEtherResolvRtn)初始化以太网的IP地址解析;
调用muxAddrResFuncAdd(M2_ifType_atm,0x800,ipAtmResolvRtn)初始化ATM的IP地址解析;
调用muxAddrResFuncAdd(M2_ifType_ppp,0x800,ipPppResolvRtn)初始化POS的IP地址解析;
(此处初始化了所有外部链路类型的IP地址解析函数,形成函数链表,在IP绑定时,根据END接口类型和协议类型,获取地址解析函数,就可以完成地址解析了)
读endDevTbl,调用muxDevLoad()加载END并调用muxDevStart()启动END;
初始化PPP;
初始化DHCP,如果定义了Relay且未定义Server,则初始化Relay,初始化Client;
初始化UL接口;
设置加载启动接口,从PPP、SLIP和BACKPLANE中挑选其一,如果没有则查其它选项定义了其它设备,
则从其它设备加载;
根据其它设备的不同属性,
添加接口,设置IP地址;
若从磁盘启动则初始化必要的END:
{
调用pEnd=endFindByName(params.other,params.unitNum);
获取一个other中的END;
调用(ipAttach(params.unitNum,params.other)!
=OK)绑定IP协议栈到该END上;
设置attached=TRUE;
如果~attached,调用usrNetIfAttach(params.other,params.unitNum,params.ead)!
=OK)
则
初始化BSD类型的接口;
调用usrNetIfConfig(params.bootDev,params.unitNum,params.ead,
params.targetName,
netmask)!
=OK)配置IP地址
}
如果从以太网启动,则:
调用(ipAttach(params.unitNum,params.other)!
=OK)
则初始化BSD类型的接口;
=OK)配置IP地址;
如果不从BACKPLANE启动,则设置此BACKPLANE为第二接口:
调用usrNetIfAttach(bpDev,params.unitNum,params.bad);
(void)usrNetIfConfig(bpDev,params.unitNum,params.bad,
(char*)NULL,netmask);
配置BACKPLANE;
如果params.targetName[0]目标主机名不为空,则调用:
usrNetIfAttach("
lo"
0,"
127.0.0.1"
usrNetIfConfig("
"
localhost"
0);
添加环回接口;
若从BACKPLANE启动,则更改DHCPClient属性;
初始化ARP代理服务器;
初始化DHCPClient,并设置IP地址到BOOTLINE中;
如果定义了网关地址,则设置路由;
调用hostAdd(params.hostName,params.had);
将HOST加入到主机表;
设置与其它VXWORKS通讯的名字和联系
创建远程文件访问设备;
初始化ZBUF插口;
(目前没有使用)
初始化tcpTraceInit()跟踪调试接口;
调用rlogInit(),启动远程登录;
调用telnetInit(),启动TELNET;
调用rpcInit(),启动RPC;
调用ftpdInit((FUNCPTR)loginUserVerify,0),启动FTP;
调用tftpdInit(0,0,0,FALSE,0),启动TFTPServer;
初始化NFS;
初始化DHCPServer或Relay;
调用sntpcInit(SNTP_PORT),初始化SNTP;
调用pingLibInit(),初始化PING;
调用usrSnmpdInit(),初始化SNMPAgent;
调用ripLibInit(RIP_SUPPLIER,RIP_GATEWAY,RIP_MULTICAST,RIP_VERSION,
RIP_TIMER_RATE,RIP_SUPPLY_INTERVAL,RIP_EXPIRE_TIME,
RIP_GARBAGE_TIME);
初始化RIP;
调用usrResolvInit()初始化DNS;
五、configTms.H定义
在configTms.H中:
定义:
#defineBOARD_NAME"
Broadcom"
#defineHOST_NAME_DEFAULT"
TMS_HOST"
#defineTARGET_NAME_DEFAULT"
WRN-Broadcom"
#defineHOST_USER_DEFAULT"
TMS_User"
#defineHOST_PASSWORD_DEFAULT"
"
#defineSCRIPT_DEFAULT"
#defineOTHER_DEFAULT"
#definePRODUCT_NAME"
TMSBCM5600SwitchProduct"
等初始化BOOTLINE缺省名。
此外还定义了
TMS相关的实现宏。
六、在sysSwitch.C中
TMSAppInit()流程:
调用sysClkRateSet(SYSTEM_CLK_RATE)设置时钟速率;
调用sysNvmCreate();
初始化NVM,需要一段时间;
调用portMapInit()初始化端口映射;
调用portMapIfStructInit()初始化端口、接口映射;
调用TASK_START(NVM_APPNAME,nvmInit,&
nvmData,NULL,"
high"
(8*1024));
创建NVM数据维护任务;
调用appManagerClr(APP_MANAGER_IDB);
MODULE_START(IDB_APPNAME,idbInit,NUM_OF_OBJECTS,UM_OF_MODULES);
appManagerSet(APP_MANAGER_IDB);
初始化IDB+模块;
读取NVM更新系统的MAC地址;
调用muxIterateByName(SW_DEVICE_NAME,updateEndDevices,SW_DEVICE_NAME);
muxIterateByName(AG_DEVICE_NAME,updateEndDevices,AG_DEVICE_NAME);
muxIterateByName(AP_DEVICE_NAME,updateEndDevices,AP_DEVICE_NAME);
muxIterateByName(HW_DEVICE_NAME,updateEndDevices,HW_DEVICE_NAME);
更新END的MAC地址;
调用muxIterateByName(SW_DEVICE_NAME,swIpAttach,NULL)添加相应的网络接口;
初始化虚拟I/O消息服务;
初始化LOGO-TO-NULL;
如果环回接口未初始化,则初始化环回接口;
如果禁止IP路由,则调用m2IpGroupInfoSet(varToSet,&
ipVars)设置协议栈全局变量;
调用sysMib2Init();
初始化MIB;
调用envoyTMSInit();
初始化SNMP;
调用MODULE_START(SWAPI_APPNAME,bcmSwapiInit,0,0);
MODULE_START(RFC1213_APPNAME,rfc1213Init,0,0);
MODULE_START(RFC1907_APPNAME,rfc1907Init,0,0);
MODULE_START(RFC1493_APPNAME,rfc1493Init,0,0);
MODULE_START(RFC2233_APPNAME,rfc2233Init,0,0);
MODULE_START(RFC2665_APPNAME,rfc2665Init,0,0);
设置基本MIB;
调用MODULE_START(RFC2571_APPNAME,rfc2571Init,0,0);
MODULE_