HN’de paylaşıldı: Kendi yazdığı hobi amaçlı OS sonunda eski bir IBM ThinkPad’de çalıştı
(github.com/joexbayer)- RetrOS-32, i386 mimarisini merkezine alan tamamen özel yapım 32 bit bir hobi işletim sistemi ve grafik, çoklu görev ile ağ özelliklerini içeriyor
- Çekirdek, yardımcı araçlar ve build sistemi C ve Assembly ile yazıldı; kullanıcı alanı uygulamaları C++ ile geliştiriliyor ve build için Make ile Docker kullanılıyor
- Test edilen gerçek donanımlar arasında Lenovo x240, Asus Eee PC serisi, Dell Optiplex 780, Samsung N150 Plus, Samsung NP-NC10 ve IBM Thinkpad a21p yer alıyor
- Çalıştırma yöntemleri olarak QEMU, copy.sh içindeki v86 ve gerçek donanımdan önyükleme destekleniyor; gerçek cihazlarda
.isodosyası USB’ye ya da CD’ye yazdırılıp GRUB ISO ile çalıştırılıyor - Yol haritasında önyükleyici, preemptive çok iş parçacıklı zamanlama, dosya sistemi, grafik pencere yöneticisi, ağ yığını, kullanıcı alanı iş parçacıkları ve TCP uzak sanal terminal gibi öğeler tamamlanmış olarak listeleniyor
RetrOS-32 genel bakış
- RetrOS-32, i386 mimarisine odaklanan 32 bit bir hobi işletim sistemi projesi
- Proje açıklamasında bunun grafik, çoklu görev ve ağ özelliklerine sahip 32 bit bir hobi işletim sistemi olduğu belirtiliyor
- Başlangıç tarihi 12 Mayıs 2022 olarak yazılmış
- Proje sayfası Project OSHub page bağlantısına yönlendiriyor
Giriş ve kullanıcılar
- Varsayılan kullanıcılar system, admin, guest olmak üzere 3 adet
- admin parolası
admin, guest için ise parola yok - Şu anda admin ile guest arasında bir fark yok
- Kullanıcılar
admin create <username> <password>komutuyla oluşturulabiliyor
Kullanılan diller ve build yapısı
- Çekirdek, yardımcı araçlar ve build sistemi C ve Assembly ile yazılmış
- Kullanıcı alanı uygulamaları C++ ile yazılmış
- Derleme için Make kullanılıyor
- Çapraz platform derleme için Docker kullanılıyor
Test edilen donanım
- Test edilmiş gerçek donanım listesi şöyle
- Lenovo x240
- Asus Eee PC series
- Dell Optiplex 780
- Samsung N150 Plus
- Samsung NP-NC10
- IBM Thinkpad a21p
Build ve çalıştırma yöntemleri
- Çapraz platform ortamında image dosyasını derlemek için Docker, emülasyon için ise QEMU gerekiyor
- Yerel derleme bağımlılıkları platforma göre değişiyor
- MacOS:
i386-elf-gcc,i386-elf-ld,i386-elf-g++ - Linux / WSL Ubuntu:
build-essential,gcc-multilib - GRUB önyükleyici olarak kullanılacaksa
grub2,xorriso,xxdde gerekiyor
- MacOS:
- Linux’ta depo klonlama,
./debian.sh, Git alt modüllerini başlatma,make compile,make img,make qemusırasıyla build ve çalıştırma yapılıyor - MacOS’ta build araçları 32 bit x86 koda bağlı olduğu için şu anda yerel derleme mümkün değil; en basit yöntem Docker
- Windows’ta Docker veya WSL kullanılıyor
- Üç farklı çalıştırma yöntemi bulunuyor
- copy.sh v86 üzerinde
.imgdosyasını sabit disk image’ı olarak yüklemek - QEMU içinde
make qemuveyaqemu-system-i386 <image name>çalıştırmak - Gerçek donanımda
.isodosyasını USB’ye ya da CD’ye yazdırıp GRUB ISO kullanmak
- copy.sh v86 üzerinde
Proje yapısı
- Depo yapısı çekirdek, sürücüler, grafik, ağ, dosya sistemi, kütüphaneler, kullanıcı alanı uygulamaları, testler ve araç dizinlerine ayrılıyor
bootiçinde özel bir önyükleyici vemultiboot.ldbulunuyorkerneliçinde ana çekirdek kaynakları, mimariye özel kodlar ve çekirdek iş parçacığı kodu yer alıyorappsiçinde kullanıcı alanı uygulamaları ilelibcore.a,libgraphic.a,libnet.abulunuyornetiçinde ağ kodu,fsiçinde ise dosya sistemiyle ilgili kodlar vartoolsiçinde build araçları ve betikler yer alıyor
Tamamlanan özellikler ve kalan işler
- Önyükleme ile ilgili öğelerde özel önyükleyici, GRUB uyumluluğu ve Stage 2 önyükleyici tamamlanmış durumda
- Çekirdek ve sistem özellikleri arasında şunlar bulunuyor
- Çok iş parçacıklı preemptive zamanlama
- GDT ve TSS tabanlı çekirdek/kullanıcı alanı ayrımı
- Kesme işleme
- IPC
- Sistem çağrıları
- Kullanıcı alanı iş parçacıkları
- Sürücü ve donanım tarafında PS/2 klavye/fare, PIT, VESA
640x480x8, RTC, Serial, E1000 ve PCI desteği bulunuyor - Dosya sistemi ve depolama tarafında ATA IDE sürücüsü, Ext2 benzeri dosya sistemi, FAT16 ile okuma-yazma tamamlanmış durumda
- FAT16 en fazla 32MB dosya destekliyor
- Atapi henüz tamamlanmamış
- Bellek özellikleri arasında 32 bit sanal bellek, çekirdek
kalloc/kfree, kullanıcı alanımalloc/freebulunuyor - Grafik tarafında pencere yöneticisi, GFXLib, çift framebuffer render, fare olayları, dinamik yeniden boyutlandırma, tam ekran ve widget kütüphanesi yer alıyor
- Custom HTML to Widgets henüz tamamlanmamış
- Ağ yığınında Ethernet, IP, ARP, UDP, Socket API, Loopback arayüzü, DHCP, DNS, TCP ve netcat tarzı komutlar tamamlanmış
- Webserver, FTP, IRC, SSH, Telnet, HTTP, HTML henüz tamamlanmamış
- Uygulama ve araçlar arasında terminal, pencere sunucusu, süreç bilgisi, Finder, C derleyicisi/bytecode yorumlayıcısı, bytecode çalıştırmak için özel VM, sözdizimi vurgulamalı düzenleyici, hesap makinesi, 3D oyun, metin modunda Snake oyunu, TCP uzak sanal terminal ve LZ sıkıştırma kütüphanesi bulunuyor
- Önerilen özelliklerin ve bilinen sorunların tam listesi open issues sayfasında yer alıyor
Lisans ve proje bağlantısı
- RetrOS-32 MIT License ile dağıtılıyor
- Proje bağlantısı https://github.com/joexbayer/RetrOS-32
1 yorum
Hacker News yorumları
Böyle projeler, sıkıcı yapay zeka işlerinden çok daha hoş görünüyor. Satılacak bir şey olmayabilir ama bir mühendisin yeteneğini yaratıcı biçimde ortaya koyması demek
Gençliğimin sonlarında hobi amaçlı OS geliştirmeyi epey çalışmıştım; gerçekten harikaydı, şimdi de ara sıra küçük çekirdekler yapıyorum. En son yaptığım şey, partnerime mesaj yazdıran küçük bir RISC-V çekirdeği idi
Temel sistem yazı tipinin daha dar bir varyant olmasını isterdim. O zaman sistem çok daha şık görünürdü; ayrıca harflerin yatayda daha fazla alana ihtiyaç duyduğu yerler de epey var
Her harfin genişliğini azaltıp harfler arası boşluğu da mümkün olduğunca daraltmak lazım. Şu anki yazı tipi boyutu ve çözünürlükte 1 piksellik boşluk yeterli görünüyor
Yazı tipi sistemini pek bilmiyorum ama sabit genişlikli bitmap yazı tipi olduğunu varsaydım. Kod tabanında bunu değiştirmek çok zorsa kafaya takmaya gerek yok
Ben de bir süredir bir web OS sitesini sıfırdan yapıyorum; yakın zamanda tüm yazı tipi sınıflarını baştan yazdığım için bu özellikle gözüme çarptı
Düzgün yazı tipi render etme işine de baktım, yapılacaklar listesinde var ama sürekli erteliyorum
“Bir işletim sistemi yaptım!”
“Hmm, yazı tipi pek iyi değil.”
Bu tam HN zirvesi gibi
Harika. Bugün yeniden başlasan neyi farklı yapardın merak ediyorum
Düşük seviye kısımlar için hangi dilin uygun olduğunu düşündüğünü de merak ediyorum. C'de mi kalırdın, sade bir C++ alt kümesi mi kullanırdın, yoksa daha yeni bir dili mi düşünürdün gibi
Ortada çok fazla kaynak varken, başkalarının kodunu kopyalamak yerine projeyi nasıl ilginç tutmaya devam ettiğini de merak ediyorum
UNIX bağımlılığını da azaltmaya çalışırdım muhtemelen
Dil olarak C'yi seviyorum; temel sözdizimi ve doğrudan özüne inen tarzı yüzünden. Kullanıcı alanı uygulamaları için başka diller de düşünülebilir
Başından beri her şeyi kendim yazmak istiyordum ve yazılım port etmemek projenin özündeydi. Genel olarak “kodu değil, fikri kopyala” kuralına bağlı kaldım
1977'de Commodore PET 2001 kullanan biri olarak bakınca bu gerçekten harika. KolibriOS ve MenuetOSx64 ile uğraşıyordum; şimdi kendim bir OS yapmayı denemek istiyorum. Bunu başarmış olman müthiş
Proje gerçekten etkileyici, tebrik etmek isterim. Gençliğimden beri OS geliştirmeyi severim; böyle bir sonucun gerçekten hayata geçtiğini görmek güzel
Grafik alt sisteminin nasıl başlatıldığını da biraz merak ediyorum. Umarım iyi gider
https://github.com/joexbayer/RetrOS-32/blob/development/grap...
https://github.com/joexbayer/RetrOS-32/blob/development/grap...
Ben de böyle bir tutku projesine zaman ayırabilsem keşke
Kullanışlılığı unut, pazara giriş stratejisini unut, ürün-pazar uyumunu unut; sadece yap ve öğren
Bunlardan biri oyuncak bir OS'ydi ama düşük seviye OS geliştirmenin gerçek işim hâline gelmesiyle o proje durdu
Bu alanda onlarca yıldır bulunuyorum ve OS geliştirmeyi öğrenmeye çalışıyorum. FASM, NASM, FASM-G hakkında belli bir bilgim var
Ama OS'nin ikili seviyede gerçekten nasıl çalıştığını anlamak için assembler programlarının çıktısını incelemek istiyorum
Belirli bir mimarinin opcode'larını öğrenip öğrenmediğini, aygıt sürücüsü programlarını nasıl yaptığını ve kendi OS'ini geliştirmenin aşamalarını özetleyip özetleyemeyeceğini merak ediyorum
Birkaç eğitim de var ama çoğunda hatalar bulunuyor ve iş, fiilen onların OS'ini yeniden yapmak gibi bir şeye dönüşebiliyor
Opcode'lara o kadar derin dalmadım; yalnızca C derleyicisini yaparken bakmıştım, bu yüzden sadece en yaygın temel komutları biliyorum
https://forum.osdev.org/
https://wiki.osdev.org/Expanded_Main_Page
Gerçekten harika. Uygulama seviyesinden çok bilgisayarın kendisiyle uğraşılan o erken dönem bilişim ruhunun daha fazla geri dönmesini isterdim
Uzun vadeli bir hobi projesi olarak kişisel bir bilgisayar yapmayı düşünüyordum. Tüm yazılım yığınını kendim üretmek ve sisteme giren her bitin kaynağını bilmek istiyorum
Donanımı aynı düzeyde kontrol etmek daha zor olurdu; ancak FPGA ile her şeyi çalıştıracak yeterli performans alınabiliyorsa mümkün olabilir. Ama en azından yazılım tarafı yapılabilir gibi görünüyor
Şimdiye kadar bu bana gerçek dışı geliyordu ama bunun mümkün olduğunu göstermişsin. Görünüşe göre hobi amaçlı bir C derleyicisi de geliştiriyorsun: https://github.com/joexbayer/C-Compiler
C derleyicisi bu OS için yapıldı ve OS içinde çalışıyor. Proje fazla büyüdüğü için onu OS deposundan ayırmak istedim; özellikle de Linux'ta da çalıştığı için
Bu derleyicinin işletim sistemiyle nasıl etkileşime girdiğini biraz daha anlatman güzel olurdu. Özellikle struct gibi özellikleri nasıl ele aldığını, bu alandaki mevcut sınırlamaları ve planlanan iyileştirmeleri merak ediyorum
Struct'ları, boyutu üyelerine göre belirlenen bellek alanları olarak ele alıyor; üye erişimi de o alan içindeki offset'ler üzerinden yapılıyor
Şu an sadece int ve char var, switch ifadesi de yok; yani kısıtlar epey fazla. Standart C'den en büyük farklar, struct içinde fonksiyonlara izin verilmesi ve struct fonksiyonuysa struct'ın fonksiyona örtük olarak geçirilmesi. Daha ayrıntılı bilgi burada:
https://github.com/joexbayer/C-Compiler
Burada gördüğüm tutku projeleri arasında uzun zamandır en etkileyicilerden biri bu. Neden kendi C derleyicini kullanmaya karar verdiğini merak ediyorum