Chinaunix首页 | 论坛 | 博客
  • 博客访问: 308995
  • 博文数量: 72
  • 博客积分: 3111
  • 博客等级: 中校
  • 技术积分: 668
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-30 15:45
个人简介

朝着心的方向前进

文章分类

全部博文(72)

文章存档

2014年(5)

2013年(1)

2012年(1)

2011年(1)

2010年(24)

2009年(40)

我的朋友

分类:

2009-09-21 16:25:47

一,启动顺序的一些概念
上电启动Vxworks image发生事件的顺序
处理器跳到ROM或Flash中的Boot-strap程序的起点,其主要作用
    关闭中断(来自CPU内部)
    初始化目标内存
    装载要运行的VxWorks Iamge segment
    Jumps to code to place target in quiet state
   
启动顺序----Loadable VxWorks image
    bootstrap n.【自】自展(指把已能运行的语言编译程序作为工具来写所要实现的编译程序); 引导
   
    从ROM或Flash 启动代码,自展代码执行,同时加载代码段的数据段,到RAM
    具体如下:
        boot code compressed-decompression during copy
        boot code uncompressed-copy
        boot code is ROM-resident-copy data segment only
       
   执行这段启动代码,加载Vxworks镜像文件到RAM,跳转到VxWorks的入口点
  
   system initialization code statically linked into loaded VxWorks
   iamge executes and completes initialization
  
启动顺序---VxWorks的初始化
    以下过程
    准备硬件环境
    初始化Wind kernel并开始之
    Spawn a tast to complete system initialization
   
系统初始化的工作主要完成对支持最终用户的特性的支持同时执行最终
用户的应用程序

二,系统启动的详述
    VxWorks image运行的两种方式
    Rom中运行,只复制data段到低地址,节省内存
    RAM中运行,全部复制,消耗内存,
    需要调用sysInit()函数,该函数在RAM中运行的VxWorks
    中初始化RAM,这也是两者区别
   
注:三种VxWorks的image类型
1. Loadable Images:由Boot-ROM引导通过网口或串口下载到RAM
2. ROM-based Images(压缩/没有压缩):即将Image直接烧入ROM,运行时
    将Image拷入RAM中运行。
3. ROM-Resident Images:Image的指令部分驻留在ROM中运行,仅将数据段
    部分拷入RAM。
另外一种boot iamge
 Boot Image:包含一段叫做BootStrap Programs的程序+一
    段ROM BOOT Program程序。
 
  1)ROM中运行VxWorks
    VxWorks在ROM中运行,即写入ROM中的VxWorks是非压缩的,不需要
    解压,系统直接跳到ROM的首地址,运行VxWorks,
    注意:这种运行方式并不支持所有的主板,使用时查主板手册
   
    文件romInit.s中的romInin()----->文件bootInit.c中的romStart()
    ----->文件usrConfig.c中的usrInit()---->sysHwinit()---->
    usrKernelInit()---->KernelInit(usrRoot,....)
   
    VxWorks在ROM中运行主要是节省RAM空间。为应用程序提供更大的空间
    。只把VxWorks image的data段复制到了RAM的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
   
    usrInit()前面是不压缩的,即romInit(),romStart()不能压缩
   
    文件romInit.s中的romInit()---->文件bootInit.c中的romStart()--->
    sysLib.s中的sysLib.s中的sysInit()--->文件usrConfig.c中的usrInit
    ()--->sysHwInit()--->UsrKernel()--->KernelInit(usrRoot,...)
   
    该方式VxWorks iamge的text和data段都会从ROM复制到RAM,在RAM中
    运行。
   
    usrRoot()是VxWorks启动的第一个任务,它用来初始化driver,network
   
    解释:
    romInit.s first execute in flash, initializition,jump to
    romStart
   
    romStart()开始装载和解压image到RAM,sysLib.s是在RAM中执行的第一
    个函数
   
  3)bootROM iamge
    最少的系统初始化,主要用于启动和装载Vxworks image.也分为压缩和
    不可压缩的两种,bootrom和boot_uncmp.
    与VxWorks image的区别:
        bootrom调用bootConfig.c
        VxWorks image调用usrConfig.c
       
     文件romInit.s中的romInit()--->文件bootInit.c中的romStart()--->
     文件bootConfig.c中的usrInit()--->sysHwInit()--->usrKernelInit
     ()--->KnernelInit(usrRoot,...)
    
    
     bootConfig.c是boot ROM设置模块,用于通过网络加载VxWorks image
     usrRoot()--->boorCmdLoop(void)命令选择,或autobooting--->
     bootLoad(pLine,&entry)加载模块到内存(内络,TFFS,TSFS...)
     --->netifAttch()--->go(entry)--->从入口开始,不返回
    
     各个函数的作用
    
     romInit()----上电,禁用中断,把启动类型放到堆栈上,清除caches
     romStart()---加载image的段到Ram
     usrInit()----锁定中断,保存启动类型信息,初始化为启动内核准备
                  创建初始化任务usrRoot()
     sysHwInit()--Interrupt locked,初始化硬件,寄存器,激活内核
     kernelInit(usrRoot,...)---
            初始化并启动内核
            定义系统内存分区
            激活用户的任务完成初始化
            usrInit()stack
           
     usrRoot()
     初始化内存分区表(memory partition library)
     初始化系统时钟
     初始输入输出(I/O system)可选
     Create devices 可选
     设置网络---可选
     激活WDB目标通信--可选
     调用程序(activate application)
三,比较说明   
      流程图
     
     
      boot ROM                          VxWorks image
      romInit()
      romStart()                        sysInit()
                 \                     /
                  \_______     _______/ 
      bootConfig.c       usrInit()      usrConfig.c
                         sysHwInit()
                         usrKernelinit()
                         usrRoot()
                                    \
                                     usrAppInit()
                          启动应用程序
  
Boot Image + Loadable Images 引导模式下,如上图,执行两个阶段
注:
boot iamge中包含BootSrap Programs
     BootStrap Programs把Boot Program程序加载到RAM中的
     RAM_HIGH_ADRS 处,然后控制权交给Boot Program,由
     Boot Program负责一系列简单的硬件初始化(网口,串口等),
     开始下载Loadable Images(即包含应用的VxWorks操作系统)
     到RAM_LOW_ADRS,然后控制权交给VxWorks操作系统开始执行。
 
第一个在阶段为第二个阶段作准备
   第一阶段的执行流程使用的是上图的左边的源文件中的那些函数romInit->romStart->usrInit->sysHwinit->usrKernelinit->usrRoot
 
第一阶段:
       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映像
第二阶段执行流程使用的是上图中右边源文件中的那些函数sysInit-> usrInit->sysHwinit->usrKernelinit->usrRoot->usrAppInit
   第二阶段:
       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引导完成
附:
ROM-based Images(压缩/没有压缩):
和上面那种启动方式相比,这种启动方式省去了一些步骤,执行完
romStart()之后就已经加载VxWorks到RAM中了,因此,下一步就是把控制权交给VxWorks,由VxWorks从sysInit()开始执行即可。
我理解为,和上面的第一阶段相比少了romStart后面的一些步骤。
下面是具体的流程:
       romInit.s:romInit()
         系统上电之后,首先调用的函数就是romInit()
         禁止中断
         把启动类型(冷启动/热启动)放在堆栈上
         清除cache
         初始化CPU基本寄存器,调用SDRAM初始化函数初始化UPM
         直接跳转到bootInit.c:romStart()
       bootInit.c:romStart()
         把代码段(如果是VxWorks_rom Resident映像,则不拷贝代码段)
         和数据段从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在RAM中解压的位置
RAM Low Address   
                    VxWorks运行的位置,由bootstrap下载image到此
RAM High Address
                    Boot image由ROM解压后Copy的位置,即bootRom区
 
RAM Low Address,RAM High Address和有关定义在BSP,config.h,makefile
 文件中定义
 
 
VxWorks 在ROM中的情况
注:一般使用ROM-based Images(压缩/没有压缩)???有点小问题
    这种映像因为其本身就包含BootStrap Programs程序,因可以直接
    启动,所以这种映像中也就不需要Boot Programme了,
    首先BootStrap Programs启动,把映像中的VxWorks加载到
    内存的RAM_LOW_ADRS处并开始运行
ROM 高地址位
            压缩的VxWorks Imgage
ROM 低地址位
            没有压缩的romInit.s和romStart()在ROM的起始位置,系统
            power up后,从这个起始位开始执行,即执行romInit(),起
            始位置由硬件定义,一般为0x00000000
其中 RAM_LOW_ADRS, RAM_HIGH_ADRS 等一些地址在makefile 和BSP config.h中定义
 
阅读(3451) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~