EVET yeni seriye basliyorum (aglayin) bootloader yazarken ögrendiklerimi bu seride ogreticem.
baslayalim,
BOOTLOADER NE AMK?!?!?
bootloader, os'yi rame kopyalayip calistirir.
BIOS YUKLENME SURECI
1- Power On
güç düğmesine basiyon ve anakart sinyali aliyo.
Cpu sifirlaniyo, CS:IP (o an çalışan komudun adresini belirten segment
ffset çifti) = 0xFFFF:0x0000 (Reset Vector) adresinden calismaya basliyo. bu adres BIOS ROM'una (firmware) yukleniyo.
2- POST (Power On Self Test)
BIOS donanimi test ediyo:
CPU -> temel komutlar
RAM -> hızlı sağlık kontrolü
klavye/ekran/disk denetleyicileri vb. -> var yada yok diye bakiyo
Hata varsa hata mesaji veriyo, yoksa devamke.
3 - BIOS donanimi baslatiyo
PCI/PCIe aygitlarini baslatiyo.
Video BIOS (VGA/GPU) aktif oluyo ve ekran hazirlaniyo.
Disk/Depolama denetleyicilerini (IDE/SATA/NVME) taniyo.
4 - Boot Aygıtı Sırasını Belirliyo
Bios, CMOS'da kayıtlı Boot Orderi okuyo:
örnek: USB -> CD/DVD -> HDD -> NETWORK (PXE)
Her aygıt için Boot Signature (0xAA55) arar.
5 - Ilk Sektorü Okuyo
Aygıtın 0. Sektörünü (LBA 0 veya CHS 0/0/1) okur.
Tam 512 Byte (ne eksik ne fazla, bios 512 byteden fazlasını yuklemez) veriyi 0x0000:0x7C00 adresine yükler.
6 - Imza Kontrolü (0xAA55)
Bios 512 bytenin son 2 bytesini kontrol edio:
511. Byte -> 0x55
512. Byte -> 0xAA
Eşleşmiyosa -> bu aygıt bootable değil diyip sonraki aygita geciyo.
7 - Kontrolü Devreder (Jump)
Imza doğruysa BIOS:
DL registerine sürücü numarasini (0x00 = A:, 0x80 = C
yukler.
CS:IP = 0x0000:0x7C00 ile kodu çalıştırmaya başlar.
8 - Bootloaderin Çalışması (sonunda amk)
bootloader kodu calistigina gore olacaklar sunlar:
stack kurulcak (SS:IP)
DS/ES segmentleri ayarlancak (genelde 0x7C0)
ek olarak; BIOS kesmeleri (INT 10h, INT 13h) hala kullanilabilir.
SEGMENTLER:
daha onceden bahsetmistim
CS -> code segment
DS -> data segment
ES -> extra segment
SS -> stack segment
FS -> F segment
GS -> G segment
fiziksel adres de şöyle (eski serimi okumussaniz buna da hakimsinizdir)
Offset = segmentten ne kadar uzaga gidicegin.
Örnek:
Segment = başlangıç noktası
Offset = baslangıç noktasına uzaklığın
==============
Segment = 1000h
Offset = 5h
yani 1000h den 5 ileri git.
Fiziksel adres formülü:
fiziksel adres = segment * 16 + offset
Örnek:
Segment = 1000h
Offset = 0020h
Segment x 16 (Segment x 10h) = 1000h x 10h = 10000h, 10000h + 0020h = 10020h. Ve bu bir hex olduğundan çevrilmiş hali 65568 oluyor. Yani ram'in 65568. byte'ine git demek.
Bunu öğrettim cünkü CPU Segment:Offset alır. Azonceki örneğe göre CPU'nun alacağı şey = 1000:0020'dir. Bellekteki konumu 2 parçalı gösterme şekli veya hesaplayarak byte buluyon ikiside ayni sonuc ztn.
BPB - BIOS PARAMETER BLOCK
bu şey BIOS veya OS Loadere "bu diski nasi okucam aq" sorusunun cevabini verio.
Diskin boyutunu, sektör yapısını, FAT tipini (FAT12/16/32) belirtir.
Özellikle 12/16 formatli disk veya usblerden boot ederken onemli cunku windows/linux bu bilgilerle dosya sistemine erisiyor.
BPB'nin icinde NE VAR?
boot sektörünün başlangıçından itibaren (genelde 0x00'dan başlar) şunlar var:
Offset Alan (Bytes) Açıklama
0x00 3 Jump Kodu (EB 3C 90 gibi) – BIOS’u atlayıp boot koduna geçer
0x03 8 OEM Adı (örn: "MSDOS5.0") – Marka bilgisi
0x0B 2 Sektör Boyutu (genelde 512)
0x0D 1 Küme Başına Sektör (genelde 1 veya 4)
0x0E 2 Ayrılmış Sektör Sayısı (Boot sektörü dahil, genelde 1)
0x10 1 FAT Kopya Sayısı (genelde 2)
0x11 2 Kök Dizin Giriş Sayısı (FAT12/16’da 224 veya 512)
0x13 2 Toplam Sektör Sayısı (Disk 65535’ten küçükse burada)
0x15 1 Medya Desktriptörü (0xF0 = Disket, 0xF8 = Sabit Disk)
0x16 2 FAT Başına Sektör Sayısı (Her FAT tablosunun boyutu)
0x18 2 Her İzdeki Sektör Sayısı (CHS hesapları için)
0x1A 2 Kafa Sayısı (CHS hesapları için)
0x1C 4 Gizli Sektör Sayısı (Partition başlangıcından önceki sektörler)
0x20 4 Toplam Sektör Sayısı (Disk 65535’ten büyükse burada)
BPB'nin bootloadere etkisi:
Eğer bootloader diskten dosya okuyacaksa (ikinci aşama loader veya çekirdek yüklicekse), bu değerleri kullancaz:
Root Directory’nin yerini bulmak için:
RootDirLBA = AyrılmışSektörler + (FATKopyaSayısı × FATBoyutu)
Bir dosyanın (örn: KERNEL.BIN) veri alanını bulmak için:
Önce FAT tablosunu okucan, zinciri takip etcen
baslayalim,
BOOTLOADER NE AMK?!?!?
bootloader, os'yi rame kopyalayip calistirir.
BIOS YUKLENME SURECI
1- Power On
güç düğmesine basiyon ve anakart sinyali aliyo.
Cpu sifirlaniyo, CS:IP (o an çalışan komudun adresini belirten segment
2- POST (Power On Self Test)
BIOS donanimi test ediyo:
CPU -> temel komutlar
RAM -> hızlı sağlık kontrolü
klavye/ekran/disk denetleyicileri vb. -> var yada yok diye bakiyo
Hata varsa hata mesaji veriyo, yoksa devamke.
3 - BIOS donanimi baslatiyo
PCI/PCIe aygitlarini baslatiyo.
Video BIOS (VGA/GPU) aktif oluyo ve ekran hazirlaniyo.
Disk/Depolama denetleyicilerini (IDE/SATA/NVME) taniyo.
4 - Boot Aygıtı Sırasını Belirliyo
Bios, CMOS'da kayıtlı Boot Orderi okuyo:
örnek: USB -> CD/DVD -> HDD -> NETWORK (PXE)
Her aygıt için Boot Signature (0xAA55) arar.
5 - Ilk Sektorü Okuyo
Aygıtın 0. Sektörünü (LBA 0 veya CHS 0/0/1) okur.
Tam 512 Byte (ne eksik ne fazla, bios 512 byteden fazlasını yuklemez) veriyi 0x0000:0x7C00 adresine yükler.
6 - Imza Kontrolü (0xAA55)
Bios 512 bytenin son 2 bytesini kontrol edio:
511. Byte -> 0x55
512. Byte -> 0xAA
Eşleşmiyosa -> bu aygıt bootable değil diyip sonraki aygita geciyo.
7 - Kontrolü Devreder (Jump)
Imza doğruysa BIOS:
DL registerine sürücü numarasini (0x00 = A:, 0x80 = C
CS:IP = 0x0000:0x7C00 ile kodu çalıştırmaya başlar.
8 - Bootloaderin Çalışması (sonunda amk)
bootloader kodu calistigina gore olacaklar sunlar:
stack kurulcak (SS:IP)
DS/ES segmentleri ayarlancak (genelde 0x7C0)
ek olarak; BIOS kesmeleri (INT 10h, INT 13h) hala kullanilabilir.
SEGMENTLER:
daha onceden bahsetmistim
CS -> code segment
DS -> data segment
ES -> extra segment
SS -> stack segment
FS -> F segment
GS -> G segment
fiziksel adres de şöyle (eski serimi okumussaniz buna da hakimsinizdir)
Offset = segmentten ne kadar uzaga gidicegin.
Örnek:
Segment = başlangıç noktası
Offset = baslangıç noktasına uzaklığın
==============
Segment = 1000h
Offset = 5h
yani 1000h den 5 ileri git.
Fiziksel adres formülü:
fiziksel adres = segment * 16 + offset
Örnek:
Segment = 1000h
Offset = 0020h
Segment x 16 (Segment x 10h) = 1000h x 10h = 10000h, 10000h + 0020h = 10020h. Ve bu bir hex olduğundan çevrilmiş hali 65568 oluyor. Yani ram'in 65568. byte'ine git demek.
Bunu öğrettim cünkü CPU Segment:Offset alır. Azonceki örneğe göre CPU'nun alacağı şey = 1000:0020'dir. Bellekteki konumu 2 parçalı gösterme şekli veya hesaplayarak byte buluyon ikiside ayni sonuc ztn.
BPB - BIOS PARAMETER BLOCK
bu şey BIOS veya OS Loadere "bu diski nasi okucam aq" sorusunun cevabini verio.
Diskin boyutunu, sektör yapısını, FAT tipini (FAT12/16/32) belirtir.
Özellikle 12/16 formatli disk veya usblerden boot ederken onemli cunku windows/linux bu bilgilerle dosya sistemine erisiyor.
BPB'nin icinde NE VAR?
boot sektörünün başlangıçından itibaren (genelde 0x00'dan başlar) şunlar var:
Offset Alan (Bytes) Açıklama
0x00 3 Jump Kodu (EB 3C 90 gibi) – BIOS’u atlayıp boot koduna geçer
0x03 8 OEM Adı (örn: "MSDOS5.0") – Marka bilgisi
0x0B 2 Sektör Boyutu (genelde 512)
0x0D 1 Küme Başına Sektör (genelde 1 veya 4)
0x0E 2 Ayrılmış Sektör Sayısı (Boot sektörü dahil, genelde 1)
0x10 1 FAT Kopya Sayısı (genelde 2)
0x11 2 Kök Dizin Giriş Sayısı (FAT12/16’da 224 veya 512)
0x13 2 Toplam Sektör Sayısı (Disk 65535’ten küçükse burada)
0x15 1 Medya Desktriptörü (0xF0 = Disket, 0xF8 = Sabit Disk)
0x16 2 FAT Başına Sektör Sayısı (Her FAT tablosunun boyutu)
0x18 2 Her İzdeki Sektör Sayısı (CHS hesapları için)
0x1A 2 Kafa Sayısı (CHS hesapları için)
0x1C 4 Gizli Sektör Sayısı (Partition başlangıcından önceki sektörler)
0x20 4 Toplam Sektör Sayısı (Disk 65535’ten büyükse burada)
BPB'nin bootloadere etkisi:
Eğer bootloader diskten dosya okuyacaksa (ikinci aşama loader veya çekirdek yüklicekse), bu değerleri kullancaz:
Root Directory’nin yerini bulmak için:
RootDirLBA = AyrılmışSektörler + (FATKopyaSayısı × FATBoyutu)
Bir dosyanın (örn: KERNEL.BIN) veri alanını bulmak için:
Önce FAT tablosunu okucan, zinciri takip etcen