2 पॉइंट द्वारा GN⁺ 2025-10-26 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • कंप्यूटर के पावर बटन दबाने के क्षण से Linux kernel के चलने तक की प्रक्रिया को चरण-दर-चरण समझाने वाला तकनीकी विवरण
  • CPU के real mode से शुरू होकर protected mode और long mode में जाने की प्रक्रिया को विस्तार से कवर किया गया है
  • BIOS/UEFI firmware, bootloader (GRUB), kernel decompression और address relocation जैसी हर स्टेज की भूमिका और काम करने के सिद्धांत का विस्तृत वर्णन
  • memory mapping, interrupt, page table, kASLR जैसे kernel initialization के लिए ज़रूरी मुख्य कॉन्सेप्ट्स को संक्षिप्त उदाहरणों के साथ समझाया गया है
  • Linux बूट के अंदरूनी मैकेनिज़्म को समझकर system architecture, security, performance optimization के बारे में गहरी समझ मिलती है

Part 1 — पावर बटन से kernel के पहले execution तक

  • पावर बटन दबाते ही CPU real mode में reset होकर शुरुआती निर्देशों को execute करता है

    • real mode, 8086 दौर से मौजूद एक सरल addressing scheme है, जिसमें segment और offset को मिलाकर physical address निकाला जाता है
    • उदाहरण: physical_address = (segment << 4) + offset
    • reset के बाद CPU 0xFFFFFFF0 address (reset vector) पर jump करता है और firmware को control सौंप देता है
  • register CPU के अंदर मौजूद ultra-fast storage slots होते हैं, जैसे CS (code segment), IP (instruction pointer) आदि

    • CS मौजूदा code की location बताता है, और IP अगले execute होने वाले instruction की ओर इशारा करता है

BIOS और UEFI

  • BIOS पुराना firmware है, जो POST (power-on self test) के बाद boot order की जाँच करता है और bootable disk खोजता है
    • bootable disk की पहचान पहले 512-byte sector के अंत में 0x55AA मार्कर से होती है
    • BIOS इस sector को 0x7C00 address पर copy करके वहीं jump कर execute करता है
  • UEFI इसका आधुनिक विकल्प है, जो सीधे filesystem को समझ सकता है और बड़े boot programs load कर सकता है
    • BIOS के विपरीत इसमें “first sector” जैसी सीमा नहीं होती, और यह OS को अधिक समृद्ध system information देता है

bootloader

  • bootloader वह program है जो kernel को memory में load करता है और execution की तैयारी करता है
    • आम तौर पर GRUB इस्तेमाल होता है, जो config file पढ़कर kernel और initial ramdisk (initrd) को memory में load करता है
    • kernel file, real mode के लिए एक छोटे setup program और compressed kernel main image से मिलकर बनी होती है
    • GRUB, kernel location, command line, initrd location जैसी जानकारी setup header structure में लिखकर kernel setup code पर jump करता है

setup program

  • kernel execution से पहले एक अनुमानित और स्थिर workspace तैयार करने का काम करता है
    • segment registers (CS, DS, SS) को align करता है और direction flag को clear करता है ताकि memory copy एक समान तरीके से काम करे
    • stack बनाता है ताकि function call के समय temporary data store किया जा सके
    • BSS area (global variables का वह क्षेत्र जिसे प्रारंभिक मान 0 से शुरू होना चाहिए) को 0 से initialize करता है
  • earlyprintk option होने पर serial port सेट करके शुरुआती debug messages output किए जा सकते हैं
  • firmware से RAM map (e820) माँगकर usable memory regions और reserved regions की पहचान की जाती है
  • सारी तैयारी पूरी होने पर पहली C function main को call किया जाता है, और उसके बाद mode transition चरण शुरू होता है

interrupt

  • interrupt वह मैकेनिज़्म है जिसमें CPU मौजूदा काम को थोड़ी देर रोककर किसी urgent event को handle करता है
    • key input, timer आदि इसके सामान्य hardware events हैं
    • maskable interrupt को अस्थायी रूप से रोका जा सकता है, जबकि NMI (Non-Maskable Interrupt) हमेशा handle होता है
    • mode transition के दौरान unexpected interrupts से बचने के लिए इन्हें अस्थायी रूप से disable किया जाता है

Part 2 — real mode से 32-bit, फिर 64-bit तक

  • आधुनिक Linux x86_64 architecture के long mode में चलता है
    • real mode → protected mode → long mode के क्रम में चरणबद्ध transition ज़रूरी होता है

protected mode

  • यह 1980 के दशक की सीमाओं से आगे बढ़ने के लिए लाया गया 32-bit mode है, जिसमें दो मुख्य structures होते हैं
    • GDT (Global Descriptor Table) : segment का starting address, size और permissions तय करता है
      • Linux flat model का उपयोग करता है, जिससे पूरा 32-bit space एक लगातार क्षेत्र की तरह सरल हो जाता है
    • IDT (Interrupt Descriptor Table) : interrupt आने पर किस handler को बुलाना है, उसका address रखता है
      • boot के दौरान केवल न्यूनतम IDT load की जाती है, और kernel initialization के बाद पूर्ण IDT install होती है

mode transition प्रक्रिया

  • setup code पहले interrupt disable, PIC chip stop, A20 line enable, और math coprocessor initialize करता है
    • A20 line, 1MB address wrapping समस्या को हल करने के लिए इस्तेमाल की गई एक ऐतिहासिक व्यवस्था है
  • न्यूनतम GDT और IDT load करने के बाद, CR0 register के PE bit को set किया जाता है और far jump किया जाता है
    • इससे protected mode में प्रवेश होता है, और segment व stack pointer को नई addressing scheme के अनुसार फिर से सेट किया जाता है

control registers

  • CR0: protected mode को activate करता है
  • CR3: page table का top-level address store करता है
  • CR4: PAE जैसी extended features को enable करता है

long mode में जाने की तैयारी

  • 64-bit mode में switch करने के लिए दो शर्तें ज़रूरी हैं
    • paging enable होना: virtual address और physical address के बीच mapping करनी होती है
    • EFER register के LME (Long Mode Enable) bit को set करना
  • page tables 4KB units में pages map करती हैं, लेकिन शुरुआती boot के समय 2MB units वाले identity map से सरल configuration बनाई जाती है

paging enable करने की प्रक्रिया

  • PAE feature को CR4 में enable किया जाता है, और low-address region को 2MB units में cover करने वाली न्यूनतम page tables बनाई जाती हैं
  • top-level table का address CR3 में लिखने के बाद paging enable की जाती है
  • EFER का LME bit set करके 64-bit code पर jump किया जाता है, और long mode में प्रवेश हो जाता है
  • address और registers 64-bit width तक expand हो जाते हैं, और kernel execution के लिए तैयारी पूरी हो जाती है

Part 3 — kernel decompression, address fix-up, और self-relocation

  • अब CPU 64-bit mode में है, और memory में compressed kernel image मौजूद है
    • एक छोटा 64-bit stub kernel को extract करता है और addresses को adjust करने का काम करता है

शुरुआती cleanup और safety setup

  • stub अपनी वास्तविक execution location की गणना करता है, और अगर kernel के साथ overlap हो रहा हो तो self-relocation के जरिए सुरक्षित स्थान पर चला जाता है
  • अपने BSS area को initialize करता है, और एक साधारण IDT load करता है (जिसमें page fault और NMI handlers शामिल होते हैं)
    • page fault होने पर missing mapping तुरंत जोड़कर recovery की जाती है
  • kernel, boot parameters, command line buffer आदि आवश्यक क्षेत्रों के लिए identity mapping बनाई जाती है

kernel decompression

  • extract_kernel function चलाया जाता है, जो kernel compression को खोलता है
    • gzip, xz, zstd, lzo जैसे कई compression algorithms supported हैं
    • extraction के बाद ELF header पढ़कर code/data sections को सही addresses पर copy किया जाता है
  • अगर kernel का build address और वास्तविक load address अलग हों, तो relocation किया जाता है
    • address वाले instructions और pointers को actual memory location के अनुसार ठीक किया जाता है
  • सारी तैयारी के बाद start_kernel function पर jump किया जाता है, और यहीं से वास्तविक kernel initialization शुरू होती है

kernel का self-randomization (kASLR)

  • kASLR (Kernel Address Space Layout Randomization) kernel के physical और virtual addresses को randomize करके attacks को कठिन बनाता है
    • boot के समय दो base values को random चुना जाता है
      • physical base: RAM का वह address जहाँ kernel वास्तव में रखा जाएगा
      • virtual base: वह शुरुआती virtual address जिसे kernel उपयोग करेगा
  • चयन प्रक्रिया
    • bootloader, initrd, command line buffer आदि उन क्षेत्रों की सूची बनाई जाती है जिन्हें सुरक्षित रखना ज़रूरी है
    • firmware के memory map को scan करके पर्याप्त बड़े खाली क्षेत्रों की खोज की जाती है
    • hardware random instructions आदि से मिली entropy के आधार पर random slot चुना जाता है
  • यदि उपयुक्त क्षेत्र न मिले तो default address पर वापस लौटते हैं, और nokaslr option होने पर randomization disable कर दी जाती है

शब्दावली सारांश

  • Hexadecimal (16-आधारी संख्या प्रणाली) : 0x prefix से दर्शाई जाती है, hardware bit structure और alignment के लिए सुविधाजनक
  • Register: CPU के अंदर का temporary storage (CS, DS, SS, IP, SP आदि)
  • Segment/Offset: real mode address calculation की विधि (segment * 16 + offset)
  • BIOS/UEFI: system initialization और boot program loading करने वाला firmware
  • Bootloader (GRUB) : kernel load करना और system information देना
  • Stack/BSS: function temporary storage और 0 से initialized global variable area
  • Interrupt/NMI: hardware/software events को handle करने का mechanism
  • GDT/IDT: segment और interrupt definition tables
  • A20 Line: 1MB address wrapping रोकने वाला switch
  • Protected Mode/Long Mode: 32-bit और 64-bit execution modes
  • Paging/Page Tables: virtual address और physical address

1 टिप्पणियां

 
GN⁺ 2025-10-26
Hacker News राय
  • यह वाकई बहुत अच्छा लेख था। कुछ महीने पहले मैंने भी Linux boot process पर एक लेख लिखा था, लेकिन उसमें disk I/O के पहलू पर थोड़ा ज़्यादा फोकस था (डिस्क में क्या होता है, और वह कैसे लोड होता है) मेरा लेख Booting x86-64 पर देखा जा सकता है
  • पेज सोर्स में ऐसा कोड था
    
      uwu
    
    
    इसे देखकर लगा, यह क्या है
    • यह अभी काम चल रहा फीचर है
  • UEFI firmware द्वारा implement किया गया interface है। यानी यह खुद firmware नहीं है, बल्कि firmware से बात करने के लिए एक standard interface है “UEFI मशीन को शुरू करता है” कहना थोड़ा गलत terminology है। असल में firmware मशीन को शुरू करता है, और हम UEFI के ज़रिए firmware से communicate करते हैं यह लेख modern firmware के कई दिलचस्प हिस्सों को छोड़ देता है। उदाहरण के लिए ExitBootServices() कॉल करते समय सिस्टम पहले ही long mode में प्रवेश कर चुका होता है। real/protected mode transition से गुजरने की कोई ज़रूरत नहीं होती
    • मैं जानना चाहता हूँ कि इस बारे में और पढ़ने के लिए अच्छे स्रोत कहाँ मिलेंगे
  • मुझे जिज्ञासा थी कि क्या power button सचमुच CPU को सीधे चालू करता है। शायद Intel Management Engine (या AMD का समान फीचर) हमेशा on रहता हो, power button signal मिलने पर CPU को शुरू करने के लिए
    • मेरा मानना है कि यह काम Embedded Controller(EC) करता है। यह वह हिस्सा है जो bootloader के CPU को ऊपर लाने से पहले काम करता है Chromebook में यह हिस्सा coreboot bootloader के साथ open source के रूप में उपलब्ध है संबंधित दस्तावेज़ Chromium EC Zephyr README में देखे जा सकते हैं
  • मैं इस लेख से थोड़ा अधिक विस्तृत संस्करण ढूँढ रहा हूँ। पूरा microprocessor datasheet पढ़ने का मन नहीं है, लेकिन UEFI/BIOS से पहले के चरणों तक थोड़ा गहराई से जाने वाली सामग्री मिले तो अच्छा होगा
  • लेख दिलचस्प है, लेकिन साथ ही यह भी लगा कि इसमें hexadecimal (HEX) की व्याख्या तक क्यों शामिल करनी पड़ी। ऐसा लगा कि इस स्तर का लेख पढ़ने वाले लोगों को यह तो पता होगा एक और जिज्ञासा यह है कि physical power button दबाने के क्षण से reset vector तक बात कैसे पहुँचती है। यह hardware और electronic circuits के जादू जैसा क्षेत्र है
    • HN सिर्फ IT professionals के लिए नहीं है। ऐसे लोग भी हो सकते हैं जिन्हें Linux boot process में दिलचस्पी हो, लेकिन hexadecimal की अवधारणा ठीक से न पता हो या वे भूल गए हों
  • विषय दिलचस्प है, लेकिन यह बहुत शुरुआती पाठकों के लिए लिखा हुआ लगा
    • “जब power stable हो जाती है, CPU real mode में reset होता है” जैसी बात पढ़कर लगा, क्या मेरी दादी भी इसे समझने लायक विशेषज्ञ हैं?
    • मैंने कॉलेज में audience analysis सीखी थी, और यह तय करना महत्वपूर्ण होता है कि आप कौन-सा ज्ञान पहले से माना हुआ समझते हैं, और किन terms या acronyms को विस्तार से समझाना चाहिए। technical writing में यह एक तरह की कला है
  • मोबाइल पर पढ़ना मुश्किल था। टेक्स्ट का रंग बहुत फीका था
    • डेस्कटॉप ब्राउज़र में भी styling खास अच्छी नहीं थी। Firefox या Firefox Mobile के reader mode का इस्तेमाल करें तो पढ़ना काफी बेहतर हो जाता है
    • डिज़ाइन थोड़ा self-deprecating लगा
  • GRUB का ज़िक्र तो था, लेकिन उसे विस्तार से नहीं समझाया गया इसके लिए Pixelbeat की disk structure documentation मददगार है
  • यह लेख देखकर मुझे पुराने Facebook technical interview की याद आ गई। लगभग 2010 में Production Engineer पद के लिए एक phone interview था, जिसमें पूछा गया था, “Linux server की boot process समझाइए” “और गहराई में जाइए” जैसे इशारे के अलावा कोई मदद नहीं मिली। आखिरकार मैं Dublin शिफ्ट नहीं हुआ, और खैर, surveillance capitalism वगैरह सोचकर कह सकते हैं कि अंगूर अभी खट्टे ही थे