新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > zImage內(nèi)核鏡像解壓過程詳解

        zImage內(nèi)核鏡像解壓過程詳解

        作者: 時(shí)間:2012-08-27 來源:網(wǎng)絡(luò) 收藏

        int arch_id)

        l output_start:指輸出的起始位置,此時(shí)它的值參考上面的圖表,緊接在緩沖區(qū)后;

        l free_mem_ptr_p:函數(shù)需要的內(nèi)存緩沖開始地址;

        l ulg free_mem_ptr_end_p:解壓函數(shù)需要的內(nèi)存緩沖結(jié)束地址,共64K;

        l arch_id :architecture ID,對于SMDK2410這個(gè)值為193;

        最后回答第3個(gè)問題

        首先看看piggy.o是如何生成的,在arch/arm/boot/compressed/Makefie中

        $(obj)/piggy.o: $(obj)/piggy.gz FORCE

        Piggy.o是由piggy.S生成的,咱們看看piggy.S的內(nèi)容:

        .section .piggydata,#alloc

        .globl input_data

        input_data:

        .incbin arch/arm/boot/compressed/piggy.gz

        .globl input_data_end

        input_data_end:

        再看看misc.c中decompress_kernel函數(shù)吧,它將調(diào)用gunzip()解壓。gunzip()在lib/inflate.c中定義,它將調(diào)用NEXTBYTE(),進(jìn)而調(diào)用get_byte()來獲取壓縮代碼。

        在misc.c中

        #define get_byte() (inptr insize ? inbuf[inptr++] : fill_inbuf())

        查看fill_inbuf函數(shù)

        int fill_inbuf(void)

        {

        if (insize != 0)

        error(ran out of input data);

        inbuf = input_data;

        insize = input_data_end[0] - input_data[0];

        inptr = 1;

        return inbuf[0];

        }

        發(fā)現(xiàn)什么沒?這里的input_data不正是piggy.S里的input_data嗎?這個(gè)時(shí)候應(yīng)該明白內(nèi)核是怎樣確定piggy.gz在中的位置了吧。

        時(shí)間關(guān)系,可能敘述的不夠詳細(xì),大家可以集合內(nèi)核代碼和網(wǎng)上的其它相關(guān)文章,理解啟動(dòng)解壓


        上一頁 1 2 下一頁

        關(guān)鍵詞: 詳解 過程 解壓 內(nèi)核 zImage

        評論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 常熟市| 通山县| 渑池县| 沙湾县| 子洲县| 繁峙县| 射洪县| 祁连县| 河津市| 运城市| 交口县| 繁峙县| 阿图什市| 彰武县| 浦东新区| 平和县| 靖宇县| 沾化县| 龙岩市| 搜索| 西乡县| 乐山市| 张家港市| 阿坝县| 静乐县| 洪江市| 扎鲁特旗| 潢川县| 沁源县| 株洲市| 柳河县| 平顶山市| 扎鲁特旗| 四会市| 两当县| 共和县| 平顺县| 遂川县| 封开县| 治县。| 滨海县|