17 Mayıs 2016 Salı

Kernel Boot Process

[Daha sonra güncellenecek kendime not alırken yazdığım şeyler mevcut.]

x86 mimarisi ve bios ile bootlama süreci ele alınarak anlatım yapılmıştır.

pc ayağa kalkarken işletim sisteminin kernelına nasıl teslim ediliyor,en sade biçimde anlatmaya çalıştım.

aşağıdaki resme bakıcak olursak "kernel" kısmına kadar geliniyor bu yazıda bundan bahsedilecek.




Bilgisayarınızı açmak için düğmeye bastığınızda  ram içerisinde herhangi bir data/instruction(veri/emir)   yoktur ve genelde bilgisayar dünyasında CPU genellikle gider ramin içindeki kodları dataları okur   alır işler tekrar rame yazar bu işlem her bir kullanıcı tetiklemesinde böyle devam eder,







bilgisayarı ilk açtığınızda ram de herhangi birşeyin olmaması ve haliyle cpu içinde  çalıştırılacak birşeylerin olmaması demek.
PC dizayn eden kişiler  bu bilgisayar kapandığında ve tekrar açıldığında nasıl ayağa  kaldırıcaz bu ölüyü diye düşünmüşler ve buna da boot süreci demişler.

memoryinin maplenişi....

PC açmak için power-on düğmesine bastığınızda sistemi tasarlayanlar CPU nun ilk bakması gereken yerin FFFFFF0 adresi olduğunu  bildirmişler.CPU tarafından buradaki instruction okunduğunda,CPU JMP BIOS yapması gerektiğini anlar,yani BIOS programına sıçrama yapar.

Bu arada hani sistem ilk açıldığında boştu diye düşünürseniz haklısınız öyleydi ama bu adresler bizim RAM adresimiz değil  bu BIOS   EEPROM(ramden farklı birşey öyle düşün) içerisinde saklıdır yani elektrik kesintisinden etkilenmeyen içine gömdüğünüz kodların aynen kaldığı,
fakat RAM ise aksine elektrik kesintisinden etkilenendir.

buradaki bilgiler sistem daha hızlı çalışsın diye genelde önce rame getirilir. Buna shadowing de deniliyor.


peki biosa sıçrama yaptık şimdi ne olucak,biosun yapması gereken önemli görevler var ama bizim burada bu kadar detaya girmemize gerek yok.

kısaca bahsetelim.

bios  POST(Power-On Self-Test) dediğimiz bir süreci çalıştırır,bu iç cihazları
sisteme tanıtmak,CPUnun  tüm iç/dış cihazlara erişebilmesini sağlamak,ve saire..

bu sürec içerisinde bir hata olduğunda bilgisayar açılmaz ve bize gerekli hata verilebilir.en basitinden BIOS beep codeları diye internette aratırsanız ne demek istediğimi anlıyacaksınız..(bu hatanın verilmesi sistem tasarlayıcısına da bağlı)


BIOSun halletiği bir başka birşey  interrupt vector tablosu dediğimiz  kesmelere karşı düşen servis programlarının başlangıc  adreslerinin tutulduğu tabloyu  RAM de gerekli yere yerleştirmek,bunları işletim sistemi daha sonra isterse ezebilir(üzerine yazabilir,ki genelde öyle de oluyor)


    MASTER BOOT RECORD ??



şimdi BIOSun yaptığı bir diğer iş en önemlilerinden biri MASTER BOOT RECORD ya da MASTER  BOOT SECTOR ya da BOOT SECTOR ya da 0.sektör diyede bilinen sektörü alıp rame transfer etmek(Hard disk den rame) ve işler artık  buradan BIOSun olmadığı bir şekilde devam ediyor.



disk üzerinde MBR nasıl bir yerde duruyor diye kafamızda canlandırmak için alttaki resim yardımcı  olabilir.


evet ne demiştik MASTER BOOT RECORD/MASTER BOOT SECTOR/BOOT SECTOR  bu sektör ne peki ilk olarak okunduğu için mi çok kıymetli ?evet aynen öyle önemli olmasa neden ilkinde bunu okusunlar. 


bu sektörü bios okur ve  ramin 0x7c000 adresinden itibaren yükler dedik.(dememişiz ama böyle oluyor)

master boot sectorün içeriğine bakalım.

Nedir bunlar ?

1.Partition Table
2.Bootstrap Code
3.Boot Signature

1.Partition Table

hemen partition table açıklayalım  büyük ihtimalle buna yabancı değilsiniz.partition table içerisinde 4 adet primary partitions var.bunlar kısaca diskimizde bölümleme yaratmaktadır.sanırım herkes bir C disk alanına ve bir de D disk alanına sahip ve bazen de aynı pc ye iki işletim sistemi yüklüyoruz işte buradaki mantık diski bölmelere ayırmak. 


özetleyecek olursak  tek bir diski bölmelere ayırıyoruz,4 tane primary partition ile sınırlıyız.fakat herhangi bir şekilde 6 partitiona da diski bölebiliriz,çünkü sistem bize extended partition hakkı tanıyor yani 6 partition için 3 tanesi primary olsun bu durumda diğerini extended edip 3 tane de ondan logical partition yaratabiliriz.fakat kesinlikle bunlardan biri primary partition olmak zorunda.



bir de bu partition table entry(kayıtlarından) bahsetmek de fayda var bunların her biri 16 byte dan oluşan kayıtlar o halde 4 tane den toplamda 64 byte lık bir alan kaplamış oluyorlar.biz sadece bir entry alıp incelesek yeterli bizim için..

Partition 1 : 80 01 01 00 83 FE 3F 01 3F 00 00 00 43 7D 00 00 bunlar hex değerlerdir.

ilk byte 80h bu partitionın  önyüklenebilir olduğunu,00 ise bunun önyüklenemez olduğunu söylüyor.demek ki bu  değerden 
bu partitionın önyüklenebilir olduğunu anlıyoruz.

01 01 00 ise bize bu partition silindir,kafa,sektör no bilgilerini vermektedir.

83 dosya sistemine ilişkin bir numaradır.(örneğin:Ext2, ReiserFS, FAT32, NTFS, )

FE 3F 01 : bu partitionın son sektörün için  silindir,kafa,sektör bilgisidir.

3F 00 00 00 : bu partitionın ilk sektörünün lojik block data adresi

43 7D 00 00 : partitionın sektör sayısı


2.Bootstrap Code

MBR(Master Boot RECORD)nin ilk 440 bytenı bu bootstrap code alıyor.

active partition diyede bir kavram var bu elimizdeki partitionların hangisinden önyükleme yapılacağını belirlemek için kullanılan bir yöntem.şöyle düşünün elinizdeki makinede 4 partition var ama bize lazım olan hangisinin içerisinde işletim sistemi yüklü olduğu.işte bunu active partition belirliyor.

bunu anlattıktan sonra bootstrap kodu içinde birkaç birşey diyebiliriz.

örneğin geleneksel windowsun  bootstrap kodunun yaptığı şey de  partition table içerisinde active partition bulmak,ve boot sektörünü(partitionın ilk sektörü) memorye yüklemek ve oradan çalıştırmak..

linux içinse olaylar şu şekilde işliyor..

stage 1 boot loader(primary boot loader) master boot record'dan bios ile memory içerisine okunulur.

primary boot loader 512 bytedan daha az  mbr içerisinde ve işi ise
stage 1.5 boot loaderını veya stage 2 boot loaderını yüklemektir.

stage 1.5 boot loaderı stage 1 boot loaderı tarafından memorye içerisine
okunur.( gnu tarafından stage 1.5 kaldırılmıştır) ve buradan stage 2 boot loaderına geçilir.

stage 2  boot loaderı(secondary boot loaderı) memorye okunur.

secondary boot loaderı GRUB menuyü ve command environmetları gösterir.
bu arayüz kullanıcıya hangi kernel veya işletim sistemi bootlanacaksa onu seçmesini sağlar,(kernela argüman geçirmede burada..)

ve secondary boot loader   kernelı ramin içerisine yerleştirir..


GRUB menüsünde hangi işletim sisteminin başlayacağını  belirlediğinde,onu memorye  yükler  ve makine kontrolünü o işletim sistemine verir.



3.Boot signature

Bu son iki byte ise boot drivelardan  gerçekte hangi disk sürücünün bootable olduğunu bize bildirir.

BIOS amca burada BIOS boot sıra listesine bakar eğer bu değer hexal olarak 55 AA  değerine eşitse  evet doğru sürücü tercihi fakat değilse o zaman boot sıra listesindeki bir sonra device kontrol edilir.

peki oldu ki hiç bir device da bu değer eşleşmedi o zaman "No boot device is available" veya  "Reboot and select proper boot device." gibi mesaj alabiliriz.

Boot Signature kısaca anlatmış olduk.



EOF

Hiç yorum yok:

Yorum Gönder