07.01.2013 Views

Linux i386 Önyükleme Kodu NASIL

Linux i386 Önyükleme Kodu NASIL

Linux i386 Önyükleme Kodu NASIL

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Linux</strong> <strong>i386</strong> <strong>Önyükleme</strong> <strong>Kodu</strong> <strong>NASIL</strong><br />

00 – sıkı¸stırma yok<br />

bayt sınırına kadar kalan bitler;<br />

LEN (2 bayt);<br />

NLEN (2 bayt, LEN’in tamamlayıcısı);<br />

data (LEN bayt);<br />

01 – düzeltilmi¸s Huffman kodu ile sıkı¸stırılmı¸s<br />

{<br />

literal (7–9 bitleri, 256 hariç 0..287 kodunu temsil eder);<br />

// Bakınız RFC 1951, 3.2.6 paragrafındaki tablo.<br />

length (0–5 bitleri, literal > 256 ise 3..258 arasında bir uzunluktur);<br />

// Bkz. RFC 1951, 3.2.5 paragrafındaki 1. alfabe tablosu.<br />

data (literal < 256 ise literal baytlarının verileri);<br />

distance (literal == 257..285 ise 5 artı 0–13 ek bit,<br />

1..32768 arasında bir mesafe belirtir;<br />

/* Bakınız RFC 1951, 3.2.5 paragrafındaki 2. alfabe tablosu,<br />

* 3.2.6 paragrafındaki deyim de˘gil*/<br />

/* Çıktı akımında "distance" bayt geri git<br />

* ve "length" baytı kopyala. */<br />

}* // çok sayıda örnek olabilir<br />

literal (7 bit, tümü 0, literal == 256, blok sonu belirtir);<br />

10 – Dinamik Huffman koduyla sıkı¸stırılmı¸s<br />

HLIT (5 bit, Literal/Length kodlarının sayısı – 257, 257–286);<br />

HDIST (5 bit, Distance kodlarının sayısı – 1, 1–32);<br />

HCLEN (4 bit, Code Length kodlarının sayısı – 4, 4 – 19);<br />

Code Length dizisi ((HCLEN+4)*3 bit)<br />

/* A¸sa˘gıdaki 2 alfabe tablosu, önceki Code Length dizisinden üretilen<br />

* Huffman kod çözme tablosu kullanılarık çözülecektir. */<br />

Literal/Length alfabesi (HLIT+257 kod)<br />

Distance alfabesi (HDIST+1 kod)<br />

// Kod çözme tabloları bu alfabe tablolarından olu¸sturur.<br />

/* A¸sa˘gıdaki, farklı kod çözme tabloları kullanmak dı¸sında düzeltilmi¸s<br />

* Huffman kodları kısmı ile benzerlik gösterir. */<br />

{<br />

literal/length<br />

(de˘gi¸sken uzunluk, Literal/Length alfabesine ba˘gımlı);<br />

data (literal < 256 ise literal baytlarının verisi);<br />

distance (literal == 257..285 ise de˘gi¸sken uzunlukta,<br />

Distance alfabesine ba˘gımlı);<br />

}* // çok sayıda örnek olabilir<br />

literal (literal de˘geri 256, blok sonu anlamında);<br />

11 – reserved (hata)<br />

Dikkat ederseniz Huffman kodları MSB’den ba¸slarken, veri elemanları En–De˘gersiz–Bit’ten (Least–Significant<br />

Bit – LSB) ba¸slayıp En–De˘gerli–Bit’e (Most–Significant Bit – MSB) kadar byte’ları paketler. Ayrıca literal<br />

de˘gerleri 286–287 ve distance kodları 30–31’in asla olu¸smayaca˘gına dikkat edin.<br />

RFC 1951 ve yukarıdaki veri yapısı elinizdeyken inflate_block() i¸slevini anlamak çok da zor olmayacaktır.<br />

Huffman kodlaması ve alfabe tablosu üretimi için RFC 1951 içindeki ilgili paragraflara ba¸svurunuz.<br />

Daha fazla ayrıntı için linux/lib/inflate.c belgesine, gzip kaynak koduna (bir çok yorum satırı var) ve<br />

ilgili ba¸svuru materyallerine bakınız.<br />

http://belgeler.org <strong>Linux</strong> Kitaplı˘gı 38 / 77

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!