Merhaba,
İşletim sistemlerinin temel seviyede nasıl çalıştığını öğrenmek ve donanımla yazılımın nasıl iletişim kurduğunu kendi gözlerimle görmek için sıfırdan küçük bir işletim sistemi projesi geliştirmeye karar verdim. Projenin adını ViraOS koydum. Bu ticari veya devasa bir sistem olma iddiası taşımayan, tamamen öğrenme ve pratik yapma amaçlı kişisel bir projedir.
Projeyi sadece x86'ya bağımlı kılmak yerine, modern bir yaklaşım sergileyerek hem CISC (x86) hem de RISC (ARM) mimarilerinde çalışabilecek şekilde kurguladım. Kernel kodları ile donanıma özel kodların birbirine karışmasını önlemek için araya HAL katmanı ekledim. Projeyi daha da ileri götürerek kendi GDT yapılandırmamı, heap allocator'ımı, cooperative scheduler'ımı ve TarFS dosya sistemini sıfırdan kodladım.
Klasör yapısını anlaşılır ve sade tutmaya çalıştım:
OS/
|-- Makefile # Derleme kuralları
|-- kernel/
| `-- kernel.c # Platformdan bağımsız kernel kodları
|-- x86/
| |-- boot.asm # x86 başlangıç kodu ve context switch assembly yardımı
| |-- hal.c # x86 HAL sürücüleri
| `-- linker.ld # x86 linker script
`-- arm/
|-- boot.s # ARM başlangıç kodu ve context switch assembly yardımı
|-- hal.c # ARM HAL sürücüleri
`-- linker.ld # ARM linker script
kernel/kernel.c: Çekirdeğin ana giriş noktası.kernel_mainfonksiyonu üzerinden yürür. Mimariye özel donanım adreslerini doğrudan kullanmaz. İçerisinde şunları barındırır:- Heap Allocator:
kmallocvekfreesunan linked list tabanlı First-Fit yapısı. ARM64'teki pointer hizalama hatalarını önlemek için tüm heap alanı ve bloklar 16byte hizalıdır. - Cooperative Scheduler:
task_createvetask_yieldile çalışan, görevlerin sırayla stack pointer değiştirerek çalıştığı multitasking yapısı. - TarFS: files/ dizinindeki dosyaları Makefile aşamasında initrd.tar yapıp, objcopy ile doğrudan kernel'a gömdüğümüz ve RAM'de okunan basit dosya sistemi.
- Interactive Shell: ls, cat, heap, help, version, clear ve reboot komutlarını destekleyen komut satırı arayüzü.
- Heap Allocator:
x86/Klasörü: PC mimarisi için gerekli kodlar. VGA text moduna yazan, klavye denetleyicisini (port 0x60/0x64) sorgulayan HAL sürücülerini ve 3 segmentli (null, kernel code, kernel data) GDT yapılandırmasını içerir.arm/Klasörü: ARM mimarisi için gerekli kodlar. PL011 UART seri portunu (0x09000000) kullanan sürücüyü içerir.
Derleme için QEMU emülatörünün ve ilgili cross compiler'ların sisteminizde kurulu olması gerekir. Kurulumlardan sonra terminal üzerinden tek komutla test yapabilirsiniz:
- x86 mimarisini test etmek için:
make run-x86 - ARM mimarisini test etmek için:
make run-arm
Test işlemleri bittikten sonra compile artıklarını temizlemek için make clean çalıştırabilirsiniz.
Kodu kurcalamaktan, bir şeyleri bozmaktan veya patch atmaktan çekinmeyin.
Godspeed.
— Alpagan Barut