38 पॉइंट द्वारा GN⁺ 2025-09-16 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • RISC-V आर्किटेक्चर पर time-sharing operating system prototype kernel को लागू करने का अनुभव साझा किया गया है
  • time-sharing kernel की अवधारणा और काम करने के तरीके को प्रैक्टिकल-केंद्रित ढंग से समझाया गया है, और C की जगह Zig का उपयोग करके reproducibility बढ़ाई गई है
  • kernel और user code को एक ही binary में बांधने वाला unikernel दृष्टिकोण अपनाया गया है, और console output व timer control के लिए OpenSBI आधारित layering चुनी गई है
  • thread user mode (U-mode) में चलते हैं, जबकि kernel supervisor mode (S-mode) में timer interrupt के जरिए context switch करता है, और system call के माध्यम से सीमा पार होती है
  • मुख्य तकनीक यह है कि interrupt prologue/epilogue द्वारा बनाए गए stack frame को बदलकर दूसरे thread के register set और CSR को restore किया जाता है, जिससे execution flow बदल जाता है
  • QEMU virtual machine और नवीनतम OpenSBI पर आधारित ऐसा learning environment दिया गया है जिसे कोई भी दोहरा सकता है, और thread·process·container जैसे virtualization spectrum को वैचारिक रूप से जोड़ते हुए यह शिक्षा और अभ्यास के लिए उपयोगी आधार सामग्री बनता है

अवलोकन

  • RISC-V आर्किटेक्चर पर time-sharing operating system kernel को सीधे लागू करने की प्रक्रिया का परिचय दिया गया है
  • मुख्य पाठक system software और computer architecture के शुरुआती विद्यार्थी, छात्र, और low-level working principles को समझने में रुचि रखने वाले engineers हैं
  • इस प्रयोग में पारंपरिक C भाषा के बजाय Zig भाषा का उपयोग किया गया है ताकि practical reproducibility बढ़े और installation सरल रहे
  • अंतिम code popovicu/zig-time-sharing-kernel repository में सार्वजनिक है, और मुख्य लेख से थोड़ा अंतर हो सकता है
    • लेख के code excerpts की तुलना में repository version को single source of truth मानने की सिफारिश की गई है
    • अभ्यास के समय repository की linker script·build options के आधार पर environment मिलाने की सुविधा मिलती है

Recommended reading

  • यह लेख register, memory addressing, interrupt जैसी computer architecture basics की बुनियादी समझ मानकर चलता है
    • पूर्व-पाठ के रूप में Bare metal on RISC-V, SBI boot process, timer interrupt examples की सिफारिश की गई है
    • micro Linux distribution पर लेख kernel और user space separation की philosophy समझने में वैकल्पिक रूप से उपयोगी है

Unikernel

  • application और OS kernel को एक single executable file में link करने वाली unikernel संरचना अपनाई गई है
    • इससे runtime loader·linker की जटिलता से बचा जाता है, और user code को kernel के साथ memory में load करने की सरलता मिलती है
    • शिक्षा और reproducibility के उद्देश्य से deployment simplicity और environment consistency का लाभ मिलता है

SBI layer

  • RISC-V M/S/U mode privilege model का उपयोग करता है, और इस प्रयोग में OpenSBI को M-mode में रखकर kernel को S-mode में चलाया गया है
    • console output और timer device control को SBI को सौंपकर portability हासिल की गई है
    • SBI उपलब्ध न होने पर UART MMIO को fallback के रूप में इस्तेमाल किया जाता है, लेकिन अभ्यास में नवीनतम OpenSBI की सिफारिश है

Goal for the kernel

  • सरलता के लिए केवल static threads का समर्थन किया गया है, और threads को ऐसे functions के रूप में बनाया गया है जो समाप्त नहीं होते
    • thread U-mode में चलते हैं और S-mode kernel को system call भेजते हैं
    • हर timer tick पर किसी दूसरे thread पर स्विच किया जा सके, इसके लिए single-core आधारित time-sharing scheduling लागू की गई है

Virtualization and what exactly is a thread

  • time-sharing threading, programming model को बदले बिना, single-core पर कई काम साथ-साथ चलाने की एक virtualization तकनीक है
    • cooperative scheduling के विपरीत, इसमें स्पष्ट yield के बिना timer interrupt द्वारा switch होता है
    • हर thread का अपना अलग register set और stack होता है, जबकि बाकी memory साझा की जा सकती है

The stack and memory virtualization

  • thread के पास अलग stack होना चाहिए; calling convention के अनुसार local variables, ra preservation आदि के लिए यह execution context बनाए रखने का आवश्यक तत्व है
    • virtualization spectrum thread < process < container < VM के रूप में आगे बढ़ता है, जहां isolation level और view अलग-अलग होते हैं
    • Linux में container, chroot, cgroups जैसे kernel mechanisms के संयोजन से लागू किए जाते हैं

Virtualizing a thread

  • इस प्रयोग का न्यूनतम virtualization लक्ष्य है: programming model अपरिवर्तित, registers·कुछ CSR की सुरक्षा, और अलग stack allocation
    • यह रेखांकित किया गया है कि अगर register view सुरक्षित न हो तो meaningful computation संभव नहीं रहती
    • शुरुआती a0 आदि को stack पर seed करके thread start के समय argument passing को सरल बनाया गया है

Interrupt context

  • interrupt को prologue/epilogue के जरिए register को stack पर save/restore करने वाले function-call जैसे मॉडल के रूप में समझा जा सकता है
    • asynchronous timer interrupt register को खराब न करे, इसके लिए preservation convention का पालन अनिवार्य है
    • उदाहरण assembly में x0–x31 को सुरक्षित रखने के साथ sstatus, sepc, scause, stval जैसे CSR भी save/restore किए जाते हैं

Implementation (high-level)

Leveraging the interrupt stack convention

  • interrupt routine का body prologue और epilogue के बीच स्थित होता है, और यदि sp को किसी दूसरे memory area से बदल दिया जाए तो दूसरे context के registers restore होने लगते हैं
    • यही वास्तव में context switch है, और यही इस प्रयोग के time-sharing implementation का मुख्य विचार है
    • timer interrupt समय-समय पर हस्तक्षेप करके main flow और interrupt flow को बारी-बारी से चलाता है

Kernel/user space separation

  • S-mode kernel / U-mode user की सीमा बनाए रखी जाती है, और interrupt व system call handling S-mode trap handler में होती है
    • boot क्रम M-mode के OpenSBIS-mode kernel initializationU-mode thread start के रूप में चलता है
    • periodic timer interrupt scheduling·context switching को संभव बनाता है

Implementation (code)

Assembly startup

  • startup.S में BSS initialization और प्रारंभिक stack pointer setup के बाद Zig के main पर jump करने वाली न्यूनतम sequence बनाई गई है
    • kernel entry point, C ABI के साथ linkage के लिए export convention का उपयोग करता है

Main kernel file and I/O drivers

  • kernel.zig का main पहले OpenSBI console feature की जांच करता है, और विफल होने पर UART MMIO पर fallback करता है
    • sbi.debug_print ECALL protocol के अनुसार a0/a1/a6/a7 registers सेट करके call करता है
    • timer सेट करने के बाद S-mode interrupt handler register किया जाता है और tick सक्रिय किए जाते हैं

S-mode handler and the context switch

  • handler को Zig के naked convention में लिखा गया है ताकि CSR preservation सहित पूर्ण prologue/epilogue को manually बनाया जा सके
    • body में handle_kernel(sp) को call किया जाता है, और वापस मिले sp से बदलकर switch होगा या नहीं यह तय किया जाता है
    • scause से यह पहचाना जाता है कि मामला U-mode ECALL का है या timer interrupt का, और उसी अनुसार branch होती है

The user space threads

  • user code को kernel के साथ single binary में शामिल किया गया है, और उदाहरण thread string output → delay loop को दोहराते हैं
    • syscall.debug_print a7 में 64 system call number और a0/a1 में buffer/length रखकर ECALL करता है
    • thread initialization के समय stack पर return address·initial register values seed किए जाते हैं ताकि पहली return पर ही arguments उपलब्ध हों

Running the kernel

  • build के लिए zig build, और run के लिए QEMU में virt machine + nographic + OpenSBI fw_dynamic के साथ execution किया जाता है
    • boot के समय OpenSBI banner के बाद thread ID के अनुसार periodic output बारी-बारी से दिखाई देती है
    • -Ddebug-logs=true के साथ build करने पर interrupt source, current stack, queueing·dequeuing logs विस्तार से दिखते हैं

Conclusion

  • यह प्रयोग RISC-V + OpenSBI + Zig संयोजन के साथ शैक्षणिक kernel को आधुनिक रूप देता है और reproducibility तथा readability बढ़ाता है
    • इसमें न्यूनतम error handling और overprovisioned stack जैसी सरलताएँ हैं, लेकिन फोकस context switch के सार और privilege separation की समझ पर है
    • वास्तविक मशीनों पर portability, linker·driver constants के समायोजन और SBI availability सुनिश्चित होने पर संभव है

अतिरिक्त नोट: virtualization spectrum का सार

  • Threads: मुख्य रूप से register·stack virtualization, memory sharing की संभावना अधिक
  • Process: address space virtualization के जरिए memory isolation, और भीतर कई threads हो सकते हैं
  • Container: filesystem·network namespaces जैसी environment view को जोड़कर बनाई गई isolation unit
  • VM: hardware के व्यापक full virtualization का लक्ष्य

मुख्य implementation points का सार

  • interrupt stack replacement से context switch लागू करना
  • S-mode trap handler में CSR सहित पूरा state save/restore करना
  • SBI पहले, UART MMIO fallback वाला dual output path
  • static threads·single core·time slice पर आधारित सरल scheduling
  • ECALL-based system call के जरिए U/S boundary को स्पष्ट रखना

1 टिप्पणियां

 
GN⁺ 2025-09-16
Hacker News राय
  • इसी तरह का काम "Operating System in 1000 Lines of Code" में 'package' के रूप में अनुभव किया जा सकता है, मैंने पहले इसे Zig के साथ फॉलो किया था (C code snippets को Zig में बदलते हुए), और यह बहुत मज़ेदार था, मेरा code और VOD यहाँ है https://github.com/kristoff-it/kristos/

    • मैं जानना चाहता हूँ कि यह अभ्यास करने के लिए Zig के बारे में कितनी जानकारी होनी चाहिए, अगर किसी ने Zig को कभी छुआ भी न हो तो वह व्यावहारिक रूप से इसे कैसे आज़मा सकता है, खासकर अगर उसके पास C++ का background हो, इस पर सलाह सुनना चाहूँगा
  • यह पोस्ट लेखक द्वारा अलग से सबमिट की गई थी https://news.ycombinator.com/item?id=45236479, लेखक ने खुद Tiny OS Kernel को फिर से बनाया, और खास तौर पर RISC-V तथा OpenSBI environment में प्रयोग करना चाहा, और पारंपरिक C की जगह Zig का उपयोग किया, मुझे लगता है कि C या Rust के साथ भी इसे आसानी से फॉलो किया जा सकता है, पूरा process थोड़ा रफ़ है लेकिन OS Kernel development और computer architecture सीखने की पहली सीढ़ी के लिए यह एक प्रयोग और शुरुआती सामग्री है, मुझे लगता है कि वीकेंड पर मज़े से आज़माने लायक project है, पूरा walkthrough और Github link ऊपर देखा जा सकता है

  • ऐसे project सच में प्रभावशाली होते हैं, Linux भी आखिरकार सिर्फ एक kernel ही है, लेकिन उसी काम ने open source Unix को अरबों devices पर इंस्टॉल होने का रास्ता खोला, मुझे यह वाकई शानदार लगता है

    • और भी मज़ेदार बात यह है कि Linux के शुरुआती रिलीज़ के समय Torvalds ने मेल में लिखा था कि "यह बस एक hobby है, और GNU जितना बड़ा और professional नहीं होगा" https://groups.google.com/g/comp.os.minix/c/dlNtH7RRrGA/m/SwRavCzVE7gJ

    • मुझे नहीं लगता कि ऐसे project <i>इतने ज़्यादा</i> प्रभावशाली हैं, minimal multitasking kernel कैसे बनाना है यह रास्ता दशकों पहले से अच्छी तरह जाना हुआ है, ऐसा kernel बनाना जो boot हो जाए और कुछ साधारण काम कर ले, इसके लिए बस कुछ हद तक समझदारी और लगातार मेहनत चाहिए, RISC-V पर यह x86 से थोड़ा अधिक जटिल हो सकता है, लेकिन hardware initialization की जानकारी आसानी से मिल जाती है (https://wiki.osdev.org/RISC-V_Meaty_Skeleton_with_QEMU_virt_board देखें), और इस project के लेखक ने भी साफ़ कहा है कि यह "operating systems class में किए गए अभ्यास को दोबारा करना" था, मुझे लगता है कि software engineering degree वाला व्यक्ति यह कर सकता है, हाँ, bugs या अधूरे हिस्से हो सकते हैं, लेकिन multiprocessing या MMU के साथ process isolation करना अब अपने आप में बहुत कठिन काम नहीं है

    • Linux की तरह ही, 1984 में Stallman ने C compiler और Unix utilities बनाना शुरू किया था, वह भी अरबों machines पर open source Unix इंस्टॉल होने का रास्ता खोलने जैसा था

  • Zig OS development के लिए सच में बढ़िया है, RISC-V भी वैसा ही है, मैंने भी वही assignment x86 से शुरू किया था लेकिन legacy boilerplate इतना ज़्यादा था कि जल्दी थक गया, RISC-V में यह लगभग नहीं के बराबर है, इसलिए development शुरू करना बहुत आसान हो जाता है https://github.com/Fingel/aeros-v

    • मुझे लगता है कि x86 से शुरू करने पर भी अगर bootloader ठीक से लिखा हो तो boilerplate इतना ज़्यादा नहीं होता, multiboot loader आमतौर पर real mode को संभाल लेता है, और ज़्यादातर लोग protected mode चाहते हैं, इसलिए कुछ tables सेटअप करके jump कर देना काफ़ी होता है, अगर legacy interrupt controller को बंद करना हो तो थोड़ा और काम पड़ता है, लेकिन desktop PC पर सीधे boot करके देख पाने का फायदा है (console interface को लेकर सावधानी चाहिए), मेरा hobby OS BIOS boot और कुछ VGA features का उपयोग करता था और compatibility खराब होने की वजह से काफ़ी झेलना पड़ा, serial console बहुत आसान है लेकिन आजकल बहुत से computers में serial port नहीं होता

    • यह मूल रूप से Object Pascal या Modula-2 की safety को फिर से उठाकर C syntax में दोबारा पैक करने जैसा है, C में Unix के license के कारण व्यापक प्रसार के अलावा कोई खास बात नहीं थी

    • मैं भी इसे खुद आज़माना चाहता हूँ, जानना चाहता हूँ कि RISC-V kernel किस environment में चलाया जा रहा है, क्या सिर्फ Qemu इस्तेमाल हो रहा है, या कोई actual hardware भी है जिसकी सिफारिश की जा सकती है

  • मुझे लगता है कि RISC-V ISA सच में बहुत accessible है, documentation शानदार है, examples बहुत हैं, emulators भी काफ़ी हैं, uncompressed machine code भी पढ़ने में आसान है, मैं अपनी बेटी के लिए खुद एक किताब लिखते हुए Forth और time-sharing वाला एक छोटा OS बना रहा हूँ https://punkx.org/projekt0/book/part1/os.html, अगर यह x86 होता तो शायद मैं कोशिश भी न करता, इस process में मैं Forth और RISC-V assembly एक साथ सीख रहा हूँ और यह बहुत आनंददायक है, अगर आप scratch से toy OS बनाना चाहते हैं तो अभी बेहतरीन समय है (1980s जितना रोमांचक), कोई सस्ता RISC-V board (rp2350 आदि) ले लें, और संबंधित manual sections को Claude जैसे AI में अपलोड करें, अटकने पर बहुत मदद मिलती है

    • मैंने अभी अपने देश में boards की कीमतें देखीं और यह सोच से कहीं ज़्यादा सस्ते निकले, अब लगभग 90% मन है कि सिर्फ मज़े के लिए एक खरीद लूँ
  • ऐसी कोशिशें हमेशा मज़ेदार और दिलचस्प होती हैं, मैं लोगों को अपना encryption या दूसरी कठिन चीज़ें भी आज़माने के लिए प्रोत्साहित करना चाहूँगा, “अपना encryption implement मत करो” वाली सलाह का मतलब यह है कि production में अप्रमाणित चीज़ें इस्तेमाल मत करो, experiment/research के लिए यह ख़तरनाक नहीं है, इसलिए खुलकर कोशिश करनी चाहिए, हमें और ज़्यादा operating systems और विकल्पों की ज़रूरत है

  • (स्पेनिश कोर्ट के फ़ैसले का उद्धरण) चलो http block करना समझ में आता है, लेकिन यह तो हद है...

    • मैंने सुना है कि स्पेन में Cloudflare (और शायद दूसरी सेवाएँ भी) फ़ुटबॉल streaming से जुड़ी समस्याओं के कारण गलती से block हो जाती हैं, मैं जानना चाहता हूँ कि लोग इस समस्या को कैसे bypass कर रहे हैं, क्या VPN इस्तेमाल करते हैं? अगर कोई महत्वपूर्ण IP block हो जाए तो कामकाज पर भी असर पड़ता होगा

    • (फ़ैसले में) यह देखकर कि इसे Spanish Professional Football League और Telefónica Audiovisual Digital ने शुरू किया, मुझे लगता है ये लोग अपराधी हैं

    • ...क्या? क्या स्पेन की कोई football organization पूरे देश की internet access सीमित करने का अधिकार रखती है?

  • मैं जानना चाहता हूँ कि सस्ता RISC hardware कहाँ से मिल सकता है

    • AliExpress पर Milk-V Duo S नाम का board 10 डॉलर में बिक रहा है, यह हाल में recommendation list में बार-बार दिख रहा है, मुख्य specs हैं upgraded SG2000 master, 512MB RAM, wider IO, कुछ models में WI-FI6/BT5 (512M-Basic/eMMC models को छोड़कर), USB 2.0 host port, PoE-enabled 100Mbps Ethernet, dual MIPI CSI, और RISC-V तथा ARM boot switching support https://aliexpress.com/w/wholesale-Milk%2525252dV-Duo-S.html

    • कई boards पहले से मौजूद हैं, लेकिन जिसे मैंने दिलचस्प समझकर fund किया वह VisionFive 2 Lite है https://www.kickstarter.com/projects/starfive/visionfive-2-lite-unlock-risc-v-sbc-at-199/description, मेरे पास पहली पीढ़ी का VisionFive2 नहीं है, लेकिन reviews अच्छे हैं और ecosystem बढ़ रहा है, कुछ हिस्से अभी अधूरे हैं लेकिन उम्मीद है कि जल्द shipping शुरू होगी, मैं खुद PolarFire SoC Discovery Kit इस्तेमाल करता हूँ, यह quad-core RISC-V और FPGA वाला board है, थोड़ा महंगा है (130 डॉलर) और सबके लिए सही नहीं, लेकिन मज़ेदार बात यह है कि board खुद chip से सस्ता है https://www.microchip.com/en-us/development-tool/MPFS-DISCO-KIT, Microchip के docs और toolchain पुराने और खास अच्छे नहीं हैं, लेकिन एक बार आदत हो जाए तो bare-metal RISC-V code चलाना सच में आसान है, Linux/bare-metal examples काफ़ी मददगार हैं

    • मैं सुझाव दूँगा कि अभी actual hardware के बिना भी x86 या Apple machine पर emulator में चलाकर देखिए, actual board की तुलना में development तेज़ होता है, और QEMU जैसी चीज़ से तुरंत शुरू किया जा सकता है https://www.qemu.org/docs/master/system/target-riscv.html

    • Raspberry Pi Pico 2 भी RISC-V support करता है, इसलिए वह भी ठीक है https://www.raspberrypi.com/products/raspberry-pi-pico-2/

    • जवाब देने वाले सभी लोगों का धन्यवाद, लेकिन जिन्होंने इस सवाल पर downvote किया, मुझे नहीं लगता कि उनके लिए धन्यवाद का कोई कारण है