HN’de: Sıfırdan yazılmış Unix benzeri işletim sistemi Banan-OS
(github.com/Bananymous)- Banan-OS, C++ ile yazılmış bir hobi işletim sistemi ve şu anda x86_64 ile i686 mimarilerini destekliyor
- Özellik kapsamı; Ring3 kullanıcı alanı, SMP, ağ yığını, ELF yükleme·dinamik bağlama, copy-on-write bellek ve temel bir grafik ortamına kadar uzanıyor
- Sürücüler ve sistem özellikleri; NVMe·ATA diskler, E1000/E1000E ve RTL serisi NIC’ler, PS2·USB giriş, Ext2·FAT dosya sistemleri, GRUB ve kendi BIOS önyükleyicisini destekliyor
- TCP, kısmen uygulanmış ve hatalı olarak işaretlenmiş; SSL, virtio aygıtları, bazı USB denetleyicileri, Sys·9P dosya sistemleri ve kendi UEFI önyükleyicisi ise henüz uygulanmamış
- Derleme süreci
./bosbetiği etrafında ilerliyor; araç zinciri oluşturulduktan sonra QEMU·Bochs çalıştırma, çekirdek·imaj derleme ve mimari·önyükleyici·UEFI·initrd seçeneklerini seçme mümkün
Banan-OS genel bakış
- Banan-OS, C++ ile yazılmış bir hobi işletim sistemi
- Şu anda desteklenen mimariler x86_64 ve i686
- Canlı demo bananymous.com/banan-os adresinde sunuluyor
- DOOM’u çalıştırmak için
start-guikomutuyla GUI ortamına girip ardından GUI terminalindedoomçalıştırmak gerekiyor
Uygulanmış başlıca özellikler
- Genel özellikler
-
Ring3 kullanıcı alanı
- SMP, yani çoklu işlem
- VESA ve GOP tabanlı doğrusal framebuffer
- Ağ yığını
- ELF çalıştırılabilir dosya yükleme
- Kısmi AML yorumlayıcısı
- Temel grafik ortamı
- Terminal emülatörü
- Durum çubuğu
- Program başlatıcı
- “Düzgün uygulamalar” henüz uygulanmamış
- ELF dinamik bağlama
- copy-on-write bellek
- Dosya eşleme uygulanmış
- Anonim eşleme uygulanmamış
-
Sürücü·ağ·dosya sistemi desteği
- Sürücüler
- NVMe diskleri ile ATA IDE/SATA diskleri destekliyor
- E1000, E1000E, RTL8111/8168/8211/8411 NIC’leri destekliyor
- PS2 klavye tüm scancode set’lerini destekliyor, PS2 fare de destekleniyor
- USB tarafında xHCI, klavye, fare, yığın depolama aygıtları ve hub desteği var
- EHCI, OHCI, UHCI, virtio ağ·depolama aygıtları uygulanmamış
- Ağ
- ARP, ICMP, IPv4, UDP destekleniyor
-
TCP kısmen uygulanmış ve hatalı
- Unix domain socket desteği var
- SSL uygulanmamış
- Dosya sistemi
- Sanal dosya sistemi, Ext2, FAT12/16/32, Dev, Ram, Proc destekleniyor
- Sys ve 9P uygulanmamış
- Önyükleyici
- GRUB ve kendi BIOS önyükleyicisi destekleniyor
- Kendi UEFI önyükleyicisi henüz uygulanmamış
Kod yapısı
- Her ana bileşen ve kütüphane;
kernel,userspace,libcgibi ayrı alt dizinlere sahip - Her dizinde, bileşenin tüm başlık dosyalarını barındıran bir
includedizini bulunuyor - Tüm başlıklar mutlak yol ile include ediliyor
Derleme ve çalıştırma
- Ubuntu 22.04 için
aptpaketleriylebuild-essential,git,ninja-build,texinfo,bison,flex,libgmp-dev,libmpfr-dev,libmpc-dev,parted,qemu-system-x86,cpu-checkergerekiyor pacmanortamındabase-devel,git,wget,cmake,ninja,parted,qemu-system-x86gerekiyor- İşletim sistemi için araç zinciri yalnızca bir kez
./bos toolchainile derleniyor- binutils ve gcc derlendiği için bu işlem uzun sürebilir
- OS’nin kendisini derleme ve çalıştırma
./boskomutuyla yapılıyor./bos qemu./bos qemu-nographic./bos qemu-debug./bos bochs
- Yalnızca çekirdek veya disk imajı da derlenebilir
./bos kernel./bos image
- Disk imajı oluşturma·değiştirme için root yetkisi gerekiyor
Derleme seçenekleri ve imaj yönetimi
- Farklı bir mimari için derlemek üzere
BANAN_ARCHortam değişkeni ayarlanıyor- Örnek:
BANAN_ARCH=i686
- Örnek:
- Önyükleyiciyi değiştirmek için
BANAN_BOOTLOADERortam değişkeni ayarlanıyor- Desteklenen değerler
BANANveGRUB
- Desteklenen değerler
- UEFI ile çalıştırmak için
BANAN_UEFI_BOOT=1ayarlanmalıOVMF_PATHde doğru OVMF yoluna ayarlanmalı; varsayılan değer/usr/share/ovmf/x64/OVMF.fd
- Fiziksel root dosya sistemi olmadan initrd imajı oluşturmak için
BANAN_INITRD=1ayarlanıyor- Desteklenmeyen USB denetleyicisine sahip donanımlarda test için kullanılabilir
- Disk imajı bozulduysa veya yeni bir imaj oluşturmak isteniyorsa
build/banan-os.imgsilinebilir ya da./bos image-fullçalıştırılabilir - zsh için shell completion betiği de sağlanıyor
_script/shell-completion/zsh/_bosdosyasını/usr/share/zsh/site-functions/dizinine kopyalayabilir veya_script/shell-completion/zshyolunu.zshrciçindekifpathe ekleyebilirsiniz
Katkı yöntemi
- Upstream, GitHub’da değil
https://git.bananymous.com/Bananymous/banan-osüzerinde barındırılıyor - GitHub PR gönderilebilir, ancak maintainer’ın diff’i indirip elle uygulaması gerekiyor
- Ayrı bir git sunucusu hesabı da alınabiliyor; bunun için e-posta veya Discord üzerinden iletişime geçmek gerekiyor
- Yeni özellik eklemeden önce önce maintainer ile iletişime geçilmesi tercih ediliyor
- Bu bir öğrenme amaçlı proje olduğu için, maintainer’ın kendisinin yapmayı planladığı bir özelliği önceden sormadan PR olarak göndermek kapatılabilir
- Hata düzeltmeleri her zaman memnuniyetle karşılanıyor
- Commit mesajlarının ilk satırı
Subject: Descriptionbiçiminde yazılmalıSubject,Kernel,Shell,BuildSystemgibi değişiklik alanını göstermeli- İlk satır 72 karakter içinde kalmalı
- Gövde kısmı, değişikliği ve nedenini ek olarak açıklamalı
- Tüm commit’ler
.pre-commit-config.yamliçinde tanımlı pre-commit hook kontrollerinden geçmeli
1 yorum
Hacker News yorumları
Gerçekten harika, adını da beğendim. Şimdiye kadar uyguladıkların arasında en zor kısım neydi, yolda ciddi engellerle karşılaştın mı merak ediyorum
ACPI spesifikasyonu çok kötü yazıldığı için AML yorumlayıcısı zordu; USB ise spesifikasyon hacmi büyük ve çok fazla çapraz referans içerdiği için zorladı
Büyük bir engel yoktu ama bazı özelliklerden vazgeçip bir iki ay sonra geri dönüp devam ettiğim oldu
Gerçekten harika. Özellikle USB sürücüsünü sıfırdan uygulamış olman etkileyici. Bu arada
cat doom1.wadyazıp bozmayı denedimYeni bir işletim sistemi çekirdeği duyurusunda geleneksel olarak bulunması gereken bir cümle vardır; bu duyuruda o cümle eksik
Harika. Bu projeye haftada yaklaşık kaç saat ayırdığını merak ediyorum. Harcanan emek epey fazla görünüyor
Profilinde öğrenci yazıyor; bunun üniversite öğrencisi anlamına gelip gelmediğini, öyleyse bu OS ile derslerinin bir parçası olarak da doğrudan ilgilenip ilgilenmediğini merak ediyorum
Bunun dışında bu proje doğrudan eğitimimin parçası değil. Ancak bu proje sayesinde üniversitenin gömülü sistemler tarafında yarı zamanlı bir iş de buldum
Ayırdığım zaman, o sırada hayatımda neler olduğuna göre gerçekten çok değişiyor. Bazı aylar toplam sadece 5 saat ayırdım, bazı haftalar ise neredeyse 40 saate yaklaştı
Güzel proje. Bir fork adı olarak PlatanOS da iyi olabilir
Çok iyi ve epey emek harcanmış görünüyor. Özellikle aklında kalan zorluklar nelerdi merak ediyorum
Müthiş. Geliştirmeyi nasıl yaptığını merak ediyorum. VM'de mi çalıştırıyorsun, gerçek donanımda mı; oturup çalışmaya başladığında süreç nasıl ilerliyor bilmek isterim
Bunu yaparken çok şey öğrenmişsindir; notları veya geliştirme takibini nasıl yaptığını da merak ediyorum. Yoksa OS'nin kendisi yaşayan bir geliştirme günlüğü gibi mi?
Gerçek bare metal üzerinde çalıştığını görmek her zaman harika; ayrıca bare metal, VM kadar hoşgörülü değil
Genelde eklemek istediğim özelliğe karar veriyorum, sonra ilgili spesifikasyonu kabaca gözden geçiriyorum ve bazen mevcut işletim sistemlerinin bunu nasıl ele aldığına da bakıyorum. Sistemin neye ihtiyaç duyduğuna dair kafamda bir model oluşturduktan sonra, o anda aklıma geldiği gibi kod yazıyorum
Dokümantasyon veya not tutmama gibi gerçekten kötü bir alışkanlığım var. Temelde her şeyi kafamda tutuyorum ve daha sonra o bilgiye ihtiyaç duyduğumda unutmuş oluyorum. Daha karmaşık şeyler için diyagram çizip not aldığım oluyor ama bunları neredeyse sadece yerelde saklıyorum
NVMe, ATA, Realtek NIC gibi sürücüleri yazmaya tam olarak nereden başlanır merak ediyorum. Fare ve klavyenin standart HID kullandığını biliyorum ama diğer aygıtlarda da benzer standart protokoller var mı?
Linux'un çoğu durumda “sürücü kurulumu”ndan kaçınabilmesinin nedeni bu mu; standart aygıt API'leri varsa Windows neden bir şey taktığında her seferinde sürücü kurulum sürecinden geçiyor, onu da merak ediyorum
Sürücüsünü yazdığım aygıtların hepsinin spesifikasyonları ücretsiz olarak herkese açıktı. Örneğin NVMe için https://nvmexpress.org/specifications adresinde
Linux veya Windows'un sürücüleri nasıl ele aldığını çok iyi bilmiyorum. Linux çekirdeğini derlerken hangi sürücülerin çekirdeğe dahil edileceğini, hangilerinin modül olarak bırakılacağını belirlersiniz. Genellikle yaygın sürücüler çekirdekle birlikte derlendiği için sonradan kurmak pek gerekmez; sadece sürücü modülünü yüklemek yeterlidir
Ayrıca genel amaçlı sürücüyle çalışan ama özel sürücüsü olursa daha fazla özellik sunan aygıtlar da var. Örneğin oyuncu faresinin LED ayarları gibi. Windows muhtemelen bu tür isteğe bağlı sürücüleri kuruyor
Çok güzel bir yan proje. Benzer bir şeyi denemek isteyen biri için nereden başlanacağı, hangi kaynakların iyi olduğu gibi ipuçların var mı merak ediyorum
Harika. Böyle bir özellik seti beklemiyordum. İleride daha fazla yazılım port etmeyi planlıyor musun?
Yerelde henüz çalışmayan birkaç port var.
git,binutils,gcc,makehepsi derleniyor ama garip hatalar veriyor. Muhtemelen benimlibcveya sistem çağrıları tarafındaki bir bug'dan kaynaklanıyor