VxWorks启动过程详解
2009-12-09 10:25
vxworks有三种映像:
VxWorks Image的文件类型有三种
- Loadable Images:由Boot-ROM引导通过网口或串口下载到RAM
- ROM-based Images(压缩/没有压缩):即将Image直接烧入ROM,运行时将Image拷入RAM中运行。
-ROM-Resident Images:Image的指令部分驻留在ROM中运行,仅将数据段部分拷入RAM。
注意这里说的三种映像都是包含真正操作系统VxWorks的映像,其中后两种可以直接启动并运行起来,但是第一种不行,它必须借助另一个叫做Boot Image 的映像(可以在Tornado 中的build->build boot rom中生成)才能运行起来,也就是利用Boot Image引导起来然后通过网口或串口下载真正包含VxWorks的Loadable Image,然后才能运行起来。也就是说Boot Image是和Loadable Image 结合使用的。
现在看来一共有四种映像文件,让我们看看它们的组成吧:
-Boot Image:包含一段叫做BootStrap Programs的程序+一段ROM BOOT Program 程序。
-Loadable Images:有操作系统VxWorks和应用组成的映像。
-ROM-based Images(压缩/没有压缩):包含一段叫做BootStrap Programs
的程序+ Loadable Images(即有操作系统VxWorks和应用组成的映像)
-ROM-Resident Images:同上
通过上面我们可以看出,ROM-based Images,ROM-Resident Images,Boot Image
三种映像都包含一段叫做BootStrap Programs的程序,它具有启动功能,可以把ROM中的代码段和数据段拷贝到RAM中;下面让我们看看三种VxWorks的启动过程:
èBoot Image+Loadable Images:
我们说过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操作系统开始执行。
ROM-based Images(压缩/没有压缩):
这种映像因为其本身就包含BootStrap Programs程序,因此可以直接启动,所以这种映像中也就不需要Boot Programme了,首先BootStrap Programs启动,把映像中的VxWorks加载到内存的RAM_LOW_ADRS处并开始运行。
ROM-Resident Images:
这种映像的加载和上一种是基本相同的,只不过是加载的只有data段和bss段而已。
上一节主要是从映像的分类和各种映像的大致加载流程上看VxWorks的启动过程,这一节让我们从函数级看一下VxWorks的启动过程:
Boot Image +Loadable Images:
VxWorks借鉴了传统PC操作系统的引导原理,其将整个引导过程分为两个阶段:1. BOOTROM启动,2. 通过BOOTROM加载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]: @
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
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()里面曾经进行过,由于系统刚刚进入RAM中执行,需要再次初始化。
? 无论使用何种系统(包括仿真器)引导,RAM版本的VxWorks都是从这里开始执行的。
? 控制权移交给 usrInit()
usrConfig.c: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
ROM-Resident Images:
这种启动方式的流程和上面那种基本相同,只是不需要加载text段到RAM中而已,故在此不作介绍了
VxWorks启动过程详解(上)
2007-10-26 15:03
vxworks有三种映像:
VxWorks Image的文件类型有三种
1.Loadable Images:由Boot-ROM引导通过网口或串口下载到RAM
2.ROM-based Images(压缩/没有压缩):即将Image直接烧入ROM,运行时将Image拷入
RAM中运行。
3.ROM-Resident Images:Image的指令部分驻留在ROM中运行,仅将数据段部分拷入RAM。
注意这里说的三种映像都是包含真正操作系统VxWorks的映像,其中后两种可以直接启动并运行起来,但是第一种不行,它必须借助另一个叫做Boot Image的映像(可以在Tornado 中的build->build boot rom中生成)才能运行起来,也就是利用Boot Image引导起来然后通过网口或串口下载真正包含VxWorks的Loadable Image,然后才能运行起来。也就是说Boot Image 是和Loadable Image 结合使用的。
现在看来一共有四种映像文件,让我们看看它们的组成吧:
1.Boot Image:包含一段叫做BootStrap Programs的程序+一段ROM BOOT Program程序。
2.Loadable Images:有操作系统VxWorks和应用组成的映像。
3.ROM-based Images(压缩/没有压缩):包含一段叫做BootStrap Programs的程序+
Loadable Images(即有操作系统VxWorks和应用组成的映像)
4.ROM-Resident Images:同上
通过上面我们可以看出,ROM-based Images,ROM-Resident Images,Boot Image
三种映像都包含一段叫做BootStrap Programs的程序,它具有启动功能,可以把ROM中的代码段和数据段拷贝到RAM中;下面让我们看看三种VxWorks的启动过程:
Boot Image +Loadable Images:
我们说过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操作系统开始执行。
下面的图一是一个简单的流程图,后面的图二是更为详细的流程图。
ROM-based Images(压缩/没有压缩):
这种映像因为其本身就包含BootStrap Programs程序,因此可以直接启动,所以这种映像中也就不需要Boot Programme了,首先BootStrap Programs启动,把映像中的VxWorks加载到内存的RAM_LOW_ADRS处并开始运行。图三是一个简图,图四是更为详尽的流程图。
èROM-Resident Images:
这种映像的加载和上一种是基本相同的,只不过是加载的只有data段和bss段而已。
VxWorks启动过程详解(下)
2007-10-26 15:04
一节主要是从映像的分类和各种映像的大致加载流程上看VxWorks的启动过程,这一节让我们从函数级看一下VxWorks的启动过程:
1. Boot Image +Loadable Images:
下面是具体的流程图:
其中第一阶段的执行流程使用的是上图的左边的源文件中的那些函数
(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]: @
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()
?系统上电之后,首先调用的函数就是romInit()
?禁止中断
?把启动类型(冷启动/热启动)放在堆栈上
?清除cache
?初始化CPU基本寄存器,调用SDRAM初始化函数初始化UPM
?直接跳转到bootInit.c:romStart()
? bootInit.c:romStart()
?把代码段(如果是VxWorks_romResident映像,则不拷贝代码段)和数据段从bootrom 复制到RAM当中
?完成程序映象的解压缩(如果映象是压缩版本的)
?跳转到sysALib.s:sysInit()
? sysALib.s:sysInit()
?重新进行CPU内核(主要是cache)的初始化。这些工作在romInit()里面曾经进行过,由于系统刚刚进入RAM中执行,需要再次初始化。
?无论使用何种系统(包括仿真器)引导,RAM版本的VxWorks都是从这里开始执行的。
?控制权移交给 usrInit()
usrConfig.c: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内核。