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.

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

if (head==0) track++;<br />

ok4_set:<br />

AX = 0;<br />

}<br />

ok3_set:<br />

sread = AX;<br />

BX += CX && 9;<br />

if (BX overflow) { // > 64KB<br />

ES += 0x1000;<br />

BX = 0;<br />

}<br />

set_next_fn:<br />

}<br />

3.7. Bootsect Yardımcısı<br />

setup.S:bootsect_helper() sadece bootsect.S:read_it() tarafından kullanılır.<br />

bbootsect ve bsetup yarı ayrı ba˘glandıkları için kendi kod/veri bölütlerine ba˘glı konumlar kullanırlar. De˘gi¸sik<br />

bölütlerde bootsect_helper() için "call far" (lcall) ça˘gırmak zorundayız ve "return far" dönmeli. Bu ça˘gırma,<br />

CS!=DS durumunu yaratan CS de˘gi¸sikli˘gi ile sonuçlanır ve setup.S içindeki de˘gi¸skenleri belirtmek için bölütü<br />

niteleyici kullanmak zorundayız.<br />

///////////////////////////////////////////////////////////////////////////////<br />

// bzImage yüklendi˘ginde bootsect yükleyici tarafından ça˘gırılır<br />

bootsect_helper(ES:BX)<br />

bootsect_es = 0; // setup.S içinde tanımlı<br />

type_of_loader = 0; // setup.S içinde tanımlı<br />

{<br />

if (!bootsect_es) { // ilk sefer için ça˘gırılır<br />

type_of_loader = 0x20; // bootsect–yükleyici, version 0<br />

AX = ES >> 4;<br />

*(byte*)(&bootsect_src_base+2) = AH;<br />

bootsect_es = ES;<br />

AX = ES – SYSSEG;<br />

return;<br />

}<br />

bootsect_second:<br />

if (!BX) { // 64KB full<br />

// SYSSEG:0’dan hedefe ta¸sı, her seferinde 64KB<br />

int15/AH=87h(CX=0x8000, ES:SI=CS:bootsect_gdt);<br />

// int15/AH=87h: S˙ISTEM – GEN˙I¸SLET˙ILM˙I¸S BELLE˘GE KOPYALA (B46)<br />

if (kopyalama hatası) {<br />

bootsect_panic() {<br />

prtstr("INT15 refuses to access high mem, giving up.");<br />

bootsect_panic_loop: goto bootsect_panic_loop; // never return<br />

}<br />

}<br />

ES = bootsect_es; // ES’i daima 0x10000 noktasına ata<br />

*(byte*)(&bootsect_dst_base+2)++;<br />

}<br />

bootsect_ex:<br />

// AX içindeki ta¸sınmı¸s çerçeveler (16–bayt)<br />

AH = *(byte*)(&bootsect_dst_base+2)

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

Saved successfully!

Ooh no, something went wrong!