C ile Sıfırdan 32-Bit Kernel Yazma

Merhaba, Bu yazıda C Programlama dilinde sıfırdan 32-Bit(x86) kernel yazacağız. Bir işletim sisteminin çekirdeğini yazmak zor bir işlemdir. Çünkü tüm sürücüleri ve donanımları siz yöneteceksiniz. Bu kerneli linux işletim sisteminde derleyeceğiz. Windows kullanıcıları WSL2 kullanabilirler. Fakat ben bu yazıda sanki yeni bir makina kurulmuş gibi davranacağım. Yani tüm programları ve kütüphaneleri birlikte kuracağız. Şimdi yavaştan geliştirme ortamımızı hazırlamaya başlayabiliriz. Ben işletim sistemi olarak Ubuntu kullanacağım. Sizde tavsiye ederim, ama zorunda değilsiniz. Şimdi başlayalım.

İhtiyacımız Olanlar:

  • Linux İşletim Sistemi (Tercihen Ubuntu) yada WSL2
  • GCC
  • i686-elf-tools
  • Make
  • Bison
  • Flex
  • GMP
  • MPC
  • MPFR
  • Textinfo
  • unzip

Şimdi Ubuntu’yu sıfırdan kurduğunuzu varsayıyorum ve geliştirme araçlarını kurmaya başlayabiliriz.

Aşağıdaki araçları tek tek kuralım:

sudo apt install build-essential
sudo apt install bison
sudo apt install flex
sudo apt install libgmp3-dev
sudo apt install libmpc-dev
sudo apt install libmpfr-dev
sudo apt install texinfo
sudo apt install xorriso
sudo apt install unzip

Kurulumlar bittikten sonra doğrulama yapalım:

gcc --version
g++ --version
# Eğer GCC ve G++ bulunamadı hatası verirse manuel kurulum yapacaksınız:
sudo apt install gcc
sudo apt install g++

Şimdi ise i686-elf-tools kurulumu yapacağız. Hali hazırda i686-elf-tools binary dosyaları yok. Elinizde iki seçenek var. Ya sıfırdan kendiniz derleyeceksiniz yada benim derlediğim i686-elf-tools binary lerini kullanacaksınız. Seçim size kalmış. Şunu söylemek istiyorum. Derleme işlemi baya uzun sürüyor bilginize. Kendiniz derlemek isterseniz internette bu konuyu araştırabilirsiniz. Benim derlediğim i686-elf-tools setini indirmek için >> Buraya << tıklayarak indirebilirsiniz. Yada wget ile çekebilirsiniz.

Surasıyla aşağıdaki komutları çalıştıralım.

mkdir $HOME/elf-tools
cd $HOME/elf-tools
wget https://www.korayustundag.com/static_files/i686-elf-tools-linux.zip
unzip i686-elf-tools-linux.zip

Şimdi ise elf tool setini PATH’e ekleyelim.

export PATH="$HOME/elf-tools/bin:$PATH"

Şimdi ise versiyon kontrolü yapalım:

cd $HOME
i686-elf-as --version

Versiyon bilgisini veriyorsa herşey hazır demektir. Artık kodlamaya geçebiliriz.

Bootloader

Şimdi ben tüm kodları konsol üzerinden nano ile yazacağım. Siz isterseniz VSCode, Vim veya KDevelop gibi araçlar kullanarak yazabilirsiniz. Şimdi Klasörlerimizi oluşturalım.

mkdir -p $HOME/dev/src
cd $HOME/dev/src

Şimdi bootloader dosyamızı oluşturalım ve yazmaya başlayalım. Dosyanın adını “boot.s” yapıyoruz ve içine ağaıdaki kodları yazıyoruz:

Şimdi ise boot dosyamızı derleyelim.

i686-elf-as boot.s -o boot.o

Kernel

Şimdi ise kernel yazmaya başlayabiliriz. “kernel.c” dosyamızı oluşturalım ve yazmaya başlayalım.

Şimdi ise Kerneli derleyelim.

i686-elf-gcc -c kernel.c -o kernel.o -std=gnu99 -ffreestanding -O2 -Wall -Wextra

Linker

Şimdi ise boot ile kerneli birbirine bağlamamız lazım. Bunun için linker yazmamız gerekiyor. “linker.ld” dosyamızı oluşturuyoruz.

Şimdi ise kerneli ve boot dosyasını linkleyelim.

i686-elf-gcc -T linker.ld -o kernel.bin - ffreestanding -O2 -nostdlib boot.o kernel.o -lgcc

Tebrikler. Kernel dosyamız(kernel.bin) hazır. Şimdi isterseniz qemu ile direkt çalıştırabilir veya iso dosyası hazırlayabilirsiniz. Dilerseniz iso dosyasını hazırlayalım.

ISO Dosyası

İlk önce “grub.cfg” dosyamızı oluşturalım.

menuentry "KoraxOS" {
    multiboot /boot/kernel.bin
}

Ardından iso dosyası için gerekli klasörleri oluşturup, kerneli ve grub dosyamızı oluşturduğumuz klasörlere kopyalayacağız. Son olarak iso dosyamızı oluşturacağız.

mkdir -p isodir/boot/grub
cp kernel.bin isodir/boot/kernel.bin
cp grub.cfg isodir/boot/grub/grub.cfg
grub-mkrescue -o korax.iso isodir

Artık iso dosyamız hazır. Tek yapmanız gereken qemu veya başka bir sanal makinede çalıştırmanız. Dilerseniz iso dosyasını bir USB belleğe yazdırıp kendi makinenizde de çalıştırabilirsiniz.

qemu-system-i386 -cdrom korax.iso
# veya #
qemu-system-i386 -kernel kernel.bin

İşte bu kadar. Gerisi sizin programlama becerinize kalmış. Umarım yardımcı olabilmişimdir.

Kolay gelsin…

Scroll to Top