• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

    一種U—Boot壓縮和自解壓實現(xiàn)方法

    2014-04-29 00:00:00李軍
    計算機光盤軟件與應(yīng)用 2014年5期

    摘 要:本文闡述了PowerPC處理器平臺的U-Boot[1]壓縮和自解壓的實現(xiàn)方法,并在PowerPC 8245處理器上成功驗證。

    關(guān)鍵詞:U-Boot;壓縮;自解壓;PowerPC

    中圖分類號:TP332

    U-Boot是Linux操作系統(tǒng)和PowerPC、ARM、MIPS架構(gòu)處理器使用的最為常見的一種非壓縮方式的Boot Loader,當(dāng)Boot中增加一些功能時,版本大小會變大。本文研究了一種實現(xiàn)方法,對U-Boot代碼做最小的修改即可實現(xiàn)U-Boot版本的壓縮和自解壓。

    1 研究方法、手段

    1.1 U-Boot啟動流程分析。U-Boot的源代碼中PowerPC體系結(jié)構(gòu)的CPU啟動代碼結(jié)構(gòu)基本一致(圖2去除(5)為U-Boot啟動流程):(1)系統(tǒng)上電時基本初始化(MMU、Cache等初始化);(2)第一階段C語言堆棧初始化(使用芯片cache、dpram等作為堆棧);(3)執(zhí)行第一階段的第一個C函數(shù)cpu_init_f對CPU初始化;(4)執(zhí)行第一階段的第二個C函數(shù)board_init_f對外圍設(shè)備、內(nèi)存控制器等進行初始化,計算出U-Boot被拷貝到Ram中的位置。完成第二階段的C語言堆棧初始化、以及U-Boot將要使用的全局參數(shù)(圖1中的(6)bd_t與(7)id)的初始化;(5)執(zhí)行relocate_code匯編代碼,完成以下動作:1)設(shè)置第二階段C語言堆棧指針(使用ram做堆棧,圖1中(5)(8));2)代碼從flash拷貝到ram;3)Cache操作;4)Got2表修正;5)跳轉(zhuǎn)到Ram中開始執(zhí)行;(6)執(zhí)行第二階段的C函數(shù)board_init_r,準(zhǔn)備進入Boot主循環(huán)。其中的一個重要的步驟trap_init,將內(nèi)存中的中斷/異常向量拷貝到ram中0地址。

    U-Boot在不同啟動階段在FLASH/內(nèi)存中的位置如圖1所示:

    圖1 不同啟動階段U-BOOT在FLASH/內(nèi)存中的位置

    圖1(1)(2)顯示了非壓縮U-Boot在Flash中的位置,圖1(11)-(13)顯示了壓縮U-Boot及解壓代碼在Flash中的位置,圖1(3)-(10)顯示了U-Boot在內(nèi)存中的位置。

    1.2 U-Boot壓縮實現(xiàn)原則。為了調(diào)試和編碼方便,壓縮U-Boot實現(xiàn)方案考慮以下三個方面:(1)未壓縮的U-Boot如果能正常啟動,就可以保證壓縮后能正常啟動;(2)盡量保證啟動過程與未壓縮時一致;(3)盡量少修改和添加代碼。

    基于以上三點,結(jié)合1.1的分析及圖1,設(shè)計解壓縮方案如下:

    保證現(xiàn)有U-Boot代碼基本不變,將其進行壓縮后,再與執(zhí)行解壓代碼編譯在一起形成最終放在FLASH/EEProm中的Boot。因此將壓縮后U-Boot分為兩部分(圖1(11)(12)(13)):

    第一部分的解壓代碼(圖1(12),以下簡稱解壓代碼)將壓縮后的U-Boot(圖1(13),以下簡稱壓縮U-Boot)解壓到內(nèi)存中,因此解壓代碼必須完成內(nèi)存初始化。為了實現(xiàn)方便,解壓代碼將又由兩部分構(gòu)成,一部分直接來自于U-Boot,僅完成1.1節(jié)步驟一到步驟四(圖2虛線部分(1)-(4));另一部分為新增代碼(圖2(5)),完成解壓算法,將壓縮U-Boot解壓到內(nèi)存并跳轉(zhuǎn)到內(nèi)存中執(zhí)行。

    第二部分為壓縮U-Boot,執(zhí)行CPU和外設(shè)初始化完成后的后續(xù)流程,由圖2(1)-(4)、(a)、(c)、(d)、(e)、(7)-(9)組成(壓縮U-Boot也包含(1)-(4)代碼,但永遠(yuǎn)不會被執(zhí)行到)。由圖2可以看出,壓縮U-Boot在U-Boot的基礎(chǔ)上簡單修改relocate_code函數(shù)即可。

    圖2 U-Boot及壓縮后U-Boot啟動流程

    1.3 壓縮U-Boot的編譯與啟動流程。最終的U-Boot代碼由兩次編譯完成,第一次編譯壓縮U-Boot,然后使用壓縮工具將其壓縮生成一個C文件;第二次編譯時將壓縮生成的C文件與解壓代碼一起編譯生成最終的壓縮U-Boot版本文件,圖3為整個Boot的生成過程。

    圖3 代碼修改與編譯步驟

    最終的U-Boot代碼執(zhí)行流程為圖2(1)-(5)、(a)、(c)-(e)、(7)-(9),解壓代碼與壓縮U-Boot有重疊,即圖2(1)-(4)。解壓代碼完全在Flash中執(zhí)行,壓縮U-Boot完全在內(nèi)存中執(zhí)行,并直接開始從圖2(6)relocate_code函數(shù)開始執(zhí)行,且壓縮U-Boot包含圖2(1)-(4)不被執(zhí)行。

    1.4 修改U-Boot為壓縮U-Boot。從圖2可以看出,壓縮U-Boot與原始代碼基本一致,只是去掉了將代碼從flash拷貝到RAM的步驟(圖2(b))。壓縮U-Boot只需修改的文件為start.S,僅僅只需要把圖2(b)去掉,并作簡單的修改即可。

    解壓代碼包含U-Boot的CPU初始化和外設(shè)初始化代碼,并在此基礎(chǔ)上增加圖2(5)的解壓縮代碼即可,基本上只包含lib_ppc目錄、cpu目錄、單板目錄、新增加lib_unpack目錄代碼。lib_ppc目錄的board.c源文件中的board_init_f()函數(shù),由于有計算圖1中間內(nèi)存中各個部分內(nèi)存地址的代碼,因此需要作出簡單的修改。

    1.5 從第一部分代碼掉轉(zhuǎn)到第二部分代碼執(zhí)行。解壓代碼在FLASH中運行,壓縮U-Boot在RAM中運行,且從relocate_code函數(shù)開始執(zhí)行,因此解壓代碼必須知道第二部分代碼relocate_code函數(shù)的地址。在解壓代碼的board_init_f函數(shù)中的計算relocate_code函數(shù)的地址方式也比較簡單(參考圖1):(1)board_init_f函數(shù)中會獲取總內(nèi)存的大小RAM_SIZE;(2)圖1中(2)未壓縮U-Boot是通過relocate_code函數(shù)拷貝到內(nèi)存中,而如果為圖1(12)(13)壓縮U-Boot,則由圖2(5)代碼將其解壓到內(nèi)存中,解壓到內(nèi)存的起始地址SECOND_ADDR將根據(jù)RAM_SIZE由壓縮U-Boot文件大小CODE_SIZE和壓縮U-Boot的bss段大小BSS_SIZE計算出:SECOND_ADDR = RAM_SIZE – CODE_SIZE –BSS_SIZE –SAFE_SPACE;(3)對于壓縮U-Boot,圖2(5)代碼在FLASH中執(zhí)行,而relocate_code代碼將直接在內(nèi)存中運行。relocate_code的地址SECONDARY_ADDR通過計算得出。計算方法如下:1)使用nm工具獲取壓縮U-Boot的relocate_code函數(shù)的地址RELOCATE_ADDR;2)第2步中計算出壓縮U-Boot在內(nèi)存中存放的首地址為SECOND_ADDR;3)TEXT_ADDR為壓縮U-Boot鏈接地址;4)第二部分代碼relocate_code函數(shù)在內(nèi)存中的實際物理地址為:SECOND_ADDR+(RELOCATE_ADDR–TEXT_ADDR)當(dāng)解壓代碼將壓縮U-Boot解壓到內(nèi)存后,直接跳轉(zhuǎn)到SECOND_ADDR+(RELOCATE_ADDR–TEXT_ADDR)執(zhí)行,這樣U-Boot就可以繼續(xù)往下啟動。

    當(dāng)解壓代碼將壓縮U-Boot解壓到內(nèi)存后,直接跳轉(zhuǎn)到SECOND_ADDR+(RELOCATE_ADDR–TEXT_ADDR)執(zhí)行,這樣U-Boot就可以繼續(xù)往下啟動。

    2 研究成果與應(yīng)用評價

    該壓縮實現(xiàn)方案實測壓縮率為50%,使用更高壓縮率算法可以提高壓縮率。該方法對U-Boot的修改很小,在U-Boot能啟動的情況下,壓縮后U-Boot就可以正常解壓和啟動,啟動流程不變。

    壓縮后的Boot版本大小更小,因此具有空間需求小、啟動速度快、減少生產(chǎn)燒結(jié)時間,提高設(shè)備生產(chǎn)效率的優(yōu)點。ARM、MIPS等其他架構(gòu)CPU實現(xiàn)方法類似,因此該壓縮方案對其他架構(gòu)的Boot壓縮所也具有很好的借鑒和參考價值。

    參考文獻:

    [1]U-Boot源代碼 http://www.denx.de/wiki/U-Boot/SourceCode.

    作者單位:中興通訊股份有限公司,南京 210012

    女性| 玛多县| 民丰县| 五台县| SHOW| 铁力市| 茌平县| 屏山县| 昌邑市| 天柱县| 潜山县| 定南县| 高雄市| 保靖县| 延津县| 潜江市| 浦城县| 尖扎县| 萨迦县| 巧家县| 罗江县| 垣曲县| 长乐市| 荣昌县| 白朗县| 灵璧县| 闻喜县| 勃利县| 桦南县| 金塔县| 定日县| 辽中县| 阿图什市| 隆子县| 昌乐县| 宁南县| 嘉祥县| 内黄县| 冕宁县| 横山县| 德兴市|