Haydi Bir İşletim Sistemi Yazalım

Bu yazımda basit bir işletim sistemi yazmayı anlatacağım.

Merhaba arkadaşlar, bu yazıyı assembly kategorisi olmadığı için buraya yazıyorum.

Basit Bir İşletim Sistemi Yapımı

İlk önce biraz işletim sistemlerinin çalışma prensibinden bahsetmek istiyorum. İşletim sistemleri BIOS (Basic Input Output System) üzerinde çalışırlar, daha doğrusu bilgisayarın tüm donanımlarını BIOS kontrol eder. Bilgisayar açıldığında ilk olarak BIOS yüklenir ve Harddiskten veya harici bir diskten işletim sistemi boot sektörünü bulup başlatır.

Bir işletim sistemi yazabilmek için Assembly dilini az çok bilmeniz gerekir. Ama korkmayın diğer programları gibi assembly çok geniş değildir. Daha zor görünse bile asında daha kolay öğrenilir.

BIOS üzerinde işletim sistemi çalışırken kesmeler (interrupt) ile BIOS ile iletişime geçer, onu kontrol eder veya yanıt alır. Örnek içinde bu konuyu açıklıyacağım.

Gerekli araç ve gereçler:
Nasm Assembler
VirtualBox (veya benzeri sanal işletim sistemi emülatörü) ve Ultra ISO programı (Sanal OS kullanmak için). Bu derleyici ile kodu derleyeceğiz. nasm.exe programının bulunduğu yeri PATH e eklerseniz komut satırı üzerinden daha rahat kullanabilirsiniz.

PATH e eklemek için Bilgisayarım-Özellikler-Gelişmiş-Ortam Değişkenleri içinde PATH ı bulup çift tıklayın ve PATH içeriğinin sonuna ; (noktalı virgül) ekleyip nasm.exe nin olduğu klasörü belirtin.

Nasm Kullanımı


nasm kaynak_kod.asm -f bin -o cikti_dosyasi.bin



Bu şekilde assembly kodumuzu bilgisayarımızın anlayabileceği makine diline çeviriyoruz.

Şimdi gelelim assembly koduna, bu kod en basit önyükleyici kodudur. Bu kod ile ekrana bir harf yazdıracağız.


[BITS 16] ; Assembly kodumuzun 16 bit olduğunu derleyiciye söyledik.

[ORG 0x7C00] ; Programın başlama adresini 0x7C00 olarak belirttik. (Sabit)



MOV AH, 0x0E ; Teletype modunda yazı yazacağımızı bios a bildiren kod.

MOV AL, 'A' ; Ekrana basılacak karakter 'A' yerine 63 de yazabilirsiniz.

MOV BH, 0x00 ; Sayfa yok.

MOV BL, 0x07 ; Siyah arkaplan üzerine gri yazı.



INT 0x10 ; BIOS kesmesini çağırdık, yukarıdaki satırları bios işleyecek.



JMP $ ; Burada bir sonsuz döngü açıp sistemin kapanmasını önlüyoruz.



TIMES 510 - ($ - $$) db 0 ; Sektörü 0 ile dolduruyoruz.

DW 0x55AA ; Standart boot imzasını ekliyoruz.



Bu kodu boot.asm diye kaydedelim. Ve kodun bulunduğu klasörde SHIFT tuşu basılıyken sağ tıklayalım, ve Komut Penceresini Burada Aç diyelim.


nasm boot.asm -f bin -o boot.bin



bu kodu girdikten sonra boot.bin dosyası oluşacaktır. Oluşmadıysa kodda bir hata var demektir.

Daha sonra UltraISO programını açıp, Menü'den Dosya-Yeni-Açılabilir CD/DVD Imajı seçelim ve boot.bin dosyasını açalım. (Açtıktan sonra ekranda bir değişiklik olmayacak bu normaldir.) Daha sonra kaydet butonuna tıklayarak, veya menü-kaydet ile boot.iso olarak kaydedelim.

Buraya kadar sorunsuz gelebildiyseniz, tebrikler. Artık işletim sisteminiz hazır. Son olarak çalıştırma aşaması kaldı.

Bunun için en güvenli yol olan sanal işletim sistemi emülatörü kullanacağız, benim önerim Oracle VirtualBox, tabi siz Vmware v.b. de kullanabilirsiniz.

Emülatörde yeni bir makine oluşturup CD ekle fonksiyonu ile iso kalıbını yerleştirelim. (Sanal OS emülatörünü kullanmayı bildiğinizi varsayıyorum, eğer bilmiyorsanız virtualbox sanal makine oluşturma konusunu araştırınız.)

Ve karşınıza A yazan bir ekran geldi, işte bu sayede BIOS u kullanarak ekran kartı üzerinden ekranınıza bir harf yazdırdınız.

Ekrana birkaç satır yazdırmak

[BITS 16]   ; 16 bit kod

[ORG 0x7C00]; orjini belirttik, bu sabittir ve 0x7C00 olmak zorundadır



MOV SI, Metin ; SI registerine Metin için refrerans belirttik

CALL Yazdir   ; Yazdır fonksiyonunu çağırdık



MOV SI, Metin2

CALL Yazdir



MOV SI, Metin3

CALL Yazdir



MOV SI, Metin4

CALL Yazdir





JMP $ ; Sonsuz döngü



KarakterYazdir: ; Karakter yazdırma fonksiyonu

MOV AH, 0x0E

MOV BH, 0x00

MOV BL, 0x0A



INT 0x10

RET



Yazdir: ; Metin yazdırma fonksiyonu

SonrakiKarakter:

MOV AL, [SI] ; SI registerinden bir harf okuyoruz

INC SI ; SI registerini 1 arttırıyoruz, 1 sonraki harfe git

OR AL, AL ; harf 0 mı diye kontrol ediyoruz

JZ Cikis ; eğer 0 ise çıkışa gidiyoruz

CALL KarakterYazdir ; harfi yazdırıyoruz

JMP SonrakiKarakter ; bir sonraki harfe gidiyoruz

Cikis:

RET



; Burada metin değişkenlerimiz var 0x0D = CR ve 0x0A ise LF dir.

; CRLF bir alt satıra geçmemizi sağlar

; sondaki 0 ise metnin sonunu kontrol amaçlı bırakılmıştır.



Metin  db 'Yunus X (R) Operating System', 0x0D, 0x0A, 0

Metin2 db 'Version V1.0', 0x0D, 0x0A, 0

Metin3 db 'Copyright (C) 2014', 0x0D, 0x0A, 0

Metin4 db 'Developed by Muhammed Yunus Akdag', 0x0D, 0x0A, 0



; Boot sektörü 512 bayt olmalıdır, bu nedenle boş kalan yerleri

; 0 ile doldurmamız gerekiyor

; $ şu anki satırı, $$ ise programın başlangıç noktasını verir.

; Yani 510 - ($ - $$) programımızın kapladığı boyutun 510 dan

; çıkarılmasından varılan sonucu verir



TIMES 510 - ($ - $$) db 0



; Boot imazası AA55 ile kodumuz tam 512 bayt a ulaşmış olur.



DW 0xAA55



Bu konuda türkçe kaynak bulmanın zor olduğunu bildiğim için bu yazıyı sizin için yazdım, umarım faydalı olmuşumdur.
  • Etiketler;
Yorum Yaz

Yorum yazabilmek için üye girişi yapmanız gerekiyor!

Yukarı Git