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

SETUPSEG = DEF_SETUPSEG (0x9020) /*kurulum buradan ba¸slar*/<br />

SYSSEG = DEF_SYSSEG (0x1000) /*sistem 0x10000 (65536) adresine yüklendi*/<br />

SYSSIZE = DEF_SYSSIZE (0x7F00) /*sistem boyutu: 16–bayt sayısı*/<br />

/*yüklenecek*/<br />

ROOT_DEV = 0 /*ROOT_DEV ¸simdi "build" tarafından yazıldı*/<br />

SWAP_DEV = 0 /*SWAP_DEV ¸simdi "build" tarafından yazıldı*/<br />

.code16<br />

.text<br />

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

_start:<br />

{<br />

// kendimizi 0x7C00’den 0x90000’e ta¸sıdık ve oraya sıçradık.<br />

move BOOTSEG:0 to INITSEG:0 (512 bytes);<br />

goto INITSEG:go;<br />

}<br />

bbootsect INITSEG:0 (0x9000:0)’a ta¸sınmı¸stır. Artık BOOTSEG’i unutabiliriz.<br />

3.2. Disk parametrelerini Al<br />

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

// yı˘gıtı ve disk parametre tablosunu hazırla<br />

go:<br />

{<br />

SS:SP = INITSEG:3FF4; // yı˘gıtı INITSEG:0x4000–12’ye koy<br />

/* 0x4000 keyfi bir de˘gerdir >=<br />

* bootsect boyutu + setup boyutu + yı˘gıt için oda;<br />

* 12 disk parametre boyutudur. */<br />

disk parametresini (0:0078’deki gösterici) \<br />

INITSEG:3FF4 adresine kopyala (12 bytes);<br />

// int1E: SYSTEM DATA – DISKETTE PARAMETERS (B30)<br />

yama sektör sayısı 36’ya (parametre tablosunda 4. konum, 1 byte);<br />

disk parametre tablosu göstericisine (0:0078, int1E) INITSEG:3FF4 ata;<br />

}<br />

SS kaydedicisinden hemen sonra SP’nin ba¸slatıldı˘gından emin olun. SS’nin tavsiye edilen de˘gi¸siklik yöntemi<br />

lss komutunu kullanmaktır (IA–32 Intel Architecture Software Developer’s Manual (B31) , (Vol.3. Ch.5.8.3. Masking<br />

Exceptions and Interrupts When Switching Stacks).<br />

˙Itme ve çekme gibi yı˘gıt i¸slemleri artık kabul edilebilir. Önce disk parametrelerinin 12 byte’ı INITSEG:3FF4’e<br />

kopyalanmı¸stı.<br />

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

// disk sürücü parametrelerini al, özellikle sektör/iz sayısı.<br />

char disksizes[] = {36, 18, 15, 9};<br />

int sectors;<br />

{<br />

SI = disksizes; // i = 0;<br />

do {<br />

probe_loop:<br />

sectors = DS:[SI++]; // sectors = disksizes[i++];<br />

if (SI>=disksizes+4) break; // if (i>=4) break;<br />

int13/AH=02h(AL=1, ES:BX=INITSEG:0200, CX=sectors, DX=0);<br />

// int13/AH=02h: DISK – READ SECTOR(S) INTO MEMORY (B32)<br />

} while (sektör okuma hatası);<br />

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

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

Saved successfully!

Ooh no, something went wrong!