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 />

// 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

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

Saved successfully!

Ooh no, something went wrong!