2 poin oleh GN⁺ 2024-12-06 | 1 komentar | Bagikan ke WhatsApp
  • Banan-OS adalah sistem operasi hobi yang ditulis dalam C++ dan saat ini mendukung arsitektur x86_64 dan i686
  • Cakupan fiturnya mencakup ruang pengguna Ring3, SMP, stack jaringan, pemuatan ELF dan dynamic linking, memori copy-on-write, hingga lingkungan grafis dasar
  • Driver dan fitur sistem mendukung disk NVMe·ATA, NIC seri E1000/E1000E dan RTL, input PS2·USB, filesystem Ext2·FAT, GRUB, serta bootloader BIOS buatannya sendiri
  • TCP ditandai sebagai implementasi parsial dan memiliki bug, sementara SSL, perangkat virtio, beberapa kontroler USB, filesystem Sys·9P, dan bootloader UEFI buatannya sendiri masih belum diimplementasikan
  • Proses build berpusat pada skrip ./bos, dan setelah membuat toolchain dapat menjalankan QEMU·Bochs, membangun kernel·image, serta memilih opsi arsitektur·bootloader·UEFI·initrd

Ikhtisar Banan-OS

  • Banan-OS adalah sistem operasi hobi yang ditulis dalam C++
  • Arsitektur yang saat ini didukung adalah x86_64 dan i686
  • Demo langsung tersedia di bananymous.com/banan-os
  • Untuk menjalankan DOOM, masuk ke lingkungan GUI dengan perintah start-gui, lalu jalankan doom dari terminal GUI

Fitur utama yang telah diimplementasikan

  • Fitur umum
    • Ruang pengguna Ring3

      • SMP, yaitu multiprocessing
      • Framebuffer linear berbasis VESA dan GOP
      • Stack jaringan
      • Pemuatan executable ELF
      • Interpreter AML parsial
      • Lingkungan grafis dasar
      • Emulator terminal
      • Bilah status
      • Peluncur program
      • “Aplikasi yang layak” masih belum diimplementasikan
      • Dynamic linking ELF
      • Memori copy-on-write
      • File mapping sudah diimplementasikan
      • Anonymous mapping belum diimplementasikan

Dukungan driver·jaringan·filesystem

  • Driver
    • Mendukung disk NVMe dan disk ATA IDE/SATA
    • Mendukung NIC E1000, E1000E, RTL8111/8168/8211/8411
    • Keyboard PS2 mendukung semua set scancode, dan mouse PS2 juga didukung
    • USB mendukung xHCI, keyboard, mouse, perangkat penyimpanan massal, dan hub
    • EHCI, OHCI, UHCI, serta perangkat jaringan·penyimpanan virtio belum diimplementasikan
  • Jaringan
    • Mendukung ARP, ICMP, IPv4, UDP
    • TCP merupakan implementasi parsial dan memiliki bug

      • Mendukung Unix domain socket
      • SSL belum diimplementasikan
      • Filesystem
      • Mendukung virtual filesystem, Ext2, FAT12/16/32, Dev, Ram, Proc
      • Sys dan 9P belum diimplementasikan
      • Bootloader
      • Mendukung GRUB dan bootloader BIOS buatannya sendiri
      • Bootloader UEFI buatannya sendiri masih belum diimplementasikan

Struktur kode

  • Setiap komponen utama dan library memiliki subdirektori terpisah seperti kernel, userspace, dan libc
  • Setiap direktori memiliki direktori include yang berisi semua file header komponen tersebut
  • Semua header di-include menggunakan jalur absolut

Build dan menjalankan

  • Pada Ubuntu 22.04, paket apt yang dibutuhkan adalah build-essential, git, ninja-build, texinfo, bison, flex, libgmp-dev, libmpfr-dev, libmpc-dev, parted, qemu-system-x86, cpu-checker
  • Pada lingkungan pacman, yang dibutuhkan adalah base-devel, git, wget, cmake, ninja, parted, qemu-system-x86
  • Toolchain untuk sistem operasi cukup dibangun sekali dengan ./bos toolchain
    • Karena akan mengompilasi binutils dan gcc, proses ini bisa memakan waktu lama
  • Build dan menjalankan OS itu sendiri dilakukan dengan perintah ./bos
    • ./bos qemu
    • ./bos qemu-nographic
    • ./bos qemu-debug
    • ./bos bochs
  • Hanya kernel atau image disk juga bisa dibangun
    • ./bos kernel
    • ./bos image
  • Pembuatan·modifikasi image disk memerlukan hak akses root

Opsi build dan pengelolaan image

  • Untuk build ke arsitektur lain, atur variabel lingkungan BANAN_ARCH
    • Contoh: BANAN_ARCH=i686
  • Untuk mengganti bootloader, atur variabel lingkungan BANAN_BOOTLOADER
    • Nilai yang didukung adalah BANAN dan GRUB
  • Untuk menjalankan dengan UEFI, harus mengatur BANAN_UEFI_BOOT=1
    • OVMF_PATH juga harus diatur ke jalur OVMF yang benar, dengan nilai default /usr/share/ovmf/x64/OVMF.fd
  • Untuk membuat image initrd tanpa filesystem root fisik, atur BANAN_INITRD=1
    • Ini dapat digunakan saat menguji pada hardware yang memiliki kontroler USB yang tidak didukung
  • Jika image disk rusak atau ingin membuat image baru, hapus build/banan-os.img atau jalankan ./bos image-full
  • Skrip shell completion untuk zsh juga disediakan
    • Salin file _script/shell-completion/zsh/_bos ke /usr/share/zsh/site-functions/, atau tambahkan _script/shell-completion/zsh ke fpath di .zshrc

Cara berkontribusi

  • Upstream di-host bukan di GitHub, melainkan di https://git.bananymous.com/Bananymous/banan-os
  • PR GitHub juga bisa dikirim, tetapi maintainer harus mengunduh diff lalu menerapkannya secara manual
  • Akun server git terpisah juga bisa diberikan, dan dalam hal ini perlu menghubungi lewat email atau Discord
  • Menambahkan fitur baru sebaiknya dilakukan dengan terlebih dahulu menghubungi maintainer
    • Karena ini adalah proyek untuk tujuan pembelajaran, PR yang menambahkan fitur yang sebenarnya ingin dikerjakan sendiri oleh maintainer bisa ditutup bila dikirim tanpa konsultasi sebelumnya
    • Perbaikan bug selalu disambut
  • Pesan commit harus menulis baris pertama dalam format Subject: Description
    • Subject menunjukkan area perubahan seperti Kernel, Shell, BuildSystem
    • Baris pertama harus muat dalam 72 karakter
    • Isi body harus menjelaskan perubahan dan alasannya lebih lanjut
  • Semua commit harus lolos pre-commit hook yang didefinisikan di .pre-commit-config.yaml

1 komentar

 
GN⁺ 2024-12-06
Komentar Hacker News
  • Benar-benar keren, dan saya juga suka namanya. Saya penasaran, dari semua yang sudah diimplementasikan sejauh ini, bagian paling sulit apa, dan apakah ada hambatan serius di tengah jalan?

    • Tidak ada bagian yang terlalu sulit, tapi kalau harus memilih, mungkin interpreter AML atau stack USB.
      Interpreter AML sulit karena spesifikasi ACPI ditulis dengan sangat berantakan, dan USB berat karena spesifikasinya sangat panjang serta punya banyak rujukan silang.
      Tidak ada hambatan besar, tetapi ada beberapa fitur yang sempat saya tinggalkan lalu saya kembali kerjakan satu atau dua bulan kemudian.
    • Awalnya saya membacanya sebagai “banyan tree”, lalu baru sadar setelah melihat ASCII art bahwa itu adalah referensi ke pisang.
  • Benar-benar keren. Terutama hebat karena mengimplementasikan driver USB dari nol. Sebagai catatan, saya mencoba merusaknya dengan mengetik cat doom1.wad.

    • Terima kasih. Hampir tidak ada penanganan serialisasi untuk data yang ditulis ke TTY, jadi kalau diberi data biner sembarang memang bisa rusak :D
  • Dalam pengumuman kernel sistem operasi baru, biasanya ada kalimat yang secara tradisi harus disertakan, tetapi pengumuman ini tidak memuatnya.

    • Pasti maksudmu kalimat “ini adalah proyek hobi dan tidak akan sebesar serta seprofesional GNU”, kan?
  • Keren. Saya penasaran kira-kira berapa jam per minggu yang kamu habiskan untuk proyek ini. Kelihatannya jumlah pekerjaannya cukup besar.
    Di profil tertulis kamu pelajar/mahasiswa; apakah maksudnya mahasiswa universitas, dan kalau iya apakah kamu juga mengerjakan OS ini secara langsung sebagai bagian dari kuliah?

    • Ya, saya mahasiswa. Saya menunjukkan proyek ini kepada dosen sehingga bisa “melewati” beberapa mata kuliah seperti sistem operasi atau konkurensi.
      Selain itu, proyek ini tidak secara langsung menjadi bagian dari studi saya. Namun berkat proyek ini, saya juga mendapat pekerjaan paruh waktu di bidang embedded di universitas.
      Waktu yang saya curahkan benar-benar berubah-ubah tergantung apa yang sedang terjadi dalam hidup saat itu. Ada bulan ketika totalnya hanya 5 jam, dan ada minggu ketika hampir 40 jam.
  • Proyek yang keren. Untuk nama fork, PlatanOS juga sepertinya bagus.

    • Saya suka PlátanOS dengan penekanan pada suku kata pertama.
  • Sangat bagus dan kelihatannya butuh banyak pekerjaan. Saya penasaran tantangan apa yang paling berkesan?

    • Tantangan terbesar sepertinya adalah membaca spesifikasi yang besar. Sebelumnya saya belum pernah benar-benar melakukan hal seperti itu, jadi butuh waktu untuk terbiasa.
  • Luar biasa. Saya penasaran seperti apa proses pengembangannya. Apakah dijalankan di VM, di hardware sungguhan, dan ketika kamu duduk untuk mulai bekerja, alurnya seperti apa?
    Kamu pasti belajar banyak saat mengerjakannya; saya juga penasaran bagaimana kamu membuat catatan atau melacak pengembangan. Atau mungkin OS itu sendiri semacam jurnal pengembangan yang hidup?

    • Sekitar 95% pengujian saya lakukan di VM. Jauh lebih cepat dan jauh lebih nyaman. Meski begitu, saya juga mengujinya secara rutin di hardware sungguhan.
      Melihatnya berjalan di bare metal sungguhan selalu keren, dan bare metal tidak se-pemaaf VM.
      Biasanya saya menentukan fitur yang ingin ditambahkan, lalu menelusuri spesifikasi terkait secara garis besar, dan kadang melihat bagaimana sistem operasi lain menanganinya. Setelah membentuk model mental tentang apa yang dibutuhkan sistem, saya menulis kode di tempat sesuai yang terlintas.
      Saya punya kebiasaan yang sangat buruk, yaitu tidak menulis dokumentasi atau catatan. Pada dasarnya semuanya saya simpan di kepala, lalu ketika informasi itu dibutuhkan nanti, saya sudah lupa. Untuk hal yang lebih kompleks saya kadang membuat diagram dan menulis catatan, tetapi hampir semuanya hanya disimpan lokal.
  • Saya penasaran sebenarnya dari mana mulai menulis driver seperti NVMe, ATA, dan NIC Realtek. Saya tahu mouse dan keyboard memakai HID yang merupakan standar, tetapi apakah perangkat lain juga punya protokol standar serupa?
    Saya juga penasaran apakah ini alasan Linux dalam banyak kasus bisa menghindari “instal driver”, dan kalau memang ada API perangkat standar, mengapa Windows menjalani proses instalasi driver setiap kali sesuatu dicolokkan?

    • Pada dasarnya, hampir semua perangkat yang umum dipakai protokolnya sudah distandardisasi. Namun ada juga perangkat yang memang perlu disediakan drivernya oleh produsen.
      Semua perangkat yang drivernya saya tulis punya spesifikasi yang tersedia gratis untuk publik. Misalnya NVMe ada di https://nvmexpress.org/specifications.
      Saya tidak terlalu tahu bagaimana Linux atau Windows menangani driver. Saat mengompilasi kernel Linux, kita menentukan driver mana yang disertakan dalam kernel dan mana yang dibiarkan sebagai modul. Biasanya driver yang umum dibangun bersama kernel, sehingga hampir tidak perlu diinstal belakangan; cukup memuat modul drivernya.
      Ada juga perangkat yang bekerja dengan driver generik, tetapi menyediakan lebih banyak fitur jika ada driver khusus. Contohnya pengaturan LED pada mouse gaming. Windows mungkin memasang driver opsional semacam ini.
  • Ini side project yang sangat keren. Saya penasaran apakah ada tips untuk orang yang ingin mencoba hal serupa, misalnya mulai dari mana dan referensi apa yang bagus?

    • Kurang lebih sama seperti yang dikatakan orang lain. Sebaiknya baca https://wiki.osdev.org/Getting_Started, dan kalau memutuskan untuk mengembangkan sistem operasi, ingat bahwa itu memakan banyak waktu.
    • Untuk pengetahuan praktis, lihat OSDev Wiki; untuk teori, baca buku desain sistem operasi dan arsitektur komputer.
    • Untuk Rust ada https://os.phil-opp.com/, dan untuk pengembangan sistem operasi secara umum ada https://github.com/tuhdo/os01. Selain itu, Operating Systems: Three Easy Pieces sangat layak dibaca.
  • Hebat. Saya tidak menyangka komposisi fiturnya seperti ini. Saya penasaran apakah ada rencana untuk mem-port lebih banyak software ke depannya?

    • Ada rencana untuk mem-port lebih banyak. Saya ingin tidak memasukkan kode pihak ketiga ke OS dasarnya, tetapi port adalah cara yang sangat bagus untuk bisa menjalankan hal-hal yang belum saya tulis sendiri.
      Secara lokal ada beberapa port yang belum berfungsi. git, binutils, gcc, make semuanya bisa dikompilasi, tetapi menghasilkan error aneh. Kemungkinan besar ini bug di libc saya atau di sisi system call.