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.

}<br />

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

pg0 = {<br />

0x00000007, // 7 = PRESENT + RW + USER<br />

0x00001007, // 0x1000 = 4096 = 4K<br />

0x00002007,<br />

...<br />

pg1: 0x00400007,<br />

...<br />

0x007FF007 // toplam 8M<br />

empty_zero_page:<br />

};<br />

Bir çekirdek sembolüne ba¸svuraca˘gımız zaman neden –_ _PAGE_OFFSET eklemek zorundayız, örne˘gin pg0<br />

gibi?<br />

linux/arch/<strong>i386</strong>/vmlinux.lds içinde ¸sunlar bulunur:<br />

. = 0xC0000000 + 0x100000;<br />

_text = .; /* Metin ve salt–okunur veri */<br />

.text : {<br />

*(.text)<br />

...<br />

linux/vmlinux için ba˘glanacak ilk dosya olan linux/arch/<strong>i386</strong>/kernel/head.o içinde, pg0<br />

.text bölümü 0x2000 konumunda oldu˘gu için, çıktı bölümü .text içinde 0x2000 konumunda olacaktır.<br />

Böylece ilintilendikten sonra 0xC0000000+0x100000+0x2000 adresinde olacaktır.<br />

[root@localhost boot]# nm ––defined /boot/vmlinux–2.4.20–28.9 | \<br />

grep ’startup_32\|mmu_cr4_features\|pg0\|\’ | sort<br />

c0100000 t startup_32<br />

c0102000 T pg0<br />

c0104000 T empty_zero_page<br />

c0376404 B mmu_cr4_features<br />

Korumalı kipte sayfalama etkinle¸stirilmeden, do˘grusal adres do˘grudan fiziksel adrese e¸slenecektir. "movl<br />

$pg0–_ _PAGE_OFFSET,%edi" pg0’ın fiziksel adresine e¸sit olan EDI=0x102000 de˘gerini atayacaktır<br />

(linux/vmlinux 0x100000 adresine yerle¸stirildi˘gi için). –PAGE_OFFSET ¸seması olmadan, yanlı¸s ve<br />

muhtemelen RAM alanının ötesinde olacak 0xC0102000 fiziksel adresine eri¸secektir.<br />

mmu_cr4_features .bss bölümü içindedir ve yukarıdaki örnekte 0x376404 fiziksel adresine<br />

yerle¸stirilmi¸stir.<br />

Sayfa tablosu ilklendirildikten sonra sayfalama etkinle¸stirilebilir.<br />

// sayfa dizini temel göstericisini ata, fiziksel adres<br />

CR3 = swapper_pg_dir – _ _PAGE_OFFSET;<br />

// sayfalama etkin!<br />

CR0 |= 0x80000000; // PG bitini ayarla<br />

goto 1f; // flush prefetch–queue<br />

1:<br />

EAX = &1f; // sonraki komutu takip eden adres<br />

goto *(EAX); // EIP’yi yeniden konumla<br />

1:<br />

SS:ESP = *stack_start;<br />

Sayfa dizini swapper_pg_dir (Muhtelif (sayfa: 44) bölümündeki tanımlamalara bakınız), sayfa tabloları pg0<br />

ve pg1 ile birlikte, do˘grusal 0..8M–1 ve 3G..3G+8M–1 adreslerinin her ikisinin de 0..8M–1 fiziksel adresine<br />

e¸slendi˘gini belirtir. Artık çekirdek sembollerine "–_ _PAGE_OFFSET" olmadan eri¸sebiliriz. Çünkü çekirdek alanı<br />

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

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

Saved successfully!

Ooh no, something went wrong!