上一节主要是从映像的分类和各种映像的大致加载流程上看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. MySQL笔记-语句的执行顺序

    在一次查询线上问题时发现有以下两条同样的SQL,执行后数据的顺序不一样: SELECT * FROM nns_assists_item AS asset WHERE asset.nns_assist_ ...

  2. 12、SEO工程师指南 - 软件项目角色指南系列文章

    第11章       SEO工程师   SEO工程师是一个比较新兴的职位,在实际的项目管理过程中,SEO工程师的地位相对靠后,只有在项目试运行以及运营期间才能体现出SEO工程师的作用.在项目完成之后, ...

  3. Hadoop学习笔记二

    一.设置无密码sudo权限,不用在普通用户和root用户间来回切换 chmod u+w /etc/sudoers vim /etc/sudoers #首行添加如下的内容: hadoop ALL=(ro ...

  4. 【模板小程序】求M~N范围内的质数个数

    /* 本程序说明: [编程题] 求素数 时间限制:2秒 空间限制:32768K 输入M.N,1 < M < N < 1000000,求区间[M,N]内的所有素数的个数.素数定义:除了 ...

  5. 痞子衡随笔:常用的数据传输差错检测技术(1)- 奇偶校验(Parity Check)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是嵌入式数据传输里的差错检测技术-奇偶校验. 在嵌入式应用里,除了最核心的数据处理外,我们还会经常和数据传输打交道.数据传输需要硬件传输接口 ...

  6. redis新手入门,摸不着头脑可以看看<三>——lrange分页

    看了几天 redis开发与运维,写了个小demo练练手,直接上代码. 1.首先是数据库,本地要有redis,具体的如何安装redis,官网下个就好了,sososo. 2.启动redis 注意启动命令. ...

  7. vue框架-学习记录

    前段时间在做vue项目时,遇到挺多问题,想简单总结一下: 1.关于父组件,子组件的通信 网上有很多这方面的讲解,讲解也比较细致,我主要总结了自己在项目中需要的: [1]父组件-子组件 也就是" ...

  8. JavaScript对象创建的几种方式

    1 工厂模式 1.1 创建 function createFruit(name,colors) { var o = new Object(); o.name = name; o.colors = co ...

  9. 使用单元素的枚举类型实现Singleton

    从java1.5版本开始,实现singleton出现了第三种方式: public enum SingleTon { INSTANCE; public void speak() { System.out ...

  10. CentOs 7 中安装tomcat8

    1,下载tomcat8.0 进入tomcat的下载地址:http://tomcat.apache.org/download-80.cgi 2,上传到linux服务器 cd /usr/local/jav ...