VxWorks BSP和启动过程

来源:互联网 发布:孕囊第三个数据大很多 编辑:程序博客网 时间:2024/05/02 05:44

VxWorks BSP和启动过程

    先讲讲BSP和BootRom之间的区别BSP只与“target/config/”下对应目录相关。romInit.s定义系统的入口romInit()函数,系统上电最先执行的代码。romInit()禁止CPU中断,设置初始堆栈,配置DRAM控制器等少数CPU设置后调用第一个C程序romStart()。进一步硬件初始化有sysLib.c中定义sysHwInit函数完成。romInit.s中的硬件初始化会在sysALib.s或sysLib.s重复一遍。因为vxworks程序只需要BootRom提供参数串和启动代码。而不依赖于BootRom的硬件初始化(除了RAM初始化)。BootRom和Vxworks的无关运行是一个原则,若不遵循这个原则,就会出现Vxworks和BootRom的关联修改。


    从宏观角度看来,一般是先加载BootRom;BootRom再加载VxWorks应用,并跳转到Vxworks的入口sysInit执行;VxWorks有可能根据启动的脚本文件加载应用模块。整个过程完成后,系统进入多任务环境。
对于PC兼容体系结构,CPU不能从这样的存储器中获取指令执行,而需要BIOS的辅助。BIOS将启动盘的引导扇区复制到主内存空间,再跳内存的指定地址执行。BIOS本身所处的存储器是CPU可直接访问执行的。BIOS再加载程序映象时用自己的规范,比如引导扇区的位置和大小等。BootRom自己能满足这样的要求,比如说大小,BootRom比一个扇区大了许多。BIOS不能直接加载BootRom,而只能先加载辅助的小程序Vxld。由于大小限制,Vxld不支持完善的文件系统,所以要求启动盘上的BootRom文件必须连续存放。Vxld再加载BootRom。由于硬件环境限制,Vxld必须做的非常小,不能启动保护模式和支持翻检系统,因而限制了所能减灾程序映象的大小和内存加载位置。启动盘(如软盘)的大小也会限制程序映象的大小。


    也有可能由于环境影响,出现BootRom与Vxworks映象融合在一起的情况,可以直接从Rom启动但是不灵活。

 

VxWorks Image的种类
1。ROM-based images(compressed/uncompressed)
2。Loadable VxWorks image:通过VxWorks boot image 装载的VxWorks image
3。VxWorks boot images:用于启动Loadable VxWorks image的A VxWorks image
4。ROM-resident image:只拷贝image中的数据部分(data segment)到内存RAM,留下程序
                      部分(text segment)在ROM中执行,这样空出更多的RAM空间给
                      应用程序。
5。VxWorks ROM image:装载进ROM或者flash,可能在ROM或者flash中运行的image.
6。VxWorks image的组成:Text segment、data segment、BSS Segment.
8。VxWorks.st(文件很大):独立的image,包含shell和symbol table在目标机运行。
9。ROM based images(直接烧入ROM的VxWorks):
   VxWorks_rom:Tornado in ROM,非压缩,在RAM中运行。
   VxWorks.res_rom_nosym:Tornado in ROM,在ROM中运行。
   VxWorks.st_rom:stand-alone in ROM,压缩,RAM中运行。
   VxWorks.res_ROM:Stand-alone in ROM,非压缩,ROM中运行。

 

操作系统的启动顺序
1。处理器“跳”到在ROM或Flash中Boot-strap程序的起点,该程序主要有一下作用:
   关闭中断;
   初始化目标内存;
   装载要运行的VxWorks image segments;
   “跳”到放置目标系统为静态的代码处。
2。Loadable VxWorks image:
   bootstrap代码开始执行,从ROM或者FLASH中装载启动代码的文本段和数据段数据
3。启动代码(Boot code)压缩的启动代码在拷贝的过程中解压缩。
4。未压缩的代码直接拷贝。
5。如果启动代码是ROM-resident,只拷贝数据段。
6。启动程序(Boot program)执行,把VxWorks装载进RAM。“跳”到VxWorks的装载点。
7。系统初始化代码被静态链接到装载VxWorks image执行,系统完成初始化。

 

系统初始化完成的功能
1。设置硬件环境未静态。
2。初始化和启动wind kernel。
3。建立任务完成系统初始化。
4。系统初始化任务完成初始化支持最终用户指定的设施,启动最终用户的应用。


系统启动顺序(初始化顺序分为在RAM中运行还是在ROM中运行)
1。ROM中运行的VxWorks:
   VxWorks在ROM中运行,即写入ROM中的VxWorks是非压缩的,不需要解压缩,系统直接
   跳到ROM的首地址,运行VxWorks,ROM中运行的VxWorks缺点是运行速度慢。
   romInit.s:  romInit()
   bootInit.c: romstart()
   usrConfig.c:usrInit()-sysHwInit()-usrKernelInit()-KernelInit(usrRoot,...)
   注意:在ROM中运行主要是为了节省RAM空间,只把VxWorks image的data段复制到
         LOCAL_LOW_ADRS,text部分留在ROM,并在ROM中执行。
2。RAM中运行的VxWorks:
   VxWorks在RAM中运行,即写入ROM中的BOOT或者VxWorks Image是压缩的。
   需要先解压copy所有的text和data到RAM的LOCAL_LOW_ADRS中,下面sysInit()主要是
   初始化RAM用的,系统直接跳到RAM的首地址,运行VxWorks:
    romInit.s:  romInit()
    bootInit.c: romStart()
    sysALib.s:  sysInit()
    usrConfig.c:usrInit()-sysHwInit()-usrKernelInit()-KernelInit(usrRoot,...)
   注意:RAM中运行的BOOT或者VxVorks Image的text segment or data segment会从ROM
         复制到RAM,然后在RAM中运行。
3。usrRoot是VxWorks启动后的第一个任务,由它来初始化driver,network等。
   romInit.s:在flash中第一个运行,然后跳到romStart()
   romStart():开始装载和解压缩image到RAM,sysALib.s是在RAM中执行的第一个函数。
4。BootROM image:主要用于启动装载VxWorks image,一般由压缩的和不压缩的两种形式。
   与VxWorks image的主要区别在于:bootROM调用bootConfig.c,而VxWorks调用usrConfig.c
   romInit.s:   romInit()
   bootInit.c:  romStart()
   bootConfig.c:usrInit()-sysHwInit()-usrKernelInit()-KernelInit(usrRoot,...)
   其中/target/config/all/bootConfig.c是boot ROM的设置模块,用于通过网络加载
   VxWorks image.

romInit(): 上电,禁止中断,清除caches,在栈中设置启动类型。
romStart():装载映象的段数据到RAM中。
usrInit():使能中断,保存启动类型信息,在内核激活前处理所有初始化。然后启动内核
            建立一个初始化任务usrRoot(),完成usrRoot()的启动。
sysHwInit():使能中断,初始化硬件,寄存器,激活内核。
KernelInit(usrRoot,...):初始化和启动内核
                               定义系统内存区
                               激活tUsrRoot完成初始化
                               使能中断
                              使用usrInit()栈
usrRoot():初始化内存分配区
             初始化系统时钟
             激活应用程序(Activate application)
VxWorks Image在RAM中解压缩的位置:RAM Low Address
RAM High Address
一般在makefile或者config.h中定义。

1。romInit.s:romInit()
2。bootInit.c:romStart(),解压缩ROM和ROM image的放置。
3。bootConfig.c:完成Boot ROM image的初始化和控制。
4。usrConfig.c:VxWorks image的初始化代码。
5。configAll.h:缺省定义了VxWorks的设置。
   config.h:涉及CPU主板的设置及定义
6。romInit.s:是VxWorks BOOT ROM和ROM based image的入口。
7。sysAlib.s:程序员可以把自己的汇编函数放在这个文件里,在上层调用,
             VxWorks image的入口点_sysInit在这个文件里,是在RAM中
             执行的第一个函数。
8。sysLib.c:提供一个board-level的接口,VxWorks和应用程序可以以
            system-indepent的方式生成。
9。bootrom.hex:ASIC文件,包含VxWorks Boot ROM代码。
10。VxWorks:运行在目标机上,完整的,连接后的VxWorks二进制文件。
11。VxWorks.sym:完整的,连接后带有符号表的VxWorks二进制文件。
12。VxWorks.st:完整的,连接后,standalone,带有符号表的VxWorks二进制文件。
13。BSP用“make”来编译连接生成,而不是用Tornado的工具。
14。bsp的串口电缆需要用来和开发板(COM1)通信,通过协议WDB.

 

原创粉丝点击