- 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 jalankandoomdari 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, danlibc - Setiap direktori memiliki direktori
includeyang berisi semua file header komponen tersebut - Semua header di-include menggunakan jalur absolut
Build dan menjalankan
- Pada Ubuntu 22.04, paket
aptyang dibutuhkan adalahbuild-essential,git,ninja-build,texinfo,bison,flex,libgmp-dev,libmpfr-dev,libmpc-dev,parted,qemu-system-x86,cpu-checker - Pada lingkungan
pacman, yang dibutuhkan adalahbase-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
- Contoh:
- Untuk mengganti bootloader, atur variabel lingkungan
BANAN_BOOTLOADER- Nilai yang didukung adalah
BANANdanGRUB
- Nilai yang didukung adalah
- Untuk menjalankan dengan UEFI, harus mengatur
BANAN_UEFI_BOOT=1OVMF_PATHjuga 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.imgatau jalankan./bos image-full - Skrip shell completion untuk zsh juga disediakan
- Salin file
_script/shell-completion/zsh/_boske/usr/share/zsh/site-functions/, atau tambahkan_script/shell-completion/zshkefpathdi.zshrc
- Salin file
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: DescriptionSubjectmenunjukkan area perubahan sepertiKernel,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
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?
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.
Benar-benar keren. Terutama hebat karena mengimplementasikan driver USB dari nol. Sebagai catatan, saya mencoba merusaknya dengan mengetik
cat doom1.wad.Dalam pengumuman kernel sistem operasi baru, biasanya ada kalimat yang secara tradisi harus disertakan, tetapi pengumuman ini tidak memuatnya.
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?
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.
Sangat bagus dan kelihatannya butuh banyak pekerjaan. Saya penasaran tantangan apa yang paling berkesan?
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?
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?
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?
Hebat. Saya tidak menyangka komposisi fiturnya seperti ini. Saya penasaran apakah ada rencana untuk mem-port lebih banyak software ke depannya?
Secara lokal ada beberapa port yang belum berfungsi.
git,binutils,gcc,makesemuanya bisa dikompilasi, tetapi menghasilkan error aneh. Kemungkinan besar ini bug dilibcsaya atau di sisi system call.