上一节主要是从映像的分类和各种映像的大致加载流程上看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内核。

VxWorks启动过程详解(下)的更多相关文章

  1. VxWorks启动过程详解(上)

    vxworks有三种映像: VxWorks Image的文件类型有三种 Loadable Images:由Boot-ROM引导通过网口或串口下载到RAM ROM-based Images(压缩/没有压 ...

  2. Linux启动过程详解(inittab、rc.sysinit、rcX.d、rc.local)

    启动第一步--加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它.这是因为BIOS中包含了CPU的相关信息.设备启动顺序信息.硬 ...

  3. Linux启动过程详解

    Linux启动过程详解 附上两张图,加深记忆 图1: 图2: 第一张图比较简洁明了,下面对第一张图的步骤进行详解: 加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的 ...

  4. fabric网络环境启动过程详解

    这篇文章对fabric的网络环境启动过程进行讲解,也就是我们上节讲到的启动测试fabric网络环境时运行network_setup.sh这个文件的执行流程 fabric网络环境启动过程详解 上一节我们 ...

  5. (转)Linux 开机引导和启动过程详解

    Linux 开机引导和启动过程详解 编译自:https://opensource.com/article/17/2/linux-boot-and-startup作者: David Both 原创:LC ...

  6. Android 核心分析 之八Android 启动过程详解

    Android 启动过程详解 Android从Linux系统启动有4个步骤: (1) init进程启动 (2) Native服务启动 (3) System Server,Android服务启动 (4) ...

  7. 【STM32H7教程】第13章 STM32H7启动过程详解

    完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=86980 第13章       STM32H7启动过程详解 本章教 ...

  8. linux 开机启动过程详解

    Linux开机执行内核后会启动init进程,该进程根据runlevel(如x)执行/etc/rcx.d/下的程序,其下的程序是符号链接,真正的程序放在/etc/init.d/下.开机启动的程序(服务等 ...

  9. 转-Linux启动过程详解(inittab、rc.sysinit、rcX.d、rc.local)

    http://blog.chinaunix.net/space.php?uid=10167808&do=blog&id=26042   1)BIOS自检2)启动Grub/Lilo3)加 ...

随机推荐

  1. md语法

    标题 标题 标题是每篇文章都需要也是最常用的格式,在 Markdown 中,如果一段文字被定义为标题,只要在这段文字前加 # 号即可. # 一级标题 ## 二级标题 ### 三级标题 以此类推,总共六 ...

  2. 【BZOJ 4515】【SDOI 2016 Round1 Day1 T3】游戏

    考场上写了lct,可惜当时对标记永久化的理解并不是十分深刻,导致调一个错误的程序调了4h+,最后这道题爆0了QwQ 现在写了树链剖分,用标记永久化的线段树维护轻重链,对于$s\rightarrow l ...

  3. Devexpress-1 DataGrid控件

    参考资料: 使用XtraGrid自定义列计算 DEV GridControl小结 实现对两列求和后作为新的列

  4. ch2 MySQL 架构组成

    第 2 章 MySQL 架构组成 前言 麻雀虽小,五脏俱全.MySQL    虽然以简单著称,但其内部结构并不简单.本章从 MySQL 物理组成.逻辑组成,以及相关工具几个角度来介绍    MySQL ...

  5. (转)WPF控件开源资源

    (转)WPF控件开源资源 Textbox Drag/Drop in WPFhttp://www.codeproject.com/Articles/42696/Textbox-Drag-Drop-in- ...

  6. 泰晓科技 +兰大开源社区 +程序动态分析---LINUX内核网站

    http://www.tinylab.org/ http://linux-talents.tinylab.org/lzuoss/ http://www.tinylab.org/source-code- ...

  7. Android 简单的图片缩放方法

    很简单的一个图片缩放方法,注意要比例设置正确否则可能会内存溢出 相关问题 java.lang.IllegalArgumentException: bitmap size exceeds 32bits ...

  8. Spring总结_02_Spring概述

    一.概念准备 1.应用程序:是能完成我们所需要功能的成品,比如购物网站.OA系统. 2.框架:是能完成一定功能的半成品,比如我们可以使用框架进行购物网站开发:框架做一部分功能,我们自己做一部分功能,这 ...

  9. char数组中除去某个元素

    /* 本程序说明: char数组中除去某个元素(其实就是strcpy源码的变形) */ #include <iostream> #include <cassert> #incl ...

  10. JUC原子类--01

    JUC原子操作类分为四种类型 1. 基本类型: AtomicInteger, AtomicLong, AtomicBoolean ;2. 数组类型: AtomicIntegerArray, Atomi ...