- Banan-OS C++ में लिखा गया एक hobby operating system है, और फिलहाल x86_64 व i686 architectures को support करता है
- इसके features का दायरा Ring3 user space, SMP, network stack, ELF loading और dynamic linking, copy-on-write memory, और basic graphical environment तक शामिल है
- Drivers और system features में NVMe/ATA disks, E1000/E1000E और RTL series NIC, PS2/USB input, Ext2/FAT filesystems, GRUB और इसका अपना BIOS bootloader support शामिल है
- TCP को partial implementation और bugs मौजूद के रूप में चिह्नित किया गया है, और SSL, virtio devices, कुछ USB controllers, Sys/9P filesystems, और इसका अपना UEFI bootloader अभी implement नहीं हैं
- Build मुख्य रूप से
./bosscript के इर्द-गिर्द होता है; toolchain बनाने के बाद QEMU/Bochs run करना, kernel/image build करना, और architecture/bootloader/UEFI/initrd options चुनना संभव है
Banan-OS overview
- Banan-OS C++ में लिखा गया एक hobby operating system है
- फिलहाल supported architectures x86_64 और i686 हैं
- Live demo bananymous.com/banan-os पर उपलब्ध है
- DOOM चलाने के लिए
start-guicommand से GUI environment में जाएँ और फिर GUI terminal मेंdoomrun करें
Implemented key features
- General features
-
Ring3 user space
- SMP, यानी multiprocessing
- VESA और GOP आधारित linear framebuffer
- Network stack
- ELF executable file loading
- Partial AML interpreter
- Basic graphical environment
- Terminal emulator
- Status bar
- Program launcher
- “अच्छे apps” अभी implement नहीं हैं
- ELF dynamic linking
- copy-on-write memory
- File mapping implement है
- Anonymous mapping implement नहीं है
-
Driver, network और filesystem support
- Drivers
- NVMe disks और ATA IDE/SATA disks support करता है
- E1000, E1000E, RTL8111/8168/8211/8411 NIC support करता है
- PS2 keyboard सभी scancode sets को support करता है, और PS2 mouse भी supported है
- USB में xHCI, keyboard, mouse, mass storage devices और hubs support हैं
- EHCI, OHCI, UHCI, virtio network/storage devices implement नहीं हैं
- Network
- ARP, ICMP, IPv4, UDP support करता है
-
TCP partial implementation है और इसमें bugs हैं
- Unix domain socket support करता है
- SSL implement नहीं है
- Filesystem
- Virtual filesystem, Ext2, FAT12/16/32, Dev, Ram, Proc support हैं
- Sys और 9P implement नहीं हैं
- Bootloader
- GRUB और इसका अपना BIOS bootloader support हैं
- इसका अपना UEFI bootloader अभी implement नहीं है
Code structure
- हर major component और library की
kernel,userspace,libcजैसी अलग subdirectory है - हर directory में component की सभी header files रखने वाली
includedirectory होती है - सभी headers absolute path से include किए जाते हैं
Build और run
- Ubuntu 22.04 के लिए
aptpackages मेंbuild-essential,git,ninja-build,texinfo,bison,flex,libgmp-dev,libmpfr-dev,libmpc-dev,parted,qemu-system-x86,cpu-checkerचाहिए pacmanenvironment मेंbase-devel,git,wget,cmake,ninja,parted,qemu-system-x86चाहिए- Operating system के लिए toolchain सिर्फ एक बार
./bos toolchainसे build किया जाता है- यह binutils और gcc compile करता है, इसलिए इसमें समय लग सकता है
- OS को build और run करना
./boscommand से किया जाता है./bos qemu./bos qemu-nographic./bos qemu-debug./bos bochs
- सिर्फ kernel या disk image भी build की जा सकती है
./bos kernel./bos image
- Disk image बनाने/modify करने के लिए root permissions चाहिए
Build options और image management
- दूसरे architecture के लिए build करने हेतु
BANAN_ARCHenvironment variable set करें- उदाहरण:
BANAN_ARCH=i686
- उदाहरण:
- Bootloader बदलने के लिए
BANAN_BOOTLOADERenvironment variable set करें- Supported values
BANANऔरGRUBहैं
- Supported values
- UEFI से run करने के लिए
BANAN_UEFI_BOOT=1set करना होगाOVMF_PATHको भी सही OVMF path पर set करना होगा; default/usr/share/ovmf/x64/OVMF.fdहै
- Physical root filesystem के बिना initrd image बनाने के लिए
BANAN_INITRD=1set करें- इसे unsupported USB controller वाले hardware पर test करते समय इस्तेमाल किया जा सकता है
- अगर disk image corrupt हो गई हो या नई image बनानी हो, तो
build/banan-os.imgdelete करें या./bos image-fullrun करें - zsh के लिए shell completion script भी दी गई है
_script/shell-completion/zsh/_bosfile को/usr/share/zsh/site-functions/में copy करें, या_script/shell-completion/zshको.zshrcकेfpathमें add करें
Contribution process
- Upstream GitHub पर नहीं, बल्कि
https://git.bananymous.com/Bananymous/banan-osपर hosted है - GitHub PR भी भेजे जा सकते हैं, लेकिन maintainer को diff download करके manually apply करना होगा
- अलग git server account भी मिल सकता है; इसके लिए email या Discord से संपर्क करना होगा
- नए features add करने से पहले maintainer से संपर्क करना preferred है
- यह learning-purpose project है, इसलिए अगर maintainer जिस feature को खुद करना चाहता था, उसे बिना पहले पूछे PR के रूप में भेजा गया, तो वह बंद किया जा सकता है
- Bug fixes हमेशा welcome हैं
- Commit message की पहली line
Subject: Descriptionformat में लिखनी चाहिएSubjectबदलाव के area को दिखाता है, जैसेKernel,Shell,BuildSystem- पहली line 72 characters के अंदर होनी चाहिए
- Body में changes और उनके कारण की अतिरिक्त व्याख्या होनी चाहिए
- सभी commits को
.pre-commit-config.yamlमें defined pre-commit hook pass करना होगा
1 टिप्पणियां
Hacker News की राय
वाकई शानदार, और नाम भी पसंद आया। अब तक लागू की गई चीज़ों में सबसे मुश्किल हिस्सा क्या था, और क्या बीच में कोई गंभीर रुकावटें भी आईं?
ACPI specification इतनी बुरी तरह लिखी हुई है कि AML interpreter मुश्किल था, और USB इसलिए कठिन था क्योंकि specification बहुत बड़ी है और उसमें cross-references बहुत हैं
बड़ी रुकावटें तो नहीं आईं, लेकिन कुछ features ऐसे थे जिन्हें छोड़ दिया और फिर एक-दो महीने बाद वापस आकर आगे बढ़ाया
वाकई शानदार। खासकर USB driver को scratch से implement करना कमाल है। वैसे मैंने
cat doom1.wadडालकर इसे तोड़ने की कोशिश कीनए operating system kernel की announcement में परंपरा के तौर पर एक वाक्य होना चाहिए, लेकिन इस announcement में वह वाक्य नहीं है
बढ़िया। जानना चाहूँगा कि आप इस project पर हफ्ते में लगभग कितने घंटे लगाते हैं। इसमें काफी काम लगा हुआ दिखता है
profile में student लिखा है—क्या इसका मतलब college student है? अगर हाँ, तो क्या पढ़ाई के हिस्से के रूप में भी आपने इस OS पर सीधे काम किया?
उसके अलावा यह project सीधे मेरी पढ़ाई में शामिल नहीं है। हालांकि इसी project की वजह से मुझे university के embedded side में part-time काम भी मिला
लगाए गए घंटे इस पर बहुत निर्भर करते हैं कि उस समय जिंदगी में क्या चल रहा है। किसी महीने कुल 5 घंटे ही लगाए, और किसी हफ्ते लगभग 40 घंटे तक काम किया
बढ़िया project है। fork के नाम के लिए PlatanOS भी ठीक रहेगा
बहुत अच्छा है और काम की मात्रा काफी लगती है। खास तौर पर याद रहने वाली challenges क्या थीं?
जबरदस्त। जानना चाहूँगा कि development कैसे करते हैं। VM में चलाते हैं या real hardware पर? बैठकर काम शुरू करने पर process कैसे आगे बढ़ता है?
यह करते हुए आपने बहुत सीखा होगा—notes या development tracking कैसे करते हैं? या क्या OS खुद ही एक live development log जैसा है?
असली bare metal पर चलते देखना हमेशा शानदार होता है, और bare metal VM जितना forgiving नहीं होता
आमतौर पर पहले तय करता हूँ कि कौन-सा feature जोड़ना है, फिर related specification को मोटे तौर पर देखता हूँ, और कभी-कभी यह भी देखता हूँ कि existing operating systems इसे कैसे handle करते हैं। system को क्या चाहिए इसका mental model बनाकर, जो उसी समय दिमाग में आता है वैसा code लिखता हूँ
documents या notes न लिखने की मेरी बहुत खराब आदत है। basically सब कुछ दिमाग में रखता हूँ, और बाद में जब उस information की जरूरत होती है तो भूल जाता हूँ। ज़्यादा complex चीज़ों के लिए diagram बनाता हूँ और notes लिखता हूँ, लेकिन वे लगभग हमेशा local ही रखता हूँ
NVMe, ATA, Realtek NIC जैसे drivers आखिर कहाँ से लिखना शुरू करते हैं? mouse और keyboard standard HID इस्तेमाल करते हैं, यह पता है, लेकिन क्या दूसरे devices के लिए भी ऐसे ही standard protocols होते हैं?
क्या यही वजह है कि Linux ज्यादातर cases में “driver install” से बच जाता है? और अगर standard device API है, तो Windows हर बार कुछ plug करने पर driver installation process से क्यों गुजरता है?
जिन devices के लिए मैंने drivers लिखे, उन सभी की specifications मुफ्त में public थीं। उदाहरण के लिए NVMe यहाँ है: https://nvmexpress.org/specifications
Linux या Windows drivers को कैसे handle करते हैं, यह मुझे ठीक से नहीं पता। Linux kernel compile करते समय आप specify करते हैं कि कौन-से drivers kernel में शामिल करने हैं और कौन-से modules के रूप में रखने हैं। आमतौर पर common drivers kernel के साथ build होते हैं, इसलिए बाद में install करने की जरूरत शायद ही पड़ती है, बस driver module load करना होता है
कुछ devices generic driver से काम करते हैं, लेकिन dedicated driver होने पर ज्यादा features मिलते हैं। जैसे gaming mouse की LED settings। Windows शायद ऐसे optional drivers install करता है
बहुत शानदार side project है। अगर कोई similar चीज़ try करना चाहता हो, तो कहाँ से शुरू करे और कौन-से resources अच्छे रहेंगे—इस पर कोई tips हैं?
शानदार। ऐसे feature set की उम्मीद नहीं थी। आगे और software port करने का plan है?
local में कुछ ports हैं जो अभी काम नहीं कर रहे।
git,binutils,gcc,makeसभी compile हो जाते हैं, लेकिन अजीब errors दे रहे हैं। शायद मेरेlibcया system calls में bugs होने की संभावना ज्यादा है