日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

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

發布時間:2025/3/20 linux 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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运行前探秘之四_内核解压缩_三_的全部內容,希望文章能夠幫你解決所遇到的問題。

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