Linux बूट प्रक्रिया: पावर बटन से kernel तक
(0xkato.xyz)- कंप्यूटर के पावर बटन दबाने के क्षण से 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
0xFFFFFFF0address (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 को
0x7C00address पर copy करके वहीं jump कर execute करता है
- bootable disk की पहचान पहले 512-byte sector के अंत में
- 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 करता है
earlyprintkoption होने पर 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 होती है
- GDT (Global Descriptor Table) : segment का starting address, size और permissions तय करता है
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_kernelfunction चलाया जाता है, जो 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_kernelfunction पर 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 उपयोग करेगा
- boot के समय दो base values को random चुना जाता है
- चयन प्रक्रिया
- bootloader, initrd, command line buffer आदि उन क्षेत्रों की सूची बनाई जाती है जिन्हें सुरक्षित रखना ज़रूरी है
- firmware के memory map को scan करके पर्याप्त बड़े खाली क्षेत्रों की खोज की जाती है
- hardware random instructions आदि से मिली entropy के आधार पर random slot चुना जाता है
- यदि उपयुक्त क्षेत्र न मिले तो default address पर वापस लौटते हैं, और
nokaslroption होने पर randomization disable कर दी जाती है
शब्दावली सारांश
- Hexadecimal (16-आधारी संख्या प्रणाली) :
0xprefix से दर्शाई जाती है, 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
अभी कोई टिप्पणी नहीं है.