391
技術社區[雲棲]
VxWorks 操作係統內存布局
在VxWorks操作係統過程中可能使用到的BootRom和VxWorks內核映像本身都可以存在兩種方式:壓縮的和非壓縮的。1.非壓縮形式
如果沒有進行壓縮,則隻有一次重定位,即從ROM到RAM隻存在一次代碼複製過程,所有ROM中存儲的代碼都被一次性複製到RAM中。
① 對於BootRom 而言,所有的代碼被一次性複製到RAM_HIGH_ADRS 指定地址處,如圖3-1所示。
② 對於VxWorks_rom 而言,所有的代碼被一次性複製到RAM_LOW_ADRS 指定地址處,如圖3-2 所示。
2.壓縮形式
如果有進行壓縮,則代碼複製過程將分為兩次,一次是非壓縮代碼,另一次是壓縮代碼,且二者複製到內存不同的位置處。
① 對於BootRom 而言,非壓縮代碼(romInit.s、bootInit.c)被直接複製到RAM_LOW_ADRS 處;壓縮代碼複製到RAM_HIGH_ADRS 處,並在複製過程中完成解壓縮,如圖3-3 所示。
② 對於VxWorks_rom 而言,非壓縮代碼(romInit.s、bootInit.c)被直接複製到RAM_HIGH_ADRS處;壓縮代碼複製到RAM_LOW_ADRS處,並在複製過程中完成解壓縮,如圖3-4所示。
事實上,對於壓縮版本,在進行編譯時,進行了兩次代碼鏈接:一次是針對壓縮代碼的鏈接,另一次是將非壓縮代碼和壓縮代碼整合在一起時的鏈接。注意,在進行非壓縮代碼和壓縮代碼的整合時,壓縮代碼部分是作為數據進入整個映像的,所以不會對其進行重新鏈接。對壓縮代碼的鏈接,實際上是在代碼被壓縮之前完成的,完成代碼的鏈接後,生成特定格式的目標文件(如ELF 或者COFF),為了在解壓縮後可以直接執行,首先必須將其轉成二進製可執行文件,通過objcopy函數完成此項功能,此後對生成的二進製可執行文件調用deflate函數進行壓縮,由於需要將壓縮後的代碼最後整合到整個映像中,故壓縮後的文件還需要通過binToAsm 工具進行轉換,轉成一個匯編源文件,該文件將壓縮後的二進製代碼作為數據部分進行保存,從而避免在與非壓縮代碼最後進行二次鏈接時被修改。
兩步鏈接過程中各自指定了不同的鏈接地址,對於壓縮代碼而言,其分為兩種情況,對於BootRom,壓縮代碼被鏈接到了RAM_HIGH_ADRS地址處,而對於VxWorks_rom,則被鏈接到了RAM_LOW_ADRS 地址處,在與非壓縮代碼進行整合鏈接時指定的鏈接地址(即_romInit函數地址)與壓縮代碼鏈接時指定的地址相對應:如果壓縮代碼為RAM_HIGH_ADRS,則最後整合時就為RAM_LOW_ADRS;如果壓縮代碼為RAM_LOW _ADRS,則整合時就為RAM_HIGH_ADRS。
最後更新:2017-04-03 12:55:38