VxWorks启动过程具体解释(下)
上一节主要是从映像的分类和各种映像的大致载入流程上看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启动过程具体解释(下)的更多相关文章
- VxWorks启动过程详解(下)
上一节主要是从映像的分类和各种映像的大致加载流程上看VxWorks的启动过程,这一节让我们从函数级看一下VxWorks的启动过程: 1. Boot Image + Loadable Images: 下 ...
- VxWorks启动过程的详细解释(上)
vxworks有三个图像: VxWorks Image有三种类型的文件 Loadable Images:由Boot-ROM引导通过网口或串口下载到RAM ROM-based Images(压缩/没有压 ...
- VxWorks启动过程详解(上)
vxworks有三种映像: VxWorks Image的文件类型有三种 Loadable Images:由Boot-ROM引导通过网口或串口下载到RAM ROM-based Images(压缩/没有压 ...
- 【转载】Linux启动过程
转自:http://cizixs.com/2015/01/18/linux-boot-process 简介 我们都知道:操作系统运行的代码是在硬盘上的,最终要跑到内存和 CPU 上,才能被我们使用. ...
- 从Linux启动过程到android启动过程
Linux启动过程: 1.首先开机给系统供电,此时硬件电路会产生一个确定的复位时序,保证cpu是最后一个被复位的器件.为什么cpu要最后被复位呢?因为 如果cpu第一个被复位,则当cpu复位后开始运行 ...
- Android深入四大组件(四)Android8.0 根Activity启动过程(前篇)
前言 在几个月前我写了Android深入四大组件(一)应用程序启动过程(前篇)和Android深入四大组件(一)应用程序启动过程(后篇)这两篇文章,它们都是基于Android 7.0,当我开始阅读An ...
- Info.plist和pch文件的作用,UIApplication,iOS程序的启动过程,AppDelegate 方法解释,UIWindow,生命周期方法
Info.plist常见的设置 建立一个工程后,会在Supporting files文件夹下看到一个“工程名-Info.plist”的文件,该文件对工程做一些运行期的配置,非常重要,不能删除 注:在旧 ...
- 个人从源码理解angular项目在JIT模式下的启动过程
通常一个angular项目会有一个个模块(Module)来管理各自的业务,并且必须有一个根模块(AppModule)作为应用的入口模块,整个应用都围绕AppModule展开.可以这么说,AppModu ...
- [oracle] oracle的三种密码验证机制以及在windows和linux下的不同启动过程
oracle数据库的密码验证机制: ① 操作系统验证 拥有SYSDBA和SYSOPER的用户用该方式验证此时数据库无需启动,也无需开启监听和实例服务. 要求:本地组ora_dba中有该操作系统的登录用 ...
随机推荐
- locust参数关联及批量注册
前言 前面[Locust性能测试2-先登录场景案例]讲了登录的案例,这种是直接传账号和密码就能登录了,有些登录的网站会复杂一点,需要先从页面上动态获取参数,作为登录接口的请求参数,如[学信网:http ...
- LeetCode OJ--Combinations *
https://oj.leetcode.com/problems/combinations/ 给一个集合,求个数为k的所有子集 递归调用,深搜 class Solution { public: vec ...
- Java I/O系统学习系列一:File和RandomAccessFile
I/O系统即输入/输出系统,对于一门程序语言来说,创建一个好的输入/输出系统并非易事.因为不仅存在各种I/O源端和想要与之通信的接收端(文件.控制台.网络链接等),而且还需要支持多种不同方式的通信(顺 ...
- 你知道如何在springboot中使用redis吗
特别说明:本文针对的是新版 spring boot 2.1.3,其 spring data 依赖为 spring-boot-starter-data-redis,且其默认连接池为 lettuce ...
- void*类型的指针
void*是一种特殊的指针类型,可以用来存放任意对象的地址.一个void*指针存放着一个地址,这一点和其他指针类似.不同的是,我们对它到底储存的是什么对象的地址并不了解: 比如:double a=2. ...
- mac 破解photoshop cs6
1 首先安装photoshop cs6,安装好后退出 2 下载破解补丁 破解补丁文件网盘下载:https://pan.baidu.com/s/1hrXieqS 或自行在百度网页里搜amtlib.fra ...
- sublime text常用快捷键(转)
选择一个选中项的下一个匹配项: ctrl+d 把光标放在一个单词上,按下ctrl+ D,将选择这个单词.一直按住ctrl且按D多次,将选择当前选中项的下一个匹配项.通过按住ctrl,再按D三次,将选择 ...
- Jboss7类载入器
1. 类载入器理论知识介绍 类载入器基于Jboss Module,代替了层次类载入环境,避免了当类存在多个版本号时,导致类载入错误. 类载入是基于模块的.必须显示的定义模块依赖.部署也是模块化的,假设 ...
- 访问C指针的指针
#include <stdio.h> #include <stdlib.h> int main(int argc,char **argv){ void* vp; void** ...
- 【重点突破】——第三方绘图工具FusionCharts.js的使用详解
一.引言 项目组中,经常会因为绘制图表的繁杂度,衡量会不会使用第三方绘图工具,如果自己做很困难,成本使用高于第三方绘图工具库,就会使用.很多人使用的是Chart.js,因为它是免费使用的,不过,缺点就 ...