上一节主要是从映像的分类和各种映像的大致加载流程上看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. Java基础之Throwable,文件加载

    Java中的异常与错误都继承自Throwable,Exception又分为运行时异常(RuntimeException)和编译时异常. 运行时异常是程序的逻辑不够严谨或者特定条件下程序出现了错误,例如 ...

  2. BZOJ 1483: [HNOI2009]梦幻布丁 [链表启发式合并]

    1483: [HNOI2009]梦幻布丁 题意:一个带颜色序列,一种颜色合并到另一种,询问有多少颜色段 一种颜色开一个链表,每次遍历小的合并到大的里,顺带维护答案 等等,合并方向有规定? 令col[x ...

  3. UVA概率练习[2]

    UVa11021 Tribbles 你有K个麻球.一个只会存活一天.在死亡之前,一个麻球有P_i的概率生出i个麻球(i=0,1,…,n-1).m天后所有麻球都死亡的概率是多少?(包含在第m天前全部死亡 ...

  4. BZOJ 3173: [Tjoi2013]最长上升子序列 [splay DP]

    3173: [Tjoi2013]最长上升子序列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1613  Solved: 839[Submit][St ...

  5. XSD详解三 - 复合元素+总结篇

    一.复合元素介绍 1.什么是复合元素? 复合元素指包含其他元素及/或属性的 XML 元素. 有四种类型的复合元素: 空元素 包含其他元素的元素 仅包含文本的元素 包含元素和文本的元素 注释:上述元素均 ...

  6. 监督学习:随机梯度下降算法(sgd)和批梯度下降算法(bgd)

    线性回归 首先要明白什么是回归.回归的目的是通过几个已知数据来预测另一个数值型数据的目标值. 假设特征和结果满足线性关系,即满足一个计算公式h(x),这个公式的自变量就是已知的数据x,函数值h(x)就 ...

  7. Redis 学习(二) —— 数据类型及操作

    Redis支持string.list.set.zset.hash等数据类型,这一篇学习redis的数据类型.命令及某些使用场景. 一.String,字符串 字符串是 Redis 最基本的数据类型.一个 ...

  8. CocosCreator游戏开发---菜鸟学习之路(三)如何在CocosCreator中使用Pomelo

    PS(废话): 这段时间都在研究网易的Pomelo框架,作为新手小白,自然遇到了不少坑爹的事情.(当然也有可能是因为自己技术不过关的原因所以导致在很多基础的问题上纠结了很久.)网上也搜索了好久,但是基 ...

  9. testng 异常 截图

    testNG里有一个异常监听类,失败时会执行类里的相关方法 DriverBase 截图类 TestngListenerScreen 异常监听类 Test1 测试类1.DriverBase类 packa ...

  10. 二分图最大匹配模板【匈牙利;Dinic最大流】

    二分图最大匹配模板[匈牙利:Dinic最大流] 匈牙利算法 int n,m; vector<int> map[100010]; int match[100010];//保存匹配的互相点 b ...