{"id":335,"date":"2018-03-14T09:34:40","date_gmt":"2018-03-14T01:34:40","guid":{"rendered":"http:\/\/www.max-shu.com\/blog\/?p=335"},"modified":"2018-03-14T09:34:40","modified_gmt":"2018-03-14T01:34:40","slug":"linux%e7%9a%84boot-compressed-misc-c","status":"publish","type":"post","link":"http:\/\/www.max-shu.com\/blog\/?p=335","title":{"rendered":"linux\u7684boot\/compressed\/misc.c"},"content":{"rendered":"<div>\u4e3b\u8981\u5b8c\u6210\u89e3\u538b\u7f29\u7684\u529f\u80fd\u3002<\/div>\n<div><\/div>\n<div>int fill_inbuf(void)<br \/>\n{<br \/>\nif (insize != 0)<br \/>\nerror(&#8220;ran out of input data&#8221;);<\/p>\n<p>inbuf = input_data; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/*\u6ce8\u610f\u8fd9\u91cc\u7684input_data\u548cinput_data_end\u5c31\u662f\u5728piggy.S\u91cc\u9762\u5b9a\u4e49\u7684\u3002\u6240\u6709\u89e3\u538b\u7f29\u51fd\u6570\u4e0d\u9700\u8981zimage\u6620\u8c61\u7684\u8d77\u59cb\u5730\u5740\u548c\u957f\u5ea6\u3002*\/<br \/>\ninsize = &amp;input_data_end[0] &#8211; &amp;input_data[0];<\/p>\n<p>inptr = 1;<br \/>\nreturn inbuf[0];<br \/>\n}<\/p>\n<p>\/* ===========================================================================<br \/>\n* Write the output window window[0..outcnt-1] and update crc and bytes_out.<br \/>\n* (Used for the decompressed data only.)<br \/>\n*\/<br \/>\nvoid flush_window(void)<br \/>\n{<br \/>\nulg c = crc;<br \/>\nunsigned n;<br \/>\nuch *in, *out, ch;<\/p>\n<p>in = window;<br \/>\nout = &amp;output_data[output_ptr];<br \/>\nfor (n = 0; n &lt; outcnt; n++) {<br \/>\nch = *out++ = *in++;<br \/>\nc = crc_32_tab[((int)c ^ ch) &amp; 0xff] ^ (c &gt;&gt; 8);<br \/>\n}<br \/>\ncrc = c;<br \/>\nbytes_out += (ulg)outcnt;<br \/>\noutput_ptr += (ulg)outcnt;<br \/>\noutcnt = 0;<br \/>\nputstr(&#8220;.&#8221;);<br \/>\n}<\/p>\n<p>#ifndef arch_error<br \/>\n#define arch_error(x)<br \/>\n#endif<\/p>\n<p>static void error(char *x)<br \/>\n{<br \/>\narch_error(x);<\/p>\n<p>putstr(&#8220;\\n\\n&#8221;);<br \/>\nputstr(x);<br \/>\nputstr(&#8220;\\n\\n &#8212; System halted&#8221;);<\/p>\n<p>while(1);\u00a0\u00a0\u00a0\u00a0 \/* Halt *\/<br \/>\n}<\/p>\n<p>#ifndef STANDALONE_DEBUG<\/p>\n<p>ulg<br \/>\ndecompress_kernel(ulg output_start, ulg free_mem_ptr_p, ulg free_mem_ptr_end_p,<br \/>\nint arch_id) \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/*\u6709head.S\u8c03\u7528\u7684\u89e3\u538b\u7f29\u51fd\u6570\uff0c\u5c31\u662f\u89e3\u538b\u7f29gzip\u7684\u65b9\u5f0f\u3002*\/<br \/>\n{<br \/>\noutput_data\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 = (uch *)output_start;\u00a0\u00a0\u00a0\u00a0 \/* Points to kernel start *\/<br \/>\nfree_mem_ptr\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 = free_mem_ptr_p;<br \/>\nfree_mem_end_ptr\u00a0\u00a0\u00a0\u00a0 = free_mem_ptr_end_p;<br \/>\n__machine_arch_type\u00a0\u00a0\u00a0\u00a0 = arch_id;<\/p>\n<p>arch_decomp_setup();<\/p>\n<p>makecrc();<br \/>\nputstr(&#8220;Uncompressing Linux&#8230;&#8221;);<br \/>\ngunzip();<br \/>\nputstr(&#8221; done, booting the kernel.\\n&#8221;);<br \/>\nreturn output_ptr;<br \/>\n}<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u4e3b\u8981\u5b8c\u6210\u89e3\u538b\u7f29\u7684\u529f\u80fd\u3002 int fill_inbuf(void) { if (insize != 0) err &hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[15],"tags":[9,261,243,244],"class_list":["post-335","post","type-post","status-publish","format-standard","hentry","category-linuxandroid","tag-linux","tag-misc-c","tag-243","tag-244"],"views":1663,"_links":{"self":[{"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/335","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=335"}],"version-history":[{"count":1,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/335\/revisions"}],"predecessor-version":[{"id":336,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/335\/revisions\/336"}],"wp:attachment":[{"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=335"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=335"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=335"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}