linux运行前探秘之四,Linux运行前探秘之四_内核解压缩_三_
操作系統
PROGRAMLANGUAGE
編程語言
Linux運行前探秘之四
———內核解壓縮(三)
徐
煒
摘要:分析了Linux內核解壓過程和算法,并分析了關鍵的源代碼。
關鍵詞:inflate;Huffman編碼;storedblock;fixedblock;dynamicblock
return-1;
}
//讀取標志字節
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個字節是時間戳(ulg)get_byte();/*Gettimestamp*/((ulg)get_byte())<<8;((ulg)get_byte())<<16;((ulg)get_byte())<<24;
//以下兩字節是extraflag和ostype,被忽略
(void)get_byte();/*Ignoreextraflagsforthemoment*/(void)get_byte();/*IgnoreOStypeforthemoment*///flag有EXTRA_FIELD標志,讀入附加字節if((flags&EXTRA_FIELD)!=0){
unsignedlen=(unsigned)get_byte();//首先的兩字節//是附加域的長度
len|=((unsigned)get_byte())<<8;
while(len--)(void)get_byte();//讀入len字節}
/*讀入原始文件名并丟棄*/
if((flags&ORIG_NAME)!=0){
/*Discardtheoldname*/
while(get_byte()!=0)/*null*/;}
/*如果有文件注釋,讀入并丟棄直到遇見0為止*/if((flags&COMMENT)!=0){
1概述
當Huffman解碼表創建完畢,則“萬事俱備,只等解碼”
了。函數gunzup()主要負責文件格式驗證,讀取文件頭,以及解碼結束后驗證crc值和文件原始長度,解碼工作是通過調用infalte()函數完成的。inflate()解碼過程以塊為單位進行
(deflate壓縮數據是分塊的),循環調用inflate_block()解碼一
個塊,直到最后一塊。每個塊看做一個長位串,inflate_block
()首先讀取塊的第1位,這是結束塊的標記,為1表示當前
解碼的塊是最后一個塊(這個值通過e返回到inflate()中作為循環結束的條件);接著讀入2位塊類型碼,根據其值的不同
(00-storedblock,01-fixedblock,10-dynamicblock)分別調用in-flate_stored()、inflate_fixed()、inflate_dynamic()進行塊解碼。
2
2.1
代碼分析
解壓縮主程序gunzip()
decompress_kernel()調用該函數進行內核解壓縮:
staticintgunzip(void){
uchflags;
unsignedcharmagic[2];/*magicheader*/charmethod;
ulgorig_crc=0;/*原始crc值*/
ulgorig_len=0;/*原始數據長度(壓縮前的內核長度)*/intres;
//文件開頭兩字節是魔數(格式標志),第3個字節是壓縮方//法,這里應該是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运行前探秘之四_内核解压缩_三_的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 32M内存 跑linux内核,32位Li
- 下一篇: linux查看cpu运行速度,linux