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

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

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

Saved successfully!

Ooh no, something went wrong!