ROM型啟動方式概述
ROM 型啟動方式概述
所有的VxWorks 內核映像類型中,隻有VxWorks 類型使用的bootrom 引導程序進行啟動,此時VxWorks 內核映像放置在主機端,由目標板bootrom 完成VxWorks 的下載,一般通過網口(或串口)方式進行。其他類型(文件名中帶有rom字樣的)無須bootrom的配合,也即不需要bootrom。因為這些VxWorks 類型的內核映像自身(而非bootrom)被燒入開發板係統ROM或者Flash中,均無須進行下載,係統上電時,將直接跳轉到VxWorks內核映像入口函數執行操作係統的初始化工作。
ROM型啟動方式下的VxWorks內核映像類型有以下幾類。
① VxWorks_rom.bin:非壓縮版VxWorks內核映像類型不含內核符號表。如果需要包含內核符號表,則在config.h文件中定義INCLUDE_STANDALONE_SYM_TBL組件。
② VxWorks.res_rom.bin:非壓縮版代碼駐留ROM 中執行的VxWorks內核映像類型(含內核符號表)。
③ VxWorks.res_rom_nosym.bin:非壓縮版代碼駐留ROM中執行的,不包含內核符號表的VxWorks內核映像類型。
④ VxWorks.st_rom.bin:壓縮版本的內含內核符號表的VxWorks內核映像類型。
⑤ VxWorks_romCompress.bin:壓縮版的不含內核符號表的VxWorks內核映像類型。
不同的VxWorks內核版本下,在內核映像名稱上會有所變化,但一般都包含在以上類型中。從這些映像類型來看,主要有以下區分:
l 是否為ROM駐留方式,即代碼是否被複製到RAM中執行。
l 是否進行了壓縮。
l 是否包含符號表。
VxWorks內核映像是否包含內核符號表對於後續函數的調用非常重要,如在串口命令行下輸入一個函數名稱,如果內核映像不包含內核符號表,即使在內核中包含該函數定義,在終端也會給出“undefined symbol”錯誤。
以下從三個不同角度介紹它們的不同點,首先以VxWorks_rom.bin文件類型介紹執行的基本流程(采用“文件名:函數名”方式)。
1)romInit.s:romInit。
此處romInit函數完成的工作同bootrom,實際上,二者使用相同的romInit函數實現。
2)bootInit.c:romStart。
首先將其自身複製到RAM_HIGH_ADRS變量指向的RAM 區,以便從RAM執行。注意與上文中bootrom 的區別,雖然使用的是相同的romStart 函數實現,但在RAM 地址上存在差別,關鍵點在於VxWorks內核映像被複製到RAM_LOW_ADRS指向的內存地址處。
romStart函數完成如下任務:
l 由於是非壓縮版本的VxWorks 內核映像,故所有的代碼一次性從ROM 複製到由RAM_LOW_ADRS變量指向的RAM 內存處。
l 對於cold boot(冷啟動)方式,將其他BSS區清零。
l 最後跳轉到usrInit(注意:是usrConfig.c文件中定義的)函數進行執行。
3)此後的執行流程為:usrConfig.c:usrInit→usrConfig.c:usrRoot。usrConfig.c:usrRoot 函數執行完畢後,VxWorks操作係統即已完成啟動,係統進入正常運行狀態。
其他ROM型VxWorks內核映像啟動流程差別如下:
1)是否為ROM 駐留方式。
對於ROM 駐留方式而言,在以上第一步中隻將數據部分從ROM 載入到由RAM_LOW_ADRS指向的內存區域,代碼仍然滯留在ROM中,此後一直從ROM 中讀取代碼執行,此種執行方式造成效率的部分損失,一般也較少使用。涉及的文件類型為:
VxWorks.res_rom.bin和VxWorks.res_rom_nosym.bin。
2)是否進行了壓縮。
對於壓縮的VxWorks內核映像,在以上第一步複製中,將分兩個階段完成:第一階段完成非壓縮代碼(romInit函數、romStart函數)的複製,這部分代碼被複製到RAM_HIGH_ADRS指向的RAM 內存處;第二階段完成壓縮代碼的解壓縮和複製過程,這部分代碼被解壓縮到RAM_LOW_ADRS指向的RAM 內存處。
3)是否包含了符號表。
所謂符號表,是內核中定義的所有函數與其(虛擬)地址的對應關係表。符號表與VxWorks內核映像一般是分離的,為了調試方便,一般需要獨立的載入符號表,當然也可以將符號表納入VxWorks 內核映像中作為一個整體。VxWorks.st_rom.bin文件類型即將符號表作為了內核映像的一部分。
符號表最大的作用是在命令行直接輸入函數名即可運行該函數,內核查詢符號表獲得對應的地址並轉到該地址處執行。另外,在調試時,也可以對地址進行函數名標注,從而方便調試,符號表與VxWorks內核通常是獨立的,所以無論是否包含符號表,都不會對內核初始化流程造成影響。當VxWorks內核映像被載入RAM後,進入usrInit函數執行時,最終分布圖如圖3-5 所示。
ROM型VxWorks內核映像類型啟動流程總結如下(由於其中隻涉及VxWorks內核,故采用“文件名:函數名”方式)。
romInit.s:romInit→bootInit.c:romStart→完成VxWorks 內核從ROM到RAM 的複製(和解壓縮)→usrConfig.c:usrInit→usrConfig.c:usrRoot→VxWorks操作係統啟動完成。
最後更新:2017-04-03 12:55:38