2 पॉइंट द्वारा GN⁺ 2024-12-06 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • 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 मुख्य रूप से ./bos script के इर्द-गिर्द होता है; 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-gui command से GUI environment में जाएँ और फिर GUI terminal में doom run करें

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 रखने वाली include directory होती है
  • सभी headers absolute path से include किए जाते हैं

Build और run

  • Ubuntu 22.04 के लिए apt packages में build-essential, git, ninja-build, texinfo, bison, flex, libgmp-dev, libmpfr-dev, libmpc-dev, parted, qemu-system-x86, cpu-checker चाहिए
  • pacman environment में base-devel, git, wget, cmake, ninja, parted, qemu-system-x86 चाहिए
  • Operating system के लिए toolchain सिर्फ एक बार ./bos toolchain से build किया जाता है
    • यह binutils और gcc compile करता है, इसलिए इसमें समय लग सकता है
  • OS को build और run करना ./bos command से किया जाता है
    • ./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_ARCH environment variable set करें
    • उदाहरण: BANAN_ARCH=i686
  • Bootloader बदलने के लिए BANAN_BOOTLOADER environment variable set करें
    • Supported values BANAN और GRUB हैं
  • UEFI से run करने के लिए BANAN_UEFI_BOOT=1 set करना होगा
    • OVMF_PATH को भी सही OVMF path पर set करना होगा; default /usr/share/ovmf/x64/OVMF.fd है
  • Physical root filesystem के बिना initrd image बनाने के लिए BANAN_INITRD=1 set करें
    • इसे unsupported USB controller वाले hardware पर test करते समय इस्तेमाल किया जा सकता है
  • अगर disk image corrupt हो गई हो या नई image बनानी हो, तो build/banan-os.img delete करें या ./bos image-full run करें
  • zsh के लिए shell completion script भी दी गई है
    • _script/shell-completion/zsh/_bos file को /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: Description format में लिखनी चाहिए
    • Subject बदलाव के area को दिखाता है, जैसे Kernel, Shell, BuildSystem
    • पहली line 72 characters के अंदर होनी चाहिए
    • Body में changes और उनके कारण की अतिरिक्त व्याख्या होनी चाहिए
  • सभी commits को .pre-commit-config.yaml में defined pre-commit hook pass करना होगा

1 टिप्पणियां

 
GN⁺ 2024-12-06
Hacker News की राय
  • वाकई शानदार, और नाम भी पसंद आया। अब तक लागू की गई चीज़ों में सबसे मुश्किल हिस्सा क्या था, और क्या बीच में कोई गंभीर रुकावटें भी आईं?

    • कोई हिस्सा हद से ज़्यादा मुश्किल नहीं था, लेकिन अगर चुनना हो तो शायद AML interpreter या USB stack होगा
      ACPI specification इतनी बुरी तरह लिखी हुई है कि AML interpreter मुश्किल था, और USB इसलिए कठिन था क्योंकि specification बहुत बड़ी है और उसमें cross-references बहुत हैं
      बड़ी रुकावटें तो नहीं आईं, लेकिन कुछ features ऐसे थे जिन्हें छोड़ दिया और फिर एक-दो महीने बाद वापस आकर आगे बढ़ाया
    • शुरुआत में मैं इसे “banyan tree” पढ़ रहा था, फिर ASCII art देखकर ही समझ आया कि यह banana reference है
  • वाकई शानदार। खासकर USB driver को scratch से implement करना कमाल है। वैसे मैंने cat doom1.wad डालकर इसे तोड़ने की कोशिश की

    • धन्यवाद। TTY में लिखे जाने वाले data पर serialization handling लगभग नहीं है, इसलिए arbitrary binary data खिलाने पर यह टूट सकता है :D
  • नए operating system kernel की announcement में परंपरा के तौर पर एक वाक्य होना चाहिए, लेकिन इस announcement में वह वाक्य नहीं है

    • ज़रूर तुम “यह एक hobby project है और GNU जितना बड़ा और professional नहीं होगा” वाला वाक्य कह रहे होगे?
  • बढ़िया। जानना चाहूँगा कि आप इस project पर हफ्ते में लगभग कितने घंटे लगाते हैं। इसमें काफी काम लगा हुआ दिखता है
    profile में student लिखा है—क्या इसका मतलब college student है? अगर हाँ, तो क्या पढ़ाई के हिस्से के रूप में भी आपने इस OS पर सीधे काम किया?

    • हाँ, college student हूँ। मैंने project अपने professor को दिखाया, जिससे operating systems या concurrency जैसे कुछ courses “skip” कर पाया
      उसके अलावा यह project सीधे मेरी पढ़ाई में शामिल नहीं है। हालांकि इसी project की वजह से मुझे university के embedded side में part-time काम भी मिला
      लगाए गए घंटे इस पर बहुत निर्भर करते हैं कि उस समय जिंदगी में क्या चल रहा है। किसी महीने कुल 5 घंटे ही लगाए, और किसी हफ्ते लगभग 40 घंटे तक काम किया
  • बढ़िया project है। fork के नाम के लिए PlatanOS भी ठीक रहेगा

    • पहले syllable पर stress के साथ PlátanOS अच्छा लगेगा
  • बहुत अच्छा है और काम की मात्रा काफी लगती है। खास तौर पर याद रहने वाली challenges क्या थीं?

    • सबसे बड़ी challenge शायद बड़ी specifications पढ़ना था। पहले मैंने ऐसा काम ठीक से नहीं किया था, इसलिए इसकी आदत डालने में समय लगा
  • जबरदस्त। जानना चाहूँगा कि development कैसे करते हैं। VM में चलाते हैं या real hardware पर? बैठकर काम शुरू करने पर process कैसे आगे बढ़ता है?
    यह करते हुए आपने बहुत सीखा होगा—notes या development tracking कैसे करते हैं? या क्या OS खुद ही एक live development log जैसा है?

    • लगभग 95% testing VM में करता हूँ। यह काफी तेज और ज्यादा सुविधाजनक है। फिर भी real hardware पर भी नियमित रूप से test करता हूँ
      असली 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 से क्यों गुजरता है?

    • basically common devices में से लगभग सबके protocols standardized होते हैं। हालांकि कुछ devices ऐसे भी होते हैं जिनके लिए manufacturer को driver देना पड़ता है
      जिन 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 हैं?

    • लगभग वही जो दूसरों ने कहा। https://wiki.osdev.org/Getting_Started पढ़ना अच्छा रहेगा, और अगर operating system develop करने का फैसला करें तो यह ध्यान रखें कि इसमें बहुत समय लगता है
    • practical knowledge के लिए OSDev Wiki, और theory के लिए operating system design और computer architecture की books देखें
    • Rust के लिए https://os.phil-opp.com/ है, और general operating system development के लिए https://github.com/tuhdo/os01 है। और Operating Systems: Three Easy Pieces जरूर पढ़नी चाहिए
  • शानदार। ऐसे feature set की उम्मीद नहीं थी। आगे और software port करने का plan है?

    • और port करने का plan है। मैं base OS में third-party code नहीं डालना चाहता, लेकिन ports उन चीज़ों को चलाने का बहुत अच्छा तरीका हैं जिन्हें मैंने अभी खुद नहीं लिखा है
      local में कुछ ports हैं जो अभी काम नहीं कर रहे। git, binutils, gcc, make सभी compile हो जाते हैं, लेकिन अजीब errors दे रहे हैं। शायद मेरे libc या system calls में bugs होने की संभावना ज्यादा है