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