VxWorks操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统(RTOS)。它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事演习、弹道制导、飞机导航等。
我在开发的时候使用的是Tornado2.2,基于不同的目标机可分为MIPS,ARM和X86等类型。
对于目标机来说,在启动的时候需要有一个boot程序,boot程序的主要功能是引导vxworks 内核,所以boot程序需要知道vxworks的内核存放在何处,通过什么手段去获取。这个boot程序就是Bootrom,vxworks内核就是VxWorks映像。
Bootrom引导文件由Tornado编译BSP生成,BSP(Board Support Package)板级支持包放在Tornado\target\config下,主要作用初始化目标板硬件到一个确定的状态,并为VxWorks内核提供对目标板硬件相关的系统调用函数库。
无后缀: ELF可执行文件格式
.hex后缀:Motorola S-record文件格式
.bin 后缀:二进制输出, 一般烧到ROM/Flash零地址处。
bootrom执行流程如下:
romInit.s:romInit
romInit函数完成系统硬件环境下必要的初始化工作,如从系统角度禁止中断,初始化相关寄存器到可知状态,初始化内存控制器,初始化函数调用所需的栈,最后跳转到romStart函数执行。
bootInit.c:romStart
romStart函数主要完成如下任务:首先将romInit 函数及其自身复制到RAM_LOW_ADRS 变量指向的RAM 区,以便从RAM执行。注意,此后在下载VxWorks内核映像时,内核映像也被下载到RAM_LOW_ADRS变量指向的内存处,所以这部分代码此后将被覆盖,同样,bootrom 占用的所有其他内存最后也将被VxWorks内核回收(如由RAM_HIGH_ADRS指向的内核空间)。将bootrom 程序其他部分(压缩部分)从ROM 区复制到RAM 区(由RAM_HIGH_ADRS变量指向的内存地址处),并解压缩。
对于cold boot(冷启动)方式,将其复制到RAM 区清零。最后跳转到usrInit(注意:是bootConfig.c文件中定义的)函数进行执行。
bootConfig.c:usrInit
usrInit函数此处主要进行外围硬件初始化,为下载VxWorks内核映像做初始准备,而后创建tUsrBoot 进程调用usrRoot 程序进一步完成驱动程序初始化工作,为下载VxWorks内核映像做进一步工作,最后创建tBoot 进程调用bootCmdLoop函数完成VxWorks的内核映像下载。在下载完成后,调转到下载起始地址处执行,此时下载型VxWorks内核入口函数sysInit将被调用执行,真正开始VxWorks 操作系统的启动过程。最终在usrConfig.c:usrRoot 函数执行完毕后,VxWorks操作系统即完成启动,系统进入正常运行状态。
整个运行流程如下:(采用“映像类型:文件名:函数名”形式)
bootrom:romInit.s:romInit
→bootrom:bootInit.c:romStart
→bootrom:bootConfig.c:usrInit
→bootrom:bootConfig.c:usrRoot
→bootrom:bootConfig.c:bootCmdLoop
完成VxWorks 内核映像下载,并跳转到VxWorks内核入口函数(sysInit)执行代码
→VxWorks:sysALib.s:sysInit
→VxWorks:usrConfig.c:usrInit
→VxWorks:usrConfig.c:usrRoot
→VxWorks操作系统完成启动。
在Tornado环境下选择菜单build->build Boot ROM,然后选择你要build的BSP和Bootrom类型,选择OK即可。
制作VxWorks引导盘,可以将生成的bootrom.bin改名为bootrom.sys;
将生成的bootrom.sys文件拷贝到硬盘或CF卡中;
将tornado\host\x86-win32\bin目录下的vxload.com文件,以及用于启动的autoexec.bat、configy.sys及HIMEM.SYS文件再拷贝到硬盘或CF卡中。
VxWorks映象由文本段(.text/.code),数据段(.data)和BSS段(.bss)组成。文本段相当于代码段,是由一些指令组成的;数据段就是由一些初始化过的全局和静态变量组成;BSS段也是由全局变量和静态变量组成,只不过他们都没有经过初始化。
VxWorks映像类型分为:
为了自定义你的开发环境的启动程序,你必须编辑BSP中的“config.h”文件。这个文件中包含了对DEFAULT_BOOT_LINE的定义,在定义中确定了启动设备,主机和目标机的IP地址,要加载的VxWorks镜像的位置等等。
在VxWorks的开发过程中,用户需要反复的修改VxWorks程序,这个时候,我们可以采用网络加载VxWorks的方式,也就是说,用主机作为服务器,做好引导程序后,系统会自动通过ftp协议,在主机上的ftp server上下载VxWorks镜像。通过网络下载时,config.h中的DEFAULT_BOOT_LINE按如下配置修改:
#define DEFAULT_BOOT_LINE "fei(0,0) host:vxWorks h=192.168.0.33 e=192.168.0.18 u=user pw=123"
解释:
fei:Intel 82559 EtherExpress网卡;
Host:主机名,让VxWorks知道的主机的名字;
vxWorks 从主机加载的VxWorks文件;
h=192.168.0.33 主机的IP地址;
e=192.168.0.18 目标机的IP地址;
u=xxx 用户名,pw=xxx 密码,登录主机ftp服务器的用户名和密码。
如果程序开发完成,要脱离开发环境,这个时候需要将VxWorks的镜像直接放在目标机的硬盘上,config.h中的DEFAULT_BOOT_LINE可以按如下配置修改:
#define DEFAULT_BOOT_LINE "ata=0,0(0,0) host:/ata0/vxWorks h=192.168.0.33 e=192.168.0.18 u=user pw=123"
在boot程序启动时,它先寻找NVRAM里面有无boot line,如没有,则将DEFAULT_BOOT_LINE里的内容添入BOOT_PARAMS结构里,然后启动程序和vxworks内核利用此结构寻找启动参数。
typedef struct /* BOOT_PARAMS */
{
char bootDev [BOOT_DEV_LEN]; /* boot device code */
char hostName [BOOT_HOST_LEN]; /* name of host */
char targetName [BOOT_HOST_LEN]; /* name of target */
char ead [BOOT_ADDR_LEN]; /*ethernet internet addr */
char bad [BOOT_ADDR_LEN]; /* backplane internet addr */
char had [BOOT_ADDR_LEN]; /* host internet addr */
char gad [BOOT_ADDR_LEN]; /* gateway internet addr */
char bootFile [BOOT_FILE_LEN]; /*name of boot file */
char startupScript [BOOT_FILE_LEN]; /*name of startup script file */
char usr [BOOT_USR_LEN]; /* user name */
char passwd [BOOT_PASSWORD_LEN]; /* password */
char other [BOOT_OTHER_LEN]; /* available for applications */
int procNum; /*processor number */
int unitNum; /*network device unit number */
int flags; /* configuration flags */
} BOOT_PARAMS;
下面看DEFAULT_BOOT_LINE结构:
bootDev(unitNum,procNum)
hostname:bootFile e=ead b=bad h=had g=gad u=username pw=password f=flags tn=targetName s=startupScript o=other
bootDev :设备名
软盘:fd;硬盘:ATA;网络要根据网卡的类型来做:NE2000及其兼容网卡为ENE,3COM以太网卡为ELT,Intel网卡为EEX,Intel82559网卡为fei ,3C905B PCI网卡为elPci。
hostname:主机名,任意
bootFile:存放vxworks image的路径
unitNum :设备单元号,一般指为0
procnum:cpu的处理器号,一般为0
ead :目标机ip地址,此值如为空,网络接口不被帮定
bad :背板接口
had : 主机ip地址
gad :网关地址,如果主机和目标机不在一个局网里,需要配置
usr :使用FTP或RSH时的用户名
passwd:ftp password
flags :标识,十六进制数,意义如下:
targetName:目标机名
startupScript:脚本名,在boot以后的target shell里执行
other:从网络启动时此值可为空,当从软盘或硬盘启动时,如果此值为你的网络设备,boot会为你绑定网络设备
下载型vxWorks启动方式概述 http://blog.chinaunix.net/uid-20635057-id-3334964.html
VxWorks下的硬盘启动方法 https://wenku.baidu.com/view/fdf08ba402d276a200292eed.html