上一节主要是从映像的分类和各种映像的大致载入流程上看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的启动过程: 1. Boot Image + Loadable Images: 下 ...

  2. VxWorks启动过程的详细解释(上)

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

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

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

  4. 【转载】Linux启动过程

    转自:http://cizixs.com/2015/01/18/linux-boot-process 简介 我们都知道:操作系统运行的代码是在硬盘上的,最终要跑到内存和 CPU 上,才能被我们使用. ...

  5. 从Linux启动过程到android启动过程

    Linux启动过程: 1.首先开机给系统供电,此时硬件电路会产生一个确定的复位时序,保证cpu是最后一个被复位的器件.为什么cpu要最后被复位呢?因为 如果cpu第一个被复位,则当cpu复位后开始运行 ...

  6. Android深入四大组件(四)Android8.0 根Activity启动过程(前篇)

    前言 在几个月前我写了Android深入四大组件(一)应用程序启动过程(前篇)和Android深入四大组件(一)应用程序启动过程(后篇)这两篇文章,它们都是基于Android 7.0,当我开始阅读An ...

  7. Info.plist和pch文件的作用,UIApplication,iOS程序的启动过程,AppDelegate 方法解释,UIWindow,生命周期方法

    Info.plist常见的设置 建立一个工程后,会在Supporting files文件夹下看到一个“工程名-Info.plist”的文件,该文件对工程做一些运行期的配置,非常重要,不能删除 注:在旧 ...

  8. 个人从源码理解angular项目在JIT模式下的启动过程

    通常一个angular项目会有一个个模块(Module)来管理各自的业务,并且必须有一个根模块(AppModule)作为应用的入口模块,整个应用都围绕AppModule展开.可以这么说,AppModu ...

  9. [oracle] oracle的三种密码验证机制以及在windows和linux下的不同启动过程

    oracle数据库的密码验证机制: ① 操作系统验证 拥有SYSDBA和SYSOPER的用户用该方式验证此时数据库无需启动,也无需开启监听和实例服务. 要求:本地组ora_dba中有该操作系统的登录用 ...

随机推荐

  1. request.setAttribute()、session.setAttribute()和request.getParameter()的联系与区别

    1.session.setAttribute()和session.getAttribute()配对使用,作用域是整个会话期间,在所有的页面都使用这些数据的时候使用. 2.request.setAttr ...

  2. Scrapy笔记:CrawSpider中rules中的使用

    scrapy.spiders.crawl.CrawlSpider类的使用 这个类比较适用于对网站爬取批量网页,相比于Spider类,CrawlSpider主要使用规则(rules)来提取链接 rule ...

  3. 二、Ubuntu 转换为root用户

    用设置的用户登录进入. 输入以下命令 1--->su root 2--->sudo passwd root 输入root 用户密码 3--->su root    转换为root用户 ...

  4. AC日记——计算循环节长度 51nod 1035

    最长的循环节 思路: 我们尝试一种最简单的方法,模拟: 如何模拟呢? 每个数,对它模k取余,如果它的余数没有出现过,就补0继续模: 所以,当一个余数出现两次时,当前的长度即为循环节长度: 来,上代码: ...

  5. js坑 把数字型的字符串默认为数字 把前面的0给去掉了("001")

    <script> b("); function b(id) { console.log("b函数的id:"+id); //var history = &quo ...

  6. Codeforces 371E Subway Innovation (前缀和预处理应用)

    题目链接 Subway Innovation 首先不难想到所求的k个点一定是连续的,那么假设先选最前面的k个点,然后在O(1)内判断第2个点到第k+1个点这k个点哪个更优. 判断的时候用detla[i ...

  7. Vue中this.$router.push参数获取

    传递参数的方法:1.Params 由于动态路由也是传递params的,所以在 this.$router.push() 方法中path不能和params一起使用,否则params将无效.需要用name来 ...

  8. python 单例模式应用

    class Singelton(object): __instance=None def __init__(self): pass def __new__(cls,*kwd,**kwargs): # ...

  9. Linux系统救援模式应用:恢复误删的系统文件

    利用Linux系统救援模式找回误删的系统文件 背景:在操作中误删了某些重要的系统文件如/lib64/libc.so.6这个文件,可以利用Linux系统的救援模式来找回 步骤: 将系统光盘或U盘在Bio ...

  10. AutoCAD如何设置A0A1图纸

    可以从网上下载相应的图纸模板,下载之后可以发现有相应的文字和模板文件   随后我们新建并找到这个dwt文件模板(比如要做一个A1的模板)   随后即可发现模板的样式,包括每种颜色的粗细,颜色和明细栏等 ...