Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
<strong>Linux</strong> <strong>i386</strong> <strong>Önyükleme</strong> <strong>Kodu</strong> <strong>NASIL</strong><br />
goto _ _KERNEL_CS:100000;<br />
// bkz. linux/arch/<strong>i386</strong>/kernel/head.S:startup_32()<br />
move_routine_end:<br />
}<br />
je 1b ve jnz 3f’nin anlamları için Using as: Local Symbol Names (B87) belgesine ba¸svurunuz.<br />
_edata ve _end tanımlamalarını bulamadınız mı? Sorun de˘gil, onlar "dahili ilintileme beti˘gi"<br />
içinde tanımlanmı¸stır. –T (––script=) seçene˘gi belirtilmeksizin kullanılırsa, ld bu yerle¸sik beti˘gi<br />
compressed/bvmlinux’u ilintilemek için kullanır. Bu beti˘gi görüntülemek için "ld ––verbose" komutunu<br />
kullanınız ya da Dahili ˙Ilintileme Beti˘gi (sayfa: 60) bölümüne bakınız.<br />
–T (––script=), –L (––library–path=) ve ––verbose seçimlerinin tarifi için Using LD, the GNU linker: Command<br />
Line Options (B89) belgesine ba¸svurunuz. Ayrıca "man ld" ve "info ld" de yardımcı olabilir.<br />
piggy.o çözüldü ve kontrol _ _KERNEL_CS:100000’ye geçirildi, örn.<br />
linux/arch/<strong>i386</strong>/kernel/head.S:startup_32(). Bakınız linux/arch/<strong>i386</strong>/kernel/head.S (sayfa:<br />
39).<br />
#define LOW_BUFFER_START 0x2000<br />
#define LOW_BUFFER_MAX 0x90000<br />
#define HEAP_SIZE 0x3000<br />
///////////////////////////////////////////////////////////////////////////////<br />
asmlinkage int decompress_kernel(struct moveparams *mv, void *rmode)<br />
|–– setup real_mode(=rmode), vidmem, vidport, lines and cols;<br />
|–– if (is_zImage) setup_normal_output_buffer() {<br />
| output_data = 0x100000;<br />
| free_mem_end_ptr = real_mode;<br />
| } else (is_bzImage) setup_output_buffer_if_we_run_high(mv) {<br />
| output_data = LOW_BUFFER_START;<br />
| low_buffer_end = MIN(real_mode, LOW_BUFFER_MAX) & ˜0xfff;<br />
| low_buffer_size = low_buffer_end – LOW_BUFFER_START;<br />
| free_mem_end_ptr = &end + HEAP_SIZE;<br />
| // get mv–>low_buffer_start and mv–>high_buffer_start<br />
| mv–>low_buffer_start = LOW_BUFFER_START;<br />
| /* To make this program work, we must have<br />
| * high_buffer_start > &end+HEAP_SIZE;<br />
| * As we will move low_buffer from LOW_BUFFER_START to 0x100000<br />
| * (max low_buffer_size bytes) finally, we should have<br />
| * high_buffer_start > 0x100000+low_buffer_size; */<br />
| mv–>high_buffer_start = high_buffer_start<br />
| = MAX(&end+HEAP_SIZE, 0x100000+low_buffer_size);<br />
| mv–>hcount = 0 if (0x100000+low_buffer_size > &end+HEAP_SIZE);<br />
| = –1 if (0x100000+low_buffer_size hcount==0 : we need not move high_buffer later,<br />
| * as it is already at 0x100000+low_buffer_size.<br />
| * Used by close_output_buffer_if_we_run_high() below. */<br />
| }<br />
|–– makecrc(); // create crc_32_tab[]<br />
| puts("Uncompressing <strong>Linux</strong>... ");<br />
|–– gunzip();<br />
| puts("Ok, booting the kernel.\n");<br />
|–– if (is_bzImage) close_output_buffer_if_we_run_high(mv) {<br />
| // get mv–>lcount and mv–>hcount<br />
| if (bytes_out > low_buffer_size) {<br />
| mv–>lcount = low_buffer_size;<br />
| if (mv–>hcount)<br />
| mv–>hcount = bytes_out – low_buffer_size;<br />
http://belgeler.org <strong>Linux</strong> Kitaplı˘gı 34 / 77