VxWorks学习笔记一 ------Bootrom和VxWorks镜像的引导

概述

VxWorks操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统(RTOS)。它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事演习、弹道制导、飞机导航等。

Tornado调试环境

我在开发的时候使用的是Tornado2.2,基于不同的目标机可分为MIPS,ARM和X86等类型。

Bootrom和vxworks映像

对于目标机来说,在启动的时候需要有一个boot程序,boot程序的主要功能是引导vxworks 内核,所以boot程序需要知道vxworks的内核存放在何处,通过什么手段去获取。这个boot程序就是Bootrom,vxworks内核就是VxWorks映像。

Bootrom引导文件

Bootrom引导文件由Tornado编译BSP生成,BSP(Board Support Package)板级支持包放在Tornado\target\config下,主要作用初始化目标板硬件到一个确定的状态,并为VxWorks内核提供对目标板硬件相关的系统调用函数库。

Bootrom的类型

  1. bootrom,压缩型,占用 flash 空间小,其中大部分被压缩过
  2. bootrom_uncmp,非压缩型,较 bootrom 型占用 flash 大些,所有的代码都一次性从ROM复制到RAM中,无需解压
  3. bootrom_res,非压缩型,较 bootrom 型占用 flash 大些,只复制bootrom引导程序的数据段到RAM 区,无需解压

无后缀: ELF可执行文件格式
.hex后缀:Motorola S-record文件格式
.bin 后缀:二进制输出, 一般烧到ROM/Flash零地址处。

Bootrom的执行流程

bootrom执行流程如下:

  1. romInit.s:romInit
    romInit函数完成系统硬件环境下必要的初始化工作,如从系统角度禁止中断,初始化相关寄存器到可知状态,初始化内存控制器,初始化函数调用所需的栈,最后跳转到romStart函数执行。

  2. 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文件中定义的)函数进行执行。

  3. 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操作系统完成启动。

Bootrom的编译

在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映像

VxWorks的映像的组成

VxWorks映象由文本段(.text/.code),数据段(.data)和BSS段(.bss)组成。文本段相当于代码段,是由一些指令组成的;数据段就是由一些初始化过的全局和静态变量组成;BSS段也是由全局变量和静态变量组成,只不过他们都没有经过初始化。

VxWorks映像类型分为:

  • VxWorks,RAM运行的VxWorks映像
  • VxWorks_rom,ROM启动,RAM运行的VxWorks映像,不需要BootRom辅助
  • VxWorks_romCompress,VxWorks_rom的压缩形式
  • VxWorks_romResiden,ROM启动,ROM运行的VxWorks,不需要BootRom辅助

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_PARAMS

在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 :标识,十六进制数,意义如下:

    • 0x01: 关闭对处理器0的系统控制
    • 0x02: 将局部symbols和全局symbols装入目标机symbols表
    • 0x04: 禁止自动启动(即由用户输入boot line)
    • 0x08: 快速boot(不计数等待用户输入)
    • 0x40: 使用BOOTP or DHCP client
    • 0x80: 使用TFTP获取image,否则使用RSH或FTP,用FTP时pw不为空
    • 0x100: 使目标机登记为一个代理ARP client
  • 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

你可能感兴趣的:(Vxworks学习)