VxWorks啓動解析

一,啓動順序的一些概念
上電啓動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中定義

 

參考:


   http://www.embhelp.com/drew/mypage/bsp_boot.htm

   http://blog.csdn.net/huangxb_csu/archive/2008/10/14/3072477.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章