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