OS Test

Kendi İşletim Sisteminizi Yazın!

Mehabalar… Bu yazımda sizlere assembly dili ile nasıl basit bir bootloader yazabileceğinizi anlatacağım.

[sam id=”1″ codes=”true”]

[sam id=”1″ codes=”true”]

Ancak bunlardan önce işletim sistemleri hakkında genel bilgiler vermekte fayda var.

BIOS Nedir?

BIOS, (Basic input-output System) (Türkçesi: Temel Giriş-Çıkış Sistemi) bilgisayarınızı satın aldığınızda onunla beraber gelen bir EPROM (Erasable Programmable Read-Only Memory) (Türkçesi: Silinebilir Programlanabilir Salt Okunur Hafıza) hafıza üzerinde bulunan bir yazılımdır. Bilgisayar açıldığı anda işlemciye tüm diğer donanımları tanıtır. Bu donanımların temel iletişimprotokollerini belirler. Ve işletim sisteminin herhangi bir sürücüden (örn: HDD/USB bellek vb.)  başlatılmasını sağlar ve işletim sistemi çalışırken donanım/yazılım arasındaki ilişkileri düzenler. Aşağıda anakart üzerinde bulunan BIOS EPROM yongasını görmektesiniz:

BIOS EPROM
Fotoğraf Kaynağı: Wikipedia

Önyükleme (Boot) Nedir?

Bilgisayarlarda önyükleme, bilgisayarın başlatma tuşuna basıldıktan sonra bir işletim sistemini başlatması için gereken komut veya komut dizesidir.

Bilgisayar Nasıl Önyükleme Yapar?

Bir bilgisayar kasasının başlatma tuşuna bastığınızda bilgisayarınız öncelikle işlemci pinlerini sıfırlar ve register’ları belirli bir değere ayarlar. CPU, BIOS ardesine atlar (0xFFFF0). BIOS, bir POST kontrolü (Power-on Self-Test) (Türkçe: Açılışta otomatik sınama) ve diğer gerekli kontrolleri yapar. Bu kontroller, tüm donanımı (RAM, CPU vb.) sağlıklı çalışıp çalışmadığını denetlemek için anakartı tarar. Bazen bilgisayarımızı açtığımızda gelen “Beep” sesleri, bu kontrolün olumsuz sonuçlanmasından kaynaklanır. Aşağıda bilgisayarımız POST işlemini gerçekleştirirken karşımıza çıkan bir ekranın ekran alıntısı bulunmakta.

Fotoğraf Kaynağı: Wikipedia

Bu işlemden sonra BIOS, MBR’ye (Master Boot Record) (Tr: Ana Önyükleme Kaydı) atlar. MBR, disklerin ilk 512 baytlık bölümüdür. Bu bölüm, diskinilk sektörüdür. BIOS, MBR üzerie geldiğinde buradan birinci bootloader yüklenir. Bu 512baytlık yazılım, ikinci bootloader’ı çalıştırır. İkinci bootloader ise işletim sistemini yükler. Aşağıda birinci bootloader’in yapısını görmektesiniz:

MBR
Çizim Kaynakçası: www.engineersgarage.com

Örnek Bir Bootloader

[BITS 16]       ;Derleyiciye kodun 16 bit olduğunu söyledik.
[ORG 0x7C00]    ;Derleyiciye kodun yüklendikten sonra hafızadaki
                ;yerini belirttik.
MOV SI, String  ;Dize işaretçisini SI'ya kaydet.
CALL PrintString;Dize basma fonksiyonunu çağır.
JMP $           ;Sonsuz döngüyü başlatıyoruz.
PrintCharacter: ;Ekrana karakter basarken kullanacağımız işlem.
                ;ASCII değerinin AL içerisinde olduğunu varsayınız.
MOV AH, 0x0E    ;BIOS'a ekrana bir karakter basmamız gerektiğini
                ; söyle.
MOV BH, 0x00    ;Sayfa numarası. 
MOV BL, 0x07    ;Yazı özniteliği 0x07, siyah arkaplan üzerinde 
                ; açık yazı tipi.
INT 0x10        ;Video kesmesini çağır.
RET             ;Çağrı işlemine geri dön.
PrintString:    ;Ekrana dize basarken kullanacağımız işlem.
                ;Dize başlama işaretçisi SI kaydında.

next_character: ;Dizeden bir sonraki karakteri almak için etiket.
MOV AL, [SI]    ;Dizeden bir bayt al ve AL içerisine kaydet.
INC SI          ;SI'yi artır.
OR AL, AL       ;AL daki değerin 0 olup olmadığını kontrol et. 
                ;(0 => dize sonu)
JZ exit_function;Dize bittiyse dön
CALL PrintCharacter ;Bitmediyse AL'daki karakteri bas.
JMP next_character  ;Dizeden sonraki karakteri getir.
exit_function:      ;Etiketi bitir
RET                 ;İşleme dön
PrintString:        ;Ekrana dize basarken kullanacağımız işlem.
                    ;Dize başlama işaretçisi SI kaydında.
next_character:     ;Dizeden bir sonraki karakteri almak için etiket.
MOV AL, [SI]        ;Dizeden bir bayt al ve AL içerisine kaydet.
INC SI              ;SI'yi artır.
OR AL, AL           ;AL daki değerin 0 olup olmadığını kontrol et.
                    ;(0 => dize sonu)
JZ exit_function    ;Dize bittiyse dön
CALL PrintCharacter ;Bitmediyse AL'daki karakteri bas.
JMP next_character  ;Dizeden sonraki karakteri getir.
exit_function:      ;Etiketi bitir
RET                 ;İşleme dön
;Veri
String db 'Www.TurkiyeElektronik.Com', 0 ;0 ile biten String dizesi.

TIMES 510 - ($ - $$) db 0 ;Sektörün geri kalanını 0 ile doldur.
DW 0xAA55                 ;Önyükleyici imzası.

Evet kodların yanındaki ; işaretlerinden sonraki açıklamalar yardımıyla kodu anlayabilirsiniz 🙂 Komutları tek tek açıklamak için assembly ile ilgili başka bir yazı yazmayı düşünüyorum. Kısa bir bilgi vermek gerekirse assembly, çok düşük seviyeli (makine diline yakın) ve karmaşık bir dildir 😀 Şimdi bu kodu yazdıktan sonra nasıl derleyeceğinizi göstereceğim.  Ben Linux işletim sistemini kullanıyorum. Ancak bildiğim kadarıyla kullandığım programların [nasm (assembly derleyicisi), qemu (emülatör)] Windows için olanları da var 🙂 Öncelikle üsetteki assembly kodunu derlememiz, yani makine diline çevirmemiz gerekir. Bunun için Windows komut isteminden veya Linux uçbiriminden cd komutu ile yukarıdaki assembly kodunu kaydettiğimiz boot.asm dosyasının bulunduğu klasöre gelelim. Daha sonra nasm boot.asm -f bin -o boot.bin komutu ile makine dilinde bir boot.bin dosyası oluşturalım.

Geldik en güzel aşamaya: denemek 🙂 Denemek için ise qemu-system-i386 ./boot.binkomutunu kullanalım.

Ve sonuç:

OS Test

Ancak belirtmekte fayda var ki buşekilde sıfırdan bir işletim sistemi yazmamız neredeyse olanaksız. Bu nedenle Linux Kernel‘i ve GRUB Bootloader‘ını kullanmamızda fayda var. Kerneli Linux ve GRUB terimlerini daha sonra tek tek açıklayacağım. Umarım faydalı bir yazı olmuştur. Yorumlarınızı bekliyorm 🙂 Sorularınızı yorumlar aracılığı ile her zaman sorabilirsiniz. Sonraki yazılarımda görüşmek üzere, hoşça kalın…

Kaynakça:

http://whatis.techtarget.com/definition/BIOS-basic-input-output-system

https://www.engineersgarage.com/tutorials/how-computer-pc-boots-up

http://viralpatel.net/taj/tutorial/hello_world_bootloader.php

[sam id=”1″ codes=”true”]

[sam id=”1″ codes=”true”]

“Kendi İşletim Sisteminizi Yazın!” üzerine 14 yorum

    1. Merhabalar… Öncelikle yorumunuz için teşekkürler. Kodu çalıştırdığımda hatasız olarak görünüyordu. Acaba bu hata derleyicinin göremediği bir hata mıdır?

  1. mikrodenetleyicilerdeki(pic atmel ….) bootloader labunun arasındaki fark nedir.. mikrodenetleyicilerdeki sadece başlangıç adresi ve seri port iletişimini yüklüyor… bir işletim sistemi yüklemiyor…

  2. Have you ever considered creating an e-book or guest authoring on other blogs? I have a blog based upon on the same subjects you discuss and would really like to have you share some stories/information. I know my visitors would appreciate your work. If you are even remotely interested, feel free to send me an e mail.

    1. Hello,
      I’m sorry that I haven’t was able to answer for a long time. I had exams and some other work so I couldn’t find free time for the site 🙁 If I can find free time to write, I can be a guest author 🙂

  3. Hi there, just became aware of your blog via Google, and found that it is really informative. I am gonna be careful for brussels. I will appreciate in the event you proceed this in future. A lot of folks will probably be benefited out of your writing. Cheers!

Uygar Demir KOÇ için bir cevap yazın Cevabı iptal et

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.

%d blogcu bunu beğendi: