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 Image的文件类型有三种 Loadable Images:由Boot-ROM引导通过网口或串口下载到RAM ROM-based Images(压缩/没有压 ...
- Linux启动过程详解(inittab、rc.sysinit、rcX.d、rc.local)
启动第一步--加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它.这是因为BIOS中包含了CPU的相关信息.设备启动顺序信息.硬 ...
- Linux启动过程详解
Linux启动过程详解 附上两张图,加深记忆 图1: 图2: 第一张图比较简洁明了,下面对第一张图的步骤进行详解: 加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的 ...
- fabric网络环境启动过程详解
这篇文章对fabric的网络环境启动过程进行讲解,也就是我们上节讲到的启动测试fabric网络环境时运行network_setup.sh这个文件的执行流程 fabric网络环境启动过程详解 上一节我们 ...
- (转)Linux 开机引导和启动过程详解
Linux 开机引导和启动过程详解 编译自:https://opensource.com/article/17/2/linux-boot-and-startup作者: David Both 原创:LC ...
- Android 核心分析 之八Android 启动过程详解
Android 启动过程详解 Android从Linux系统启动有4个步骤: (1) init进程启动 (2) Native服务启动 (3) System Server,Android服务启动 (4) ...
- 【STM32H7教程】第13章 STM32H7启动过程详解
完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=86980 第13章 STM32H7启动过程详解 本章教 ...
- linux 开机启动过程详解
Linux开机执行内核后会启动init进程,该进程根据runlevel(如x)执行/etc/rcx.d/下的程序,其下的程序是符号链接,真正的程序放在/etc/init.d/下.开机启动的程序(服务等 ...
- 转-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)加 ...
随机推荐
- 使用redis所维护的代理池抓取微信文章
搜狗搜索可以直接搜索微信文章,本次就是利用搜狗搜搜出微信文章,获得详细的文章url来得到文章的信息.并把我们感兴趣的内容存入到mongodb中. 因为搜狗搜索微信文章的反爬虫比较强,经常封IP,所以要 ...
- Restful、Jersey和JAX-RS
一:MVC与SpringMVC MVC:是一种思想,是一种设计模式 SpringMVC:是一个框架,实现了MVC这种思想. 之前:写JSP页面,比较繁琐.eg:在页面显示用户列表,我们会在JSP页面 ...
- git stash暂存文件
git stash 可用来暂存当前正在进行的工作, 比如想pull 最新代码,但又不想提交代码.先git stash暂存,pull之后,用git stash pop或者git stash apply取 ...
- IOLI-crackme0x01-0x05 writeup
上一篇开了个头, 使用Radare2并用3中方法来解决crackme0x00, 由于是第一篇, 所以解释得事无巨细, 今天就稍微加快点步伐, 分析一下另外几个crackme. 如果你忘记了crackm ...
- POJ [P3020] Antenna Placement
二分图匹配求最小边覆盖 建图方法中的黑白染色法,题目中说信号可以覆盖相邻两个块,那么我们可以将给定的地图染成国际象棋棋盘的样子,一个黑格可以与周围的四个白格共用信号,对于城市,从每一个黑格出发,向其周 ...
- cnpm,vue等命令不识别的问题废人解决方案
关于安装的cnpm,vue等不识别的问题 我想了很久然后再网上看了一些教程发现添加系统变量Path没什么用 我就在用户变量里面添加的,完美解决问题 在我的电脑右键->属性->高级系统设置- ...
- php+redis 学习 二 悲观锁
<?php header('content-type:text/html;chaeset=utf-8'); /** * redis实战 * * 实现悲观锁机制 * */ $timeout = 5 ...
- Burp_用户名密码爆破
burp 全称 Burp Suite, 是用于攻击web 应用程序的集成平台.它包含了许多工具,可以抓包可以爆破也可以扫描漏洞. 主要组件如下: Proxy--是一个拦截HTTP/S的代理服务器,作为 ...
- Mac系统下XAMPP的简单使用
XAMPP简单使用的方法使用方法 XAMPP的简介即应用在博客园也有 1.安装完成后打开manager-osx.app 把Manager Servers下的三个server打开(使之变绿如下) 第一个 ...
- zabbix-agent 启动不起来
遇到一个问题 zabbix-agent 一直启动不起来 查看Zabbix Agent日志文件才究其原因. tail /var/log/zabbix/zabbix_agentd.logzabbix_a ...