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 />
// a20 gerçekten etkin olana kadar bekle<br />
a20_kbc_wait:<br />
CX = 0;<br />
a20_kbc_wait_loop:<br />
do {<br />
if (a20_test()) goto a20_done; // testi geçti<br />
} while (––CX)<br />
// Son giri¸sim: "yapılandırma portu A"’yı kullan<br />
outb((inb(0x92) | 0x02) & 0xFE, 0x92);<br />
// yapılandırma portu A etkilenene kadar bekle<br />
a20_fast_wait:<br />
CX = 0;<br />
a20_fast_wait_loop:<br />
do {<br />
if (a20_test()) goto a20_done; // testi geçti<br />
} while (––CX)<br />
// A20 hala cevap vermiyor. Tekrar ayarlamayı dene.<br />
if (––a20_tries) goto a20_try_loop;<br />
prtstr("linux: fatal error: A20 gate not responding!");<br />
a20_die:<br />
hlt;<br />
goto a20_die;<br />
}<br />
a20_tries:<br />
.byte A20_ENABLE_LOOPS // i.e. 255<br />
a20_err_msg:<br />
.ascii "linux: fatal error: A20 gate not responding!"<br />
.byte 13, 10, 0<br />
I/O port i¸slemleri için, Kaynakça (sayfa: 32) içindeki ilgili ba¸svuru materyallerine bakın.<br />
4.9. Korumalı Kipe Geç<br />
Tüm 32 bitlik IA–32 i¸slemcileri ile kod uyumlulu˘gunu sa˘glamak için, a¸sa˘gıdaki korumalı kipe geçmeyi sa˘glayacak<br />
adımları yerine getirin:<br />
1. ˙Ilk GDT girdisinde bo¸s tanımlayıcılı GDT’yi hazırlayın, bir kod bölütü tanımlayıcı ve bir veri bölütü<br />
tanımlayıcı;<br />
2. Maskelenebilir donanım kesmeleri ve NMI dahil kesmeleri etkisiz kılın;<br />
3. lgdt asm komutunu kullanarak GDTR yazmacına taban adresini ve GDT sınırını yükleyin;<br />
4. mov cr0 (Intel 386 ve üstü) veya lmsw komutu (Intel 286 ile uyumluluk için) kullanarak CR0 yazmacındaki<br />
PE bayra˘gını etkinle¸stirin;<br />
5. Ardından bir uzak jmp veya bir uzak call komutu çalı¸stırın.<br />
Yı˘gıt normal oku/yaz veri bölütüne yerle¸stirilebilir, böylece adanmı¸s tanımlayıcıya gerek kalmaz.<br />
a20_done:<br />
{<br />
lidt idt_48; // load idt with 0, 0;<br />
// DS:gdt’yi do˘grusal göstericiye dönü¸stür<br />
*(long*)(gdt_48+2) = DS