分类: 嵌入式
2012-09-02 09:41:53
下载型启动方式概述
下载形式的VxWorks启动方式需要bootrom引导程序,该程序将被烧录到开发板的ROM或者Flash中,在上电时,系统将自动跳转到ROM或者Flash起始地址处运行该bootrom引导程序,该引导程序进行必要的系统初始化,从而为下载VxWorks内核映像做准备,如通过网口下载时,则需要先调用网口驱动程序进行网口初始化。
由于bootrom的主要工作是下载真正的VxWorks内核映像到系统RAM中,所以其进行的初始化工作也是为这一目的,在文件组织上,虽然从上文中可以看到其与VxWorks内核映像的文件组成非常相似,但其使用bootConfig.c文件,而VxWorks内核映像则使用usrConfig.c文件。这两个文件中虽然定义有相同的函数名(如usrInit、usrRoot),但在实现上存在很大的差异:bootConfig.c文件实现完成从某个服务器下载真正的VxWorks内核映像到系统RAM中(由变量RAM_LOW_ADRS指向的内存地址处),并跳转到sysInit函数(定义在sysALib.s文件中第一个且必须是第一个函数,该函数即被装载到变量RAM_LOW_ADRS 指向的内存地址处)执行;usrConfig.c 文件实现完成一个操作系统正常运行所需要的所有初始化工作。简言之,bootConfig.c文件完成VxWorks内核映像的下载,而usrConfig.c完成初始化VxWorks操作系统的所有工作。
按bootrom执行方式的不同,bootrom文件存在如下三种文件类型。
(1)bootrom.bin
它为压缩bootrom文件形式,此种文件形式主要为解决开发板上ROM或者Flash的空间限制。注意:压缩并非对所有的文件进行压缩,而是除了romInit.s和bootInit.c文件的其他所有文件,因为解压缩程序必须是非压缩形式的。
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指向的内核空间)。
l 将bootrom 程序其他部分(压缩部分)从ROM 区复制到RAM 区(由RAM_HIGH_ADRS变量指向的内存地址处),并解压缩。
l 对于cold boot(冷启动)方式,将其复制到RAM 区清零。
l 最后跳转到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操作系统完成启动。
如图3-5所示为bootrom完成下载VxWorks内核映像后的RAM布局,此时,之前bootrom占用的所有区域均被VxWorks操作系统回收。
(2)bootrom_uncmp.bin和bootrom_res.bin
上述两种形式的bootrom执行流程基本与bootrom.bin 相同。差别在于:
① bootrom_uncmp.bin。
该文件类型为非压缩类型,所以区别以上压缩形式的地方在于romStart 函数将bootrom从ROM 移动到RAM 中时,无须进行解压缩工作,移动到的RAM 区地址仍然由RAM_HIGH_ADRS 变量指定。注意,对于非压缩bootrom,所有的代码(包括已经执行的romInit 函数、当前执行的romStart 函数、构成bootrom 的其他所有函数)都一次性从ROM复制到RAM中,RAM 中目的地址由RAM_HIGH_ADRS变量指定,如图3-1 所示。函数执行流程同压缩版本。
② bootrom_res.bin。
res 全称为resident,此处的意思为程序代码部分将驻留在ROM 中,所以不同于上文中的地方,即romStart 函数只复制bootrom引导程序的数据段到RAM_HIGH_ADRS 变量指向的RAM 区。代码执行还是从ROM区中取,此种方式一般在开发板ROM区较大时采用,但会增加执行时间,另外,由于需要从ROM中直接执行,故也不能采用代码压缩方式。
下载方式中使用的VxWorks 内核映像一般命名为“VxWorks”(不包含内核符号表,此时创建一个独立的内核符号表文件VxWorks.sym,如果需要将内核符号表包含其中,则在config.h文件中定义INCLUDE_STANDALONE_SYM_TBL组件)或者“VxWorks_st”(内含内核符号表),而其他启动方式(一般就为ROM 启动方式)下的VxWorks 内核映像名都具有一个后缀,如VxWorks_rom表示从ROM直接启动,VxWorks_res_rom表示代码部分驻留在ROM 中,当然也是从ROM 直接启动。