lg)high_buffer_start)) { ; 如果高端片段的最小起始地址小于它实际应加载的地址,则将它置为实际地址, ; 这样高端片段就无需再次移动了,否则它要向前移动 high_buffer_start = (uch *)(0x100000 + low_buffer_size); mv->hcount = 0; } else mv->hcount = -1; 待定 mv->high_buffer_start = high_buffer_start; } void close_output_buffer_if_we_run_high(struct moveparams *mv) { if (bytes_out > low_buffer_size) { mv->lcount = low_buffer_size; if (mv->hcount) mv->hcount = bytes_out - low_buffer_size;求出高端片段的字节数 } else { 如果解压后内核只有低端的一个片段 mv->lcount = bytes_out; mv->hcount = 0; } } int decompress_kernel(struct moveparams *mv, void *rmode) { real_mode = rmode; if (SCREEN_INFO.orig_video_mode == 7) { vidmem = (char *) 0xb0000; vidport = 0x3b4; } else { vidmem = (char *) 0xb8000; vidport = 0x3d4; } lines = SCREEN_INFO.orig_video_lines; cols = SCREEN_INFO.orig_video_cols; if (free_mem_ptr else setup_output_buffer_if_we_run_high(mv); makecrc(); puts("Uncompressing Linux... "); gunzip(); puts("Ok, booting the kernel.\n"); if (high_loaded) close_output_buffer_if_we_run_high(mv); return high_loaded; }
|