2 puan yazan GN⁺ 2024-12-06 | 1 yorum | WhatsApp'ta paylaş
  • 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 ./bos betiğ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-gui komutuyla GUI ortamına girip ardından GUI terminalinde doom ç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ış
    • 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, libc gibi ayrı alt dizinlere sahip
  • Her dizinde, bileşenin tüm başlık dosyalarını barındıran bir include dizini bulunuyor
  • Tüm başlıklar mutlak yol ile include ediliyor

Derleme ve çalıştırma

  • Ubuntu 22.04 için apt paketleriyle build-essential, git, ninja-build, texinfo, bison, flex, libgmp-dev, libmpfr-dev, libmpc-dev, parted, qemu-system-x86, cpu-checker gerekiyor
  • pacman ortamında base-devel, git, wget, cmake, ninja, parted, qemu-system-x86 gerekiyor
  • İşletim sistemi için araç zinciri yalnızca bir kez ./bos toolchain ile derleniyor
    • binutils ve gcc derlendiği için bu işlem uzun sürebilir
  • OS’nin kendisini derleme ve çalıştırma ./bos komutuyla 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_ARCH ortam değişkeni ayarlanıyor
    • Örnek: BANAN_ARCH=i686
  • Önyükleyiciyi değiştirmek için BANAN_BOOTLOADER ortam değişkeni ayarlanıyor
    • Desteklenen değerler BANAN ve GRUB
  • UEFI ile çalıştırmak için BANAN_UEFI_BOOT=1 ayarlanmalı
    • OVMF_PATH de 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=1 ayarlanı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.img silinebilir ya da ./bos image-full çalıştırılabilir
  • zsh için shell completion betiği de sağlanıyor
    • _script/shell-completion/zsh/_bos dosyasını /usr/share/zsh/site-functions/ dizinine kopyalayabilir veya _script/shell-completion/zsh yolunu .zshrc içindeki fpathe 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: Description biçiminde yazılmalı
    • Subject, Kernel, Shell, BuildSystem gibi 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.yaml içinde tanımlı pre-commit hook kontrollerinden geçmeli

1 yorum

 
GN⁺ 2024-12-06
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

    • Aşırı zor bir kısım yoktu ama seçecek olsam AML yorumlayıcısı ya da USB stack derdim
      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
    • İlk başta “banyan tree” diye okuyordum; ASCII art'ı görünce ancak bunun muz referansı olduğunu fark ettim
  • Gerçekten harika. Özellikle USB sürücüsünü sıfırdan uygulamış olman etkileyici. Bu arada cat doom1.wad yazıp bozmayı denedim

    • Teşekkürler. TTY'ye yazılan verilerde neredeyse hiç serileştirme işlemi yok, bu yüzden rastgele ikili veri verirsen bozulabilir :D
  • Yeni bir işletim sistemi çekirdeği duyurusunda geleneksel olarak bulunması gereken bir cümle vardır; bu duyuruda o cümle eksik

    • Belli ki “bu bir hobi projesi ve GNU kadar büyük ve profesyonel olmayacak” cümlesinden bahsediyorsun, değil mi?
  • 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

    • Evet, üniversite öğrencisiyim. Projeyi hocama göstererek işletim sistemleri veya eşzamanlılık gibi bazı dersleri “atlayabildim”
      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

    • Vurgusu ilk hecede olan PlátanOS daha iyi olur
  • Çok iyi ve epey emek harcanmış görünüyor. Özellikle aklında kalan zorluklar nelerdi merak ediyorum

    • Sanırım en büyük zorluk büyük spesifikasyon belgelerini okumaktı. Daha önce böyle bir şeyi doğru düzgün yapmamıştım, alışmam zaman aldı
  • 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?

    • Testlerin yaklaşık %95'ini VM üzerinde yapıyorum. Çok daha hızlı ve çok daha rahat. Yine de gerçek donanımda da düzenli olarak test ediyorum
      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

    • Temelde yaygın kullanılan aygıtların neredeyse tamamının protokolü standartlaştırılmış durumda. Ancak üreticinin sürücü sağlaması gereken aygıtlar da var
      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

    • Başkalarının söyledikleriyle hemen hemen aynı. https://wiki.osdev.org/Getting_Started sayfasını okuman iyi olur; ayrıca bir işletim sistemi geliştirmeye karar verirsen bunun çok zaman alacağını aklında tutmalısın
    • Pratik bilgi için OSDev Wiki, teori için işletim sistemi tasarımı ve bilgisayar mimarisi kitaplarına bakılabilir
    • Rust için https://os.phil-opp.com/ var; genel işletim sistemi geliştirme için de https://github.com/tuhdo/os01 var. Ayrıca Operating Systems: Three Easy Pieces kesinlikle okunmalı
  • Harika. Böyle bir özellik seti beklemiyordum. İleride daha fazla yazılım port etmeyi planlıyor musun?

    • Daha fazlasını port etme planım var. Temel OS'ye üçüncü taraf kod koymak istemiyorum ama port'lar, henüz kendim yazmadığım şeyleri çalıştırabilmek için çok iyi bir yol
      Yerelde henüz çalışmayan birkaç port var. git, binutils, gcc, make hepsi derleniyor ama garip hatalar veriyor. Muhtemelen benim libc veya sistem çağrıları tarafındaki bir bug'dan kaynaklanıyor