如图2,第一阶段的执行流程使用的是上图的左边的源文件中的那些函数(romInit->romStart->usrInit->sysHwinit->usrKernelinit->usrRoot);第二阶段执行流程使用的是上图中右边源文件中的那些函数(sysInit-> usrInit->sysHwinit->usrKernelinit->usrRoot->usrAppInit)。下面具体解释:
第一阶段:
romInit.s:romInit()
Ø 系统上电之后,首先调用的函数就是romInit()
Ø 禁止中断
Ø 把启动类型(冷启动/热启动)放在堆栈上
Ø 清除cache
Ø 初始化CPU基本寄存器,调用SDRAM初始化函数初始化UPM
Ø 直接跳转到bootInit.c:romStart()
bootInit.c:romStart()
Ø 把代码段和数据段从bootrom复制到RAM当中
Ø 完成程序映象的解压缩(如果映象是压缩版本的)
Ø 跳转到bootConfig.c:usrInit()
bootConfig.c:usrInit()
Ø VxWorks OS中第一个C语言完成的代码。执行操作系统内核所必须的初始化程序。
Ø Cache程序库的初始化
Ø 清零系统的BSS段
Ø 初始化中断向量表
Ø 使硬件工作在一个“安静”的状态,尽量不产生各种中断或者异常
Ø 控制权移交给KernelInit(),产生usrRoot根任务
Ø 在usrRoot根任务中解析Bootline,产生bootCmdLoop任务,用于启动、加载VxWorks映像
/target/config/all/bootConfig.c是Boot ROM设置模块,用于加载VxWorks image。执行流程为:
usrRoot()---->bootCmdLoop(void)命令行选择,或autobooting---->bootLoad(pLine, &entry)加载模块到内存(网络、TFFS、TSFS...)---->netifAttach()---->go(entry)---->(entry)()从入口开始执行,不返回。
第二阶段:
bootConfig.c: bootLoad( )
Ø 加载VxWorks映像,并转向它的加载地址,从sysInit入口开始执行VxWorks映像
sysALib.s: sysInit( )
Ø 与romInit.s : romInit()的初始化过程类似,但不再初始化Memory(DRAM和Memory控制器通常初始化一次)
usrConfig.c: usrInit( )
Ø 设置cache的工作模式,板级硬件初始化,初始化Wind内核,启动usrRoot( )根任务
usrConfig.c: usrRoot( )
Ø 初始化内存,系统时钟,I/O系统,标准输入输出错,异常处理,添加用户应用程序。
ROM-based Images
(压缩/
没有压缩)
和上面那种启动方式相比,这种启动方式省去了一些步骤,执行完romStart()之后就已经加载VxWorks 到RAM中了,因此,下一步就是把控制权交给VxWorks,由VxWorks从sysInit()开始执行即可。下面是具体的流程:
romInit.s:romInit()
Ø 系统上电之后,首先调用的函数就是romInit()
Ø 禁止中断
Ø 把启动类型(冷启动/热启动)放在堆栈上
Ø 清除cache
Ø 初始化CPU基本寄存器,调用SDRAM初始化函数初始化UPM
Ø 直接跳转到bootInit.c:romStart()
bootInit.c: romStart()
Ø 把代码段(如果是VxWorks_romResident映像,则不拷贝代码段)和数据段从bootrom复制到RAM当中
Ø 完成程序映象的解压缩(如果映象是压缩版本的)
Ø 跳转到sysALib.s: sysInit()
sysALib.s: sysInit()
Ø 重新进行CPU内核(主要是cache)的初始化,这些工作在romInit.s:romInit()中曾经进行
Ø 是RAM中运行的第一段代码
Ø 跳转到usrConfig.c: usrInit()
usrConfig.c: usrInit()
Ø VxWorks 中第一个C语言完成的代码。执行操作系统内核所必须的初始化程序。
Ø Cache程序库的初始化
Ø 清零系统的BSS段
Ø 初始化中断向量表
Ø 使硬件工作在一个“安静”的状态,尽量不产生各种中断或者异常
Ø 控制权移交给KernelInit(),产生usrRoot根任务
ROM-Resident Images
:
这种映像的加载和上一种是基本相同的,其执行顺序为:
文件romInit.s中的romInit()---->文件bootInit.c中的romStart()---->文件usrConfig.c中的usrInit()---->sysHwInit()---->usrKernelInit()---->KernelInit(usrRoot,...)。
usrRoot()任务的主要功能包括:
Ø 初始化内存分区表(memory partition library)
Ø 初始化系统时钟(system clock)
Ø 初始化输入输出系统(I/O system)----可选
Ø Create devices----可选
Ø 设置网络(Configure network)----可选
Ø 激活WDB目标通信(Activate WDB agent)----可选
Ø 调用程序(Activate application)
本文转自 21cnbao 51CTO博客,原文链接:http://blog.51cto.com/21cnbao/134679,如需转载请自行联系原作者