VxWorks系統的映像及其裝載過程解析

 

VxWorks系統的映像及其裝載過程解析

VxWorks是一款優秀的嵌入式實時多任務操作系統,以良好的持續發展能力、高性能的內核以及友好的用戶開發環境。      在嵌入式實時操作系統領域佔據了重要的一席之地,受到越來越多的用戶的青睞。但是作爲初學者而言,VxWorks提供了衆多的程序映像類型,在開發過程中十分容易讓人感到困惑,而且相關的參考資料對這個問題的描述也不集中,因此,本文擬對VxWorks的幾種映像作詳細的分析。
       1 系統映像
  
        VxWorks的映像主要包括兩大類,一類是BootRom類型,一類是VxWorks類型。
  
       (1)BootRom類型
  
      BootRom類型映像是一個最小化、專用的VxWorks引導映像,實現最少的系統初始化,主要用於啓動裝載VxWorks映像,其功能類似於PC機的BIOS。BootRom運行時也建立起多任務環境,包括usrRoot任務、網絡任務、TFFS任務和FTP任務等。引導映像在運行時,可能在ROM/Flash中執行(例如ROM駐留型引導映像),也可能在RAM 中執行。在系統中其對應的編譯規則文件是rules.bsp。
  
        BootRom類型分爲三種:BootRom_res、BootRom_uncmp和BootRom。第一種是一直運行在rom中的映象,只把data段拷貝到ram裏面;第二種是非壓縮方式的映象,data段和text段都要拷貝到ram裏面,並在ram裏面運行;第三種是壓縮方式的映象,生成的時候編譯器會把除掉romlnit.s和bootInit.c之外的目標文件壓縮並“彙編”成一個bootrom.Z.s,最後和romInit.o,bootInit.o,version.o進行鏈接,生成bootrom映像。所以它也是要全部拷貝到ram中,並必須要進行解壓縮的工作。而這些工作基本上都是在bootInit.c中進行的。
  
       (2)VxWorks類型
  
       VxWorks類型映像是系統的主映像,也即是系統最終要運行的映像。該映像在運行時至少有一部分(如:數據段和BSS段)需要在RAM中運行。在系統中其對應的編譯規則文件是rules.vxWorks。

        VxWorks類型映像分爲四種:VxWorks、VxWorks_rom、VxWorks_romResident和VxWorks_romCompress。如表1。
  表1 VxWorks類型映像

[table=410][tr][td][indent][align=center]文件名[/align][/indent][/td][td][align=center]說明[/align][/td][/tr][tr][td][align=center]VxWorks[/align][/td][td][align=center]RAM運行的VxWorks映像[/align][/td][/tr][tr][td][align=center]VxWorks_rom[/align][/td][td][align=center]ROM 自動RAM 運行的VxWorks映像,不需要BootRom輔助[/align][/td][/tr][tr][td][align=center]VxWorks_romCompress [/align][/td][td][align=center]VxWorks_rom 的壓縮形式[/align][/td][/tr][tr][td][align=center]VxWorks_romResiden [/align][/td][td][align=center]ROM啓動ROM運行的VxWorks映像,不需要BootRom輔助[/align][/td][/tr][/table]
       (3)BootRom 類型映像和VxWorks類型映像的聯繫與區別
  對於沒有自啓動功能的VxWorks類型映像(例如:VxWorks型),在映像運行前就需要一段程序將該映像拷貝到RAM中運行,而BootRom類型映像在此時就扮演了這種“搬運工”的角色,當VxWorks系統下載完畢,BootRom的任務也就完成了。二者在系統初始化的時候,所做的功能基本相同,但是區別在於BootRom類型映像調用bootConfig.c,而VxWorks類型映像調用usrConfig.c。        2 映像裝載過程
  (1)VxWorks_romCompress和VxWorks_rom(如圖1)
    
[align=center][img]http://image.mcuol.com/News/071221133335700.jpg[/img][/align]   將不包含VxWorks二進制映像的引導程序data段複製到RAM 中的RAM_HIGH_ADRS。
  
      冷啓動後,將從LOCAL_MEM_LOCAL_ADRS+RESER-VED的內存地址到RAM_HIGH_ADRS-STACK_SAVE的內存地址清零。將從引導程序bss段末端到LOCAL_MEM_LOCAL_ADRS+LOCAL_MEM_SIZE-USER_RESERVED_MEM的內存也清零。
  
       拷貝VxWorks時,VxWorks_rom 類型映像直接拷貝到以RAM_LOW_ADRS爲開始的RAM 中,而VxWorks_rom-Compress類型的映像將壓縮的VxWorks解壓到以RAM_LOW_ADRS爲開始的RAM 中。
  
       跳到位於RAM_LOW_ADRS地址的解壓的VxWorks的入口點,引導代碼和堆棧空間將被覆蓋。
  
       (2)VxWorks_romResident(如圖2)
[align=center][img]http://image.mcuol.com/News/071221133335811.jpg[/img][/align]
   該映像包含引導代碼,在重啓時清空RAM,引導代碼只將data段拷貝到RAM 中的RAM_LOW_ADRS處。而系統的運行是在ROM 中進行的。
  
      相對其他映像,這種映像啓動速度快,需要的RAM 空間少,但是運行速度慢。
  
       (3)VxWorks
  該映像本身不包含引導程序,需要一個獨立的引導程序從本地存儲器或者經由網絡獲取該映像,然後將其下載到RAM中的RAM_LOW_LADRS處運行。這個獨立的引導程序就是上文提到的BootRom類型映像,它可以分爲BootRom_res、BootRom_uncmp和BootRom三種。在開發過程中,獨立的引導程序需要使用傳統的BSP機制來配置和構建。

       圖3所示是壓縮型的引導程序映像BootRom的標準啓動流程,而BootRom_uncmp是非壓縮型的引導程序映像,BootRom_res是常駐ROM 型的引導程序映像。
[align=center][img]http://image.mcuol.com/News/071221133335872.jpg[/img][/align]      對BootRom型的引導映像來說,啓動過程稍微複雜點。它包括壓縮部分跟非壓縮部分,這個無壓縮的部分就是romInit.s+BootInit.c,稱爲Bootstrap。一上電時,Bootstrap就在Flash/ROM中執行,入口點就是romInit.s的第一條語句。Bootstrap首先把自己拷貝到RAM_LOW_ADRS(因爲此時還沒有加載VxWorks主映像,所以先借用一下),然後解壓縮自身到RAM_HIGH_ADRS。然後跳到RAM_HIGH_ADRS運行引導程序。引導代碼執行後,把VxWorks映像裝入到起始地址爲RAM_LOW_ ADRS的RAM中(覆蓋掉了先前拷貝的bootstrap程序),然後跳轉到VxWorks映像裝入點運行。
  
       對BootRom_uncmp來說,過程與BootRom 相似,只不過一開始就把自身拷貝到RAM_HIGH_ADRS地址上運行,省去了解壓縮的過程。
  
       對BootRom_res類型映像來說,僅僅將它的數據段拷貝到RAM_HIGH_ADRS位置。然後在Flash/ROM中運行引導程序。其餘過程同上。
  
      採用獨立引導程序的VxWorks系統,不但可以通過本地存儲器(如硬盤)獲取VxWorks主映像,還可以通過網絡獲取。圖4所示就是這個過程。被下載的VxWorks主映像位於RAM中的RAM_LOW_ADRS處,映像的頂端叫FREE_RAM_ADRS。下載完VxWorks後,引導程序跳到下載映像的sysInit()入口點處(位於RAM_LOW_ADRS)。從這以後,引導程序就完成了它的工作。
           
[align=center][img]http://image.mcuol.com/News/071221133335923.jpg[/img][/align]
   [b]    3 結束語
[/b]  
       總之,VxWorks系統包括多種不同的映像,各自之間的差別造成裝載過程的不同,正確的理解這些差異,靈活地使用這些映像,將給開發者帶來事半功倍的效果。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章