日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

linux运行前探秘之四,Linux运行前探秘之四_内核解压缩_三_

發(fā)布時間:2025/3/20 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux运行前探秘之四,Linux运行前探秘之四_内核解压缩_三_ 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

操作系統(tǒng)

PROGRAMLANGUAGE

編程語言

Linux運行前探秘之四

———內核解壓縮(三)

摘要:分析了Linux內核解壓過程和算法,并分析了關鍵的源代碼。

關鍵詞:inflate;Huffman編碼;storedblock;fixedblock;dynamicblock

return-1;

}

//讀取標志字節(jié)

flags=(uch)get_byte();//輸入是加密的,報錯返回

if((flags&ENCRYPTED)!=0){

error("Inputisencrypted\n");return-1;}

//multi-part輸入,報錯返回

if((flags&CONTINUATION)!=0){

error("Multipartinput\n");return-1;}

//無效標志,報錯返回

if((flags&RESERVED)!=0){

error("Inputhasinvalidflags\n");return-1;}

//以下4個字節(jié)是時間戳(ulg)get_byte();/*Gettimestamp*/((ulg)get_byte())<<8;((ulg)get_byte())<<16;((ulg)get_byte())<<24;

//以下兩字節(jié)是extraflag和ostype,被忽略

(void)get_byte();/*Ignoreextraflagsforthemoment*/(void)get_byte();/*IgnoreOStypeforthemoment*///flag有EXTRA_FIELD標志,讀入附加字節(jié)if((flags&EXTRA_FIELD)!=0){

unsignedlen=(unsigned)get_byte();//首先的兩字節(jié)//是附加域的長度

len|=((unsigned)get_byte())<<8;

while(len--)(void)get_byte();//讀入len字節(jié)}

/*讀入原始文件名并丟棄*/

if((flags&ORIG_NAME)!=0){

/*Discardtheoldname*/

while(get_byte()!=0)/*null*/;}

/*如果有文件注釋,讀入并丟棄直到遇見0為止*/if((flags&COMMENT)!=0){

1概述

當Huffman解碼表創(chuàng)建完畢,則“萬事俱備,只等解碼”

了。函數(shù)gunzup()主要負責文件格式驗證,讀取文件頭,以及解碼結束后驗證crc值和文件原始長度,解碼工作是通過調用infalte()函數(shù)完成的。inflate()解碼過程以塊為單位進行

(deflate壓縮數(shù)據(jù)是分塊的),循環(huán)調用inflate_block()解碼一

個塊,直到最后一塊。每個塊看做一個長位串,inflate_block

()首先讀取塊的第1位,這是結束塊的標記,為1表示當前

解碼的塊是最后一個塊(這個值通過e返回到inflate()中作為循環(huán)結束的條件);接著讀入2位塊類型碼,根據(jù)其值的不同

(00-storedblock,01-fixedblock,10-dynamicblock)分別調用in-flate_stored()、inflate_fixed()、inflate_dynamic()進行塊解碼。

2

2.1

代碼分析

解壓縮主程序gunzip()

decompress_kernel()調用該函數(shù)進行內核解壓縮:

staticintgunzip(void){

uchflags;

unsignedcharmagic[2];/*magicheader*/charmethod;

ulgorig_crc=0;/*原始crc值*/

ulgorig_len=0;/*原始數(shù)據(jù)長度(壓縮前的內核長度)*/intres;

//文件開頭兩字節(jié)是魔數(shù)(格式標志),第3個字節(jié)是壓縮方//法,這里應該是8,表示deflate

magic[0]=(unsignedchar)get_byte();magic[1]=(unsignedchar)get_byte();method=(unsignedchar)get_byte();if(magic[0]!=037||

((magic[1]!=0213)&&(magic[1]!=0236))){error("badgzipmagicnumbers");return-1;}

/*Weonlysupportmethod#8,DEFLATED*/if(method!=8){

error("internalerror,invalidmethod");

2011.17

13

總結

以上是生活随笔為你收集整理的linux运行前探秘之四,Linux运行前探秘之四_内核解压缩_三_的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。