亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

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

        2014-04-29 00:00:00李軍

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

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

        中圖分類號:TP332

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

        1 研究方法、手段

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

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

        圖1 不同啟動(dòng)階段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壓縮實(shí)現(xiàn)原則。為了調(diào)試和編碼方便,壓縮U-Boot實(shí)現(xiàn)方案考慮以下三個(gè)方面:(1)未壓縮的U-Boot如果能正常啟動(dòng),就可以保證壓縮后能正常啟動(dòng);(2)盡量保證啟動(dòng)過程與未壓縮時(shí)一致;(3)盡量少修改和添加代碼。

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

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

        第一部分的解壓代碼(圖1(12),以下簡稱解壓代碼)將壓縮后的U-Boot(圖1(13),以下簡稱壓縮U-Boot)解壓到內(nèi)存中,因此解壓代碼必須完成內(nèi)存初始化。為了實(shí)現(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)不會(huì)被執(zhí)行到)。由圖2可以看出,壓縮U-Boot在U-Boot的基礎(chǔ)上簡單修改relocate_code函數(shù)即可。

        圖2 U-Boot及壓縮后U-Boot啟動(dòng)流程

        1.3 壓縮U-Boot的編譯與啟動(dòng)流程。最終的U-Boot代碼由兩次編譯完成,第一次編譯壓縮U-Boot,然后使用壓縮工具將其壓縮生成一個(gè)C文件;第二次編譯時(shí)將壓縮生成的C文件與解壓代碼一起編譯生成最終的壓縮U-Boot版本文件,圖3為整個(gè)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ù),由于有計(jì)算圖1中間內(nèi)存中各個(gè)部分內(nèi)存地址的代碼,因此需要作出簡單的修改。

        1.5 從第一部分代碼掉轉(zhuǎn)到第二部分代碼執(zhí)行。解壓代碼在FLASH中運(yùn)行,壓縮U-Boot在RAM中運(yùn)行,且從relocate_code函數(shù)開始執(zhí)行,因此解壓代碼必須知道第二部分代碼relocate_code函數(shù)的地址。在解壓代碼的board_init_f函數(shù)中的計(jì)算relocate_code函數(shù)的地址方式也比較簡單(參考圖1):(1)board_init_f函數(shù)中會(huì)獲取總內(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計(jì)算出:SECOND_ADDR = RAM_SIZE – CODE_SIZE –BSS_SIZE –SAFE_SPACE;(3)對于壓縮U-Boot,圖2(5)代碼在FLASH中執(zhí)行,而relocate_code代碼將直接在內(nèi)存中運(yùn)行。relocate_code的地址SECONDARY_ADDR通過計(jì)算得出。計(jì)算方法如下:1)使用nm工具獲取壓縮U-Boot的relocate_code函數(shù)的地址RELOCATE_ADDR;2)第2步中計(jì)算出壓縮U-Boot在內(nèi)存中存放的首地址為SECOND_ADDR;3)TEXT_ADDR為壓縮U-Boot鏈接地址;4)第二部分代碼relocate_code函數(shù)在內(nèi)存中的實(shí)際物理地址為: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)。

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

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

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

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

        參考文獻(xiàn):

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

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

        伊人久久大香线蕉在观看| 一区二区三区国产精品麻豆| 风韵丰满熟妇啪啪区99杏| 久久久久亚洲精品无码网址蜜桃| 亚洲精品毛片一区二区三区| 日本精品视频一视频高清| 亚洲av手机在线观看| 无码人妻精品一区二区三区蜜桃| 中国a级毛片免费观看| 国产精品天天看大片特色视频| 日产精品毛片av一区二区三区| 亚洲国产精品一区二区成人片国内| 婷婷亚洲久悠悠色悠在线播放| 亚洲熟女网站| 精品国产3p一区二区三区| 国产极品美女高潮无套| 中文字幕乱伦视频| 国产日韩精品一区二区在线观看播放| 亚洲精品中文字幕码专区| 人人超碰人人爱超碰国产| 欧美日韩视频无码一区二区三| 男人天堂av在线成人av| 亚洲一区二区三区色偷偷| 粗大的内捧猛烈进出少妇| 亚洲成色在线综合网站| 国产在线白浆一区二区三区在线 | 亚洲一二三四五中文字幕| 免费又黄又爽又色的视频| 精品国产v无码大片在线观看| 国产午夜精品美女裸身视频69| 中文字幕在线乱码av| 亚洲精品久久| 最新国产拍偷乱偷精品| 成人av在线免费播放| 每日更新在线观看av| 97无码人妻福利免费公开在线视频| 中文字幕一区二区三区日韩网| 一区二区三区在线视频观看| av无码精品一区二区三区宅噜噜| 亚洲mv国产精品mv日本mv| 亚洲粉嫩视频在线观看|