vxworks有三种映像:
VxWorks Image的文件类型有三种
注 意这里说的三种映像都是包含真正操作系统VxWorks的映像,其中后两种可以直接启动并运行起来,但是第一种不行,它必须借助另一个叫做Boot Image的映像(可以在Tornado 中的build->build boot rom中生成)才能运行起来,也就是利用Boot Image引导起来然后通过网口或串口下载真正包含VxWorks的Loadable Image,然后才能运行起来。也就是说Boot Image是和Loadable Image 结合使用的。
现在看来一共有四种映像文件,让我们看看它们的组成吧:
通过上面我们可以看出,ROM-based Images,ROM-Resident Images,Boot Image
三种映像都包含一段叫做BootStrap Programs的程序,它具有启动功能,可以把ROM中的代码段和数据段拷贝到RAM中;下面让我们看看三种VxWorks的启动过程:
我们说过Loadable Images是依靠Boot Image加载启动的,首先有Boot Image中的程序BootStrap Programs把Boot Program程序加载到RAM中的RAM_HIGH_ADRS 处,然后控制权交给Boot Program,由Boot Program负责一系列简单的硬件初始化(网口,串口等),开始下载Loadable Images(即包含应用的VxWorks操作系统)到RAM_LOW_ADRS,然后控制权交给VxWorks操作系统开始执行。
下面的图一是一个简单的流程图,后面的图二是更为详细的流程图。
一节主要是从映像的分类和各种映像的大致加载流程上看VxWorks的启动过程,这一节让我们从函数级看一下VxWorks的启动过程:
1. Boot Image + Loadable Images:
下面是具体的流程图: 其 中第一阶段的执行流程使用的是上图的左边的源文件中的那些函数(romInit->romStart->usrInit-> sysHwinit->usrKernelinit->usrRoot);第二阶段执行流程使用的是上图中右边源文件中的那些函数 (sysInit-> usrInit->sysHwinit->usrKernelinit->usrRoot->usrAppInit)。下面具体 解释: 第一阶段:
• 系统上电之后,首先调用的函数就是romInit() • 禁止中断 • 把启动类型(冷启动/热启动)放在堆栈上 • 清除cache • 初始化CPU基本寄存器,调用SDRAM初始化函数初始化UPM • 直接跳转到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]: @ 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
Attached TCP/IP interface to cpm0. Attaching network interface lo0... done. 第二阶段:
加载VxWorks映像,并转向它的加载地址,从sysInit入口开始执行VxWorks映像
与romInit.s : romInit()的初始化过程类似,但不再初始化SDRAM
设置cache的工作模式,板级硬件初始化,初始化Wind内核,启动usrRoot( )根任务
初始化内存,系统时钟,I/O系统,标准输入输出错,异常处理,添加用户应用程序 此时调试超级终端打印如下信息,Boot引导完成 /*VXWORKS Image Getting Loaded*/ Loading... 881680 Starting at 0x10000…
Attached TCP/IP interface to cpm unit 0 Attaching network interface lo0... done.
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 2. ROM-based Images(压缩/没有压缩):和上面那种启动方式相比,这种启动方式省去了一些步骤,执行完romStart()之后就已经加载VxWorks 到RAM中了,因此,下一步就是把控制权交给VxWorks,有VxWorks从sysInit()开始执行即可。下面是具体的流程:
• 系统上电之后,首先调用的函数就是romInit() • 禁止中断 • 把启动类型(冷启动/热启动)放在堆栈上 • 清除cache • 初始化CPU基本寄存器,调用SDRAM初始化函数初始化UPM • 直接跳转到bootInit.c:romStart()
• 把代码段(如果是VxWorks_romResident映像,则不拷贝代码段)和数据段从bootrom复制到RAM当中 • 完成程序映象的解压缩(如果映象是压缩版本的) • 跳转到sysALib.s:sysInit()
• 重新进行CPU内核(主要是cache)的初始化。这些工作在romInit()里面曾经进行过,由于系统刚刚进入RAM中执行,需要再次初始化。 • 无论使用何种系统(包括仿真器)引导,RAM版本的VxWorks都是从这里开始执行的。 • 控制权移交给 usrInit()
• VxWorks 中第一个C语言完成的代码。执行操作系统内核所必须的初始化程序。 • Cache程序库的初始化 • 清零系统的BSS段 • 初始化中断向量表 • 使硬件工作在一个“安静”的状态,尽量不产生各种中断或者异常 • 控制权移交给KernelInit(),产生usrRoot根任务
此时,调试超级终端会有如下打印信息: /*VXWORKS Image Getting Loaded*/ Loading... 881680 Starting at 0x10000…
Attached TCP/IP interface to cpm unit 0 Attaching network interface lo0... done.
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 3. ROM-Resident Images:这种启动方式的流程和上面那种基本相同,只是不需要加载text段到RAM中而已,故在此不作介绍了。 VxWorks借鉴了传统PC操作系统的引导原理,其将整个引导过程分为两个阶段:1. BOOTROM启动,2. 通过BOOTROM加载VxWorks内核。 |
从映像的分类和各种映像的大致加载流程上看VxWorks
的启动过程,这一节让我们从函数级看一下VxWorks的启动过程:
1. Boot Image + Loadable Images:
下面是具体的流程图:
其中第一阶段的执行流程使用的是上图的左边的源文件中的那些函数(romInit->romStart->usrInit->sysHwinit->usrKernelinit->usrRoot);第二阶段执行流程使用的是上图中右边源文件中的那些函数(sysInit-> usrInit->sysHwinit->usrKernelinit->usrRoot->usrAppInit)。下面具体解释:
第一阶段:
romInit.s:romInit()
o 系统上电之后,首先调用的函数就是romInit()
o 禁止中断
o 把启动类型(冷启动/热启动)放在堆栈上
o 清除cache
o 初始化CPU基本寄存器,调用SDRAM初始化函数初始化UPM
o 直接跳转到bootInit.c:romStart()
bootInit.c:romStart()
o 把代码段和数据段从bootrom复制到RAM当中
o 完成程序映象的解压缩(如果映象是压缩版本的)
o 跳转到bootConfig.c:usrInit()
bootConfig.c:usrInit()
o VxWorks 中第一个C语言完成的代码。执行操作系统内核所必须的初始化程序。
o Cache程序库的初始化
o 清零系统的BSS段
o 初始化中断向量表
o 使硬件工作在一个"安静"的状态,尽量不产生各种中断或者异常
o 控制权移交给KernelInit(),产生usrRoot根任务
o 在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]: @
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
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( )根任务
usrConfig.c : usrRoot( )
初始化内存,系统时钟,I/O系统,标准输入输出错,异常处理,添加用户应用程序
此时调试超级终端打印如下信息,Boot引导完成
/*VXWORKS Image Getting Loaded*/
Loading... 881680
Starting at 0x10000…
Attached TCP/IP interface to cpm unit 0
Attaching network interface lo0... done.
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
2. ROM-based Images(压缩/没有压缩):
和上面那种启动方式相比,这种启动方式省去了一些步骤,执行完romStart()
之后就已经加载VxWorks 到RAM中了,因此,下一步就是把控制权交给VxWorks,有
VxWorks从sysInit()开始执行即可。下面是具体的流程:
romInit.s:romInit()
o 系统上电之后,首先调用的函数就是romInit()
o 禁止中断
o 把启动类型(冷启动/热启动)放在堆栈上
o 清除cache
o 初始化CPU基本寄存器,调用SDRAM初始化函数初始化UPM
o 直接跳转到bootInit.c:romStart()
bootInit.c:romStart()
o 把代码段(如果是VxWorks_romResident映像,则不拷贝代码段)和数据段从
bootrom复制到RAM当中
o 完成程序映象的解压缩(如果映象是压缩版本的)
o 跳转到sysALib.s:sysInit()
sysALib.s:sysInit()
o 重新进行CPU内核(主要是cache)的初始化。这些工作在romInit()
里面曾经进行过,由于系统刚刚进入RAM中执行,需要再次初始化。
o 无论使用何种系统(包括仿真器)引导,RAM版本的VxWorks
都是从这里开始执行的。
o 控制权移交给 usrInit()
usrConfig.c:usrInit()
o VxWorks 中第一个C语言完成的代码。执行操作系统内核所必须的初始化程序。
o Cache程序库的初始化
o 清零系统的BSS段
o 初始化中断向量表
o 使硬件工作在一个"安静"的状态,尽量不产生各种中断或者异常
o 控制权移交给KernelInit(),产生usrRoot根任务
此时,调试超级终端会有如下打印信息:
/*VXWORKS Image Getting Loaded*/
Loading... 881680
Starting at 0x10000…
Attached TCP/IP interface to cpm unit 0
Attaching network interface lo0... done.
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