上一节主要是从映像的分类和各种映像的大致加载流程上看vxworks的启动过程,这一节让我们从函数级看一下vxworks的启动过程:
下面是具体的流程图:
其中第一阶段的执行流程使用的是上图的左边的源文件中的那些函数(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 中第一个c语言完成的代码。执行操作系统内核所必须的初始化程序。
• cache程序库的初始化
• 清零系统的bss段
• 初始化中断向量表
• 使硬件工作在一个“安静”的状态,尽量不产生各种中断或者异常
• 控制权移交给kernelinit(),产生usrroot根任务
• 在usrroot根任务中解析bootline,产生bootcmdloop任务,用于启动、加载vxworks映像
此时,调试超级终端会有如下打印信息:
vxworks system boot
copyright 1984-1998 wind river systems, inc.
cpu: mpc860
version: 5.4
bsp version: 1.2/0
creation date: aug 2 2002, 09:19:47
press any key to stop auto-boot...
3
此时按任意键可停止自动启动,修改启动行参数
[vxworks boot]: p
boot device : cpm
unit number : 0
processor number : 0
host name : michel
file name : c:/ftproot/vxworks
inet on ethernet (e) : 168.2.7.27:ffffff00
host inet (h) : 168.2.7.10
user (u) : target
passwd(pw) : target
flags (f) : 0x0
―――――――――――――――――――――――――――
[vxworks boot]: @
attached tcp/ip interface to cpm0.
attaching network interface lo0... done.
第二阶段:
bootconfig.c:
bootload( )
加载vxworks映像,并转向它的加载地址,从sysinit入口开始执行vxworks映像
sysalib.s :
sysinit( )
与rominit.s : rominit()的初始化过程类似,但不再初始化sdram
usrconfig.c :
usrinit( )
设置cache的工作模式,板级硬件初始化,初始化wind内核,启动usrroot( )根任务
usrroot( )
初始化内存,系统时钟,i/o系统,标准输入输出错,异常处理,添加用户应用程序
此时调试超级终端打印如下信息,boot引导完成
/*vxworks image getting loaded*/
loading... 881680
starting at 0x10000…
attached tcp/ip interface to cpm unit 0
vxworks
copyright 1984-1998 wind river systems, inc.
cpu : mpc860
vxworks : 5.4
bsp version: 1.2/0
creation date: aug 2 2000
wdb : ready
和上面那种启动方式相比,这种启动方式省去了一些步骤,执行完romstart()之后就已经加载vxworks 到ram中了,因此,下一步就是把控制权交给vxworks,有vxworks从sysinit()开始执行即可。下面是具体的流程:
• 把代码段(如果是vxworks_romresident映像,则不拷贝代码段)和数据段从bootrom复制到ram当中
• 跳转到sysalib.s:sysinit()
sysalib.s:sysinit()
• 重新进行cpu内核(主要是cache)的初始化。这些工作在rominit()里面曾经进行过,由于系统刚刚进入ram中执行,需要再次初始化。
• 无论使用何种系统(包括仿真器)引导,ram版本的vxworks都是从这里开始执行的。
• 控制权移交给 usrinit()
usrconfig.c:usrinit()
这种启动方式的流程和上面那种基本相同,只是不需要加载text段到ram中而已,故在此不作介绍了。
vxworks借鉴了传统pc操作系统的引导原理,其将整个引导过程分为两个阶段:1. bootrom启动,2. 通过bootrom加载vxworks内核。