閱讀731 返回首頁    go 技術社區[雲棲]


VxWorks各部分初始化流程

一)configAll.h中定義所有定置係統配置的宏
INCLUDED SOFTWARE FACILITIES:定義了基本組件;
EXCLUDED FACILITIES:定義了擴充組件,缺省不包括;
KERNEL SOFTWARE CONFIGURATION:內核運行的基本參數定義,包括文件個數、任務個數等等;
"GENERIC" BOARD CONFIGURATION:板通用屬性定義;
"MISCELLANEOUS" CONSTANTS:共享的信號量以及相關對象個數定義;
INCLUDED NETWORK FACILITIES:包括的網絡協議組件定義;
EXCLUDED NETWORK FACILITIES:未包括的網絡協議組件定義;

二)boot流程(bootrom)
usrInit()
{
intVecBaseSet ((FUNCPTR *) VEC_BASE_ADRS)設置中斷向量;
excVecInit ()設置異常向量;
sysHwInit ()初始化硬件
usrKernelInit ()配置VXWORK內核;
kernelInit ((FUNCPTR) usrRoot, ROOT_STACK_SIZE,啟動usrRoot();
}
usrRoot()
{
memInit (pMemPoolStart, memPoolSize);/* XXX select between memPartLibInit */初始化內存;
/* set up system timer */
sysClkConnect ((FUNCPTR) usrClock, 0);/* connect clock interrupt routine */
sysClkRateSet (60);/* set system clock rate */
sysClkEnable ();/* start it */
/*必須的硬件初始化步驟*/
/*啟動tboot任務*/
taskSpawn ("tBoot", bootCmdTaskPriority, bootCmdTaskOptions,
bootCmdTaskStackSize, (FUNCPTR) bootCmdLoop,
0,0,0,0,0,0,0,0,0,0);
}
bootCmdLoop()
{
/*根據用戶輸入走入不同分支*/
autoboot()
/*根據取得的BOOT_LINE_ADRS地址,進入bootLoad流程*/
}
bootLoad()
{
/*根據bootline配置選擇啟動路徑*/
flashLoad() or netLoad()
/*如果從網絡啟動,網絡初始化,靜態IP or dhcpGet()*/
}

三)vxWorks啟動流程
usrInit() 
/* the first C code executed after the system boots. This routine is called by the assembly language start-up routine sysInit() which is in the sysALib module of the target-specific directory*/
{
sysHwInit ();/* initialize system hardware */
usrKernelInit ();/* configure the Wind kernel */
/* start the kernel specifying usrRoot as the root task */
kernelInit ((FUNCPTR) usrRoot, * )
}
usrRoot()
/* first task to run under the multitasking kernel.  It performs all final initialization and then starts other tasks*/
{
調用 memInit (pMemPoolStart, memPoolSize); /* initialize memory pool */
或memPartLibInit (pMemPoolStart, memPoolSize);/* initialize memory pool */
初始化係統內存池;
調用memShowInit ()初始化內存顯示例程;
調用usrMmuInit ()初始化MMU單元;
調用 sysClkConnect ((FUNCPTR) usrClock, 0); /* connect clock ISR */
sysClkRateSet (60); /* set system clock rate */
sysClkEnable (); /* start it */
初始化係統時鍾;
初始化_func_selWakeupListInit;
調用 iosInit (NUM_DRIVERS, NUM_FILES, "/null");初始化I/O係統;
安裝控製台驅動,創建控製台設備,設置BAND率;
初始化PC控製台設備;
調用 ioGlobalStdSet (STD_IN, consoleFd);
ioGlobalStdSet (STD_OUT, consoleFd);
ioGlobalStdSet (STD_ERR, consoleFd);
將標準輸入、輸出、錯誤輸出定向到控製台設備上;
調用hashLibInit (); /* initialize hash table package */
symLibInit (); /* initialize symbol table package */
symShowInit (); /* initialize symbol table show */
初始化係統符號表;
調用excInit ()初始化異常處理;
調用logInit (consoleFd, MAX_LOG_MSGS)初始化登錄;
調用sigInit ()初始化信號量庫;
調用dbgInit ()初始化調試庫;
調用pipeDrv ()初始化管道;
stdioInit (); /* initialize standard I/O library */
stdioShowInit ();
初始化標準I/O;
調用sigqueueInit (NUM_SIGNAL_QUEUES); /* initialize queued signals */
semPxLibInit (); 
semPxShowInit ();
mqPxLibInit (MQ_HASH_SIZE); 
mqPxShowInit ();
aioPxLibInit (MAX_LIO_CALLS);
aioSysInit(MAX_AIO_SYS_TASKS, AIO_TASK_PRIORITY, AIO_TASK_STACK_SIZE);
初始化POSIX;
調用 hashLibInit (); /* initialize hash table package */
dosFsInit (NUM_DOSFS_FILES); /* init dosFs filesystem */
初始化DOS文件係統;
調用 rawFsInit (NUM_RAWFS_FILES); /* init rawFs filesystem */ 初始化原始文件係統;
調用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 (); /* install PCMCIA show routines */
pcmciaInit (); /* init PCMCIA Lib */
初始化PCMCIA;
調用tffsDrv ()初始化TFFS;
調用fioLibInit ()初始化格式化I/O;
調用floatInit ()初始化浮點設備;
調用mathSoftInit ()初始化軟浮點設備;
調用mathHardInit ()初始化硬浮點設備;
調用spyLibInit ()初始化CPU監視工具;
調用timexInit ()初始化函數定時工具;
調用envLibInit (ENV_<I>var</I>_USE_HOOKS)初始化環境變量;
初始化NTPASSFS;
調用moduleLibInit ()初始化模塊管理器;
調用symSyncLibInit ()同步目標機與主機的符號表;
調用sysFFSMount ();初始化文件係統;
調用
usrBootLineInit (sysStartType); /* crack the bootline */
usrNetInit (BOOT_LINE_ADRS); /* initialize network support */
初始化網絡通訊協議;
初始化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++庫;
初始化Wind Web服務器;
調用httpd ()初始化HTTP;
調用rBuffLibInit();
rBuffShowInit (); /* install rBuff show routine */
初始化RBUFF;
調用windviewConfig ()初始化WINDVIEW;
調用wdbConfig();初始化調試接口;
打印SHELL界麵;
初始化交互界麵,提示用戶輸入信息,口令驗證;
調用usrUglInit ()初始化UGL;
調用javaConfig ()初始化JAVA;
調用usrHtmlInit ()初始化HTML;
調用USER_APPL_INIT初始化用戶應用程序;TmsAppInit()
}

四)網絡初始化
usrNetInit()
{
調用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;*/
若從磁盤啟動則初始化必要的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地址
}
如果從以太網啟動,則:
{
調用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地址;
}
如果不從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 ("lo", 0, "127.0.0.1", "localhost", 0);
初始化ARP代理服務器;
如果定義了網關地址,則設置路由;
調用hostAdd (params.hostName, params.had);將HOST加入到主機表;
pingLibInit(),初始化PING;
……
}

五)網絡緩衝區定義
/* network buffers configuration */
/*
* mBlk, clBlk configuration table for network stack data pool.
* Only used for data transfer in the network stack.
*/
M_CL_CONFIG mClBlkConfig = 
{
/* 
no. mBlks no. clBlks memArea memSize
----------- ---------- ------- -------
*/
NUM_NET_MBLKS, NUM_CL_BLKS, NULL, 0
};
/*
* network stack data cluster pool configuration table
* Only used for data transfer in the network stack.
*/
CL_DESC clDescTbl [] = 
{
/* 
clusterSize num memArea memSize
----------- ---- ------- -------
*/
{64, NUM_64, NULL, 0},
{128, NUM_128, NULL, 0},
{256, NUM_256, NULL, 0},
{512, NUM_512, NULL, 0},
{1024, NUM_1024, NULL, 0},
{2048, NUM_2048, NULL, 0}
}; 
int clDescTblNumEnt = (NELEMENTS(clDescTbl));
/*
* mBlk, clBlk configuration table for network stack system pool.
* Used for network stack system structures such as routes, sockets,
* protocol control blocks, interface addresses, mulitcast addresses,
* and multicast routing entries.
*/
M_CL_CONFIG sysMclBlkConfig = 
{
/* 
no. mBlks no. clBlks memArea memSize
----------- ---------- ------- -------
*/
NUM_SYS_MBLKS, NUM_SYS_CL_BLKS, NULL, 0
};
/*
* network stack system cluster pool configuration table
* Used for network stack system structures such as routes, sockets,
* protocol control blocks, interface addresses, mulitcast addresses,
* and multicast routing entries.
*/
CL_DESC sysClDescTbl [] = 
{
/* 
clusterSize num memArea memSize
----------- ---- ------- -------
*/
{64, NUM_SYS_64, NULL, 0},
{128, NUM_SYS_128, NULL, 0},
{256, NUM_SYS_256, NULL, 0},
{512, NUM_SYS_512, NULL, 0},
}; 
int sysClDescTblNumEnt = (NELEMENTS(sysClDescTbl));
以上的常數定義在netBufLib.H中;
在目前的定義中:
係統內核的緩衝區有512個Mbuf,有256個Mclk;
網絡協議的緩衝區有400個Mbuf,有330個Mclk;
在mbuf.h將mbuf重定義為mBlk;
#define mbuf mBlk
在mblk中實現了原來mbuf的定義;

六)IP協議棧初始化流程
usrNetProtoInit ()
{
調用ipLibInit (&ipCfgParams)初始化IP ;
調用rawIpLibInit ()初始化原始IP;
調用rawLibInit ()初始化原始IP庫;
調用ipFilterLibInit ()初始化IP過濾;
調用udpLibInit (&udpCfgParams)初始化UDP庫;
調用udpShowInit ()初始化UDP顯示;
調用tcpLibInit (&tcpCfgParams)初始化TCP庫;
調用tcpShowInit ()初始化TCP顯示;
調用icmpLibInit (&icmpCfgParams);初始化ICMP;
調用icmpShowInit ()初始化ICMP顯示;
調用igmpLibInit ();初始化IGMP;
調用igmpShowInit ();初始化IGMP顯示;
調用mCastRouteLibInit ();初始化MCAST;
調用ospfLibInit ();初始化OSPF;
調用 ospfRegisterProtocol ();初始化OSPF注冊;
netLibInit()流程:
調用 if ((netJobRing = rngCreate (JOB_RING_SIZE)) == (RING_ID) NULL)
panic ("netLibInit: couldn't create job ring\n");
初始化任務環;
調用 if (rebootHookAdd ((FUNCPTR) ifreset) == ERROR)
logMsg ("netLibInit: unable to add reset hook\n", 0, 0, 0, 0, 0, 0);
初始化複位鉤子;
調用 semBInit (netTaskSemId, SEM_Q_PRIORITY, SEM_EMPTY);初始化信號量;
調用 splSemInit ();初始化信號量;
調用 mbinit ();初始化網絡緩衝區;
調用 ifinit ();初始化接口;
調用addDomain (&inetdomain);添加域;
調用domaininit ()初始化域;
調用route_init ()初始化路由表;
調用routeIntInit ()初始化增強路由表;
調用mcastHashInit ();初始化多播HASH;
調用netTypeInit ()初始化網絡類型;
調用 netTaskId = taskSpawn ("tNetTask", netTaskPriority,
netTaskOptions, netTaskStackSize,
(FUNCPTR) netTask, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
創建網絡任務netTask;
netTask()網絡任務流程
調用 semTake (netTaskSemId, WAIT_FOREVER);獲取信號量;
調用rngIsEmpty (netJobRing)檢查網絡事件環是否有任務,如果有事件
則調用rngBufGet (netJobRing, (char *) &jobNode,sizeof (jobNode)) != sizeof (jobNode))獲取事件,
並執行;
判斷_netIsrMask中斷字,確定是IP包到、還是ARP包到;
如果是IP包到,則調用ipintr ();處理IP包後清除_netIsrMask中斷字;
如果是ARP包到,則調用arpintr ()處理ARP包後清除_netIsrMask中斷字;
schednetisr()軟中斷流程:
獲取軟中斷類型;
設置_netIsrMask軟中斷字;
調用semGive (netTaskSemId)激活網絡處理任務。
TMSAppinit中調用muxIterateByName( SW_DEVICE_NAME, swIpAttach, NULL )添加相應的網絡接口;
rc = ipAttach( unit0, EM_DEVICE_NAME );初始化外部網絡接口
swIpAttach()的流程如下:
調用rc = ipAttach( unit, SW_DEVICE_NAME );初始化網絡接口
ipAttach()流程:
調用 if (endFindByName (pDevice, unit) == NULL)確定是否有該END;
在ipDrvCtrl[]中獲取一個空的空間放置IP驅動屬性;
調用if((pDrvCtrl->tkFlag = muxTkDrvCheck(pDevice)) == TRUE)確定是否是NPT類型的END,
如果是則以後綁定用TK;
調用if((pDrvCtrl->pIpCookie = muxTkBind(pDevice, unit, ipTkReceiveRtn,綁定IP協議棧;
調用 bzero(pDrvCtrl->drvName,8);
strncpy(pDrvCtrl->drvName, pDevice,sizeof(pDrvCtrl->drvName)-1); 
設置ipDrvCtrl[]域中成員名;
調用pIfp = (struct ifnet *) &pDrvCtrl->idr;獲取ifNet;
設置ifNet;
調用muxIoctl(pDrvCtrl->pIpCookie, EIOCGFLAGS, (caddr_t)&flags)獲取底層硬件標誌;
調用muxIoctl(pDrvCtrl->pIpCookie, EIOCGMIB2233,(caddr_t)&pM2ID) == ERROR)獲取底層硬件MIB變量;
設置ifnet;
確定接口類型,如果廣播類型的接口,則設置接口廣播標誌;
調用if((pDrvCtrl->pArpCookie = muxTkBind(pDevice, unit,ipTkReceiveRtn,綁定ARP協議;
調用if (muxIoctl (pDrvCtrl->pIpCookie, EIOCGHDRLEN, 
(caddr_t)&ifHdrLen)!= OK)獲取底層硬件地址長度;
設置ifnet硬件地址長度;
設置ifnet的接口操作函數例程;
調用pIfp->if_resolve = muxAddrResFuncGet(pIfp->if_type, 0x800)獲取該接口類型的地址解析函數;
調用if_attach (pIfp);將ifnet加入接口鏈表中;
調用pIfp->if_start = (FUNCPTR) ipTxStartup;初始化接口啟動函數;
如果出錯,則進行出錯的善後處理
}

參考文檔
1)vxWorks BSP code
2)Vxworks網絡協議棧初始化流程(網友edwzyy)

最後更新:2017-04-03 12:55:36

  上一篇:go 2013藍橋杯【模擬賽】運送馬匹
  下一篇:go MOM係列文章之 - MQ生態鏈(第一版,持續更新)