निगरफ, मैं आपके प्रश्न का उत्तर देने की कोशिश करूंगा, लेकिन बूट प्रक्रिया के अधिक व्यापक वर्णन के लिए, आईबीएम लेख का प्रयास करें ।
ठीक है, मेरा मानना है कि आप स्पष्टीकरण के लिए GRUB या GRUB2 को अपने बूटलोडर के रूप में उपयोग कर रहे हैं। सबसे पहले, जब BIOS बूटलोडर को लोड करने के लिए आपकी डिस्क तक पहुंचता है, तो यह डिस्क एक्सेस के लिए अपने अंतर्निहित रूटीन का उपयोग करता है, जो कि प्रसिद्ध 13h रुकावट में संग्रहीत होते हैं। बूट लोडर (और सेटअप चरण में कर्नेल) डिस्क का उपयोग करते समय उन दिनचर्या का उपयोग करते हैं। ध्यान दें कि प्रोसेसर के वास्तविक मोड (16 बिट) में BIOS चलता है, इस प्रकार यह 2 ^ 20 बाइट से अधिक रैम को संबोधित नहीं कर सकता (2 ^ 20 नहीं 2 ^ 16) क्योंकि वास्तविक मोड में प्रत्येक पता सेगमेंट_ड्रेस * 16 + ऑफसेट से मिलकर बनता है , जहां दोनों खंड पते और ऑफसेट 16-बिट हैं, http://en.wikipedia.org/wiki/X86_memory_segmentation देखें )। इस प्रकार, ये रूटीन 1 MiB से अधिक रैम तक नहीं पहुंच सकते हैं, जो एक सख्त सीमा और एक बड़ी असुविधा है।
BIOS एमबीआर से बूट लोडर कोड को सही लोड करता है - आपकी डिस्क के पहले 512 बाइट्स और इसे निष्पादित करता है। यदि आप GRUB का उपयोग कर रहे हैं, तो वह कोड GRUB चरण 1 है। यह कोड GRUB चरण 1.5 को लोड करता है, जो डिस्क स्थान के पहले 32 KiB में स्थित है, जिसे DOS संगतता क्षेत्र कहा जाता है या फ़ाइल सिस्टम के एक निश्चित पते से। इसे करने के लिए फ़ाइल सिस्टम को समझने की आवश्यकता नहीं है, इसका कारण यह भी है कि चरण 1.5 फ़ाइल सिस्टम में है, यह "कच्चा" कोड है और इसे सीधे रैम में लोड किया जा सकता है और निष्पादित किया जा सकता है: http://www.pixelbeat.org/ डॉक्स / डिस्क / । डिस्क से रैम तक स्टेज 1.5 का भार BIOS डिस्क एक्सेस रूटीन का उपयोग करता है।
स्टेज 1.5 में फाइलसिस्टम उपयोगिताओं है, ताकि यह फाइलसिस्टम से स्टेज 2 को पढ़ सके (ठीक है, यह अभी भी डिस्क से रैम तक पढ़ने के लिए BIOS 13h का उपयोग करता है, लेकिन अब यह फाइल सिस्टम की जानकारी को इनकोड आदि के बारे में समझा सकता है और कच्चे कोड को प्राप्त कर सकता है) डिस्क)। पुराने BIOS अपने डिस्क एड्रेसिंग मोड में सीमाओं के कारण पूरे एचडी तक नहीं पहुंच सकते हैं - वे सिलेंडर-हेड-सेक्टर सिस्टम का उपयोग कर सकते हैं, जो डिस्क स्थान के पहले 8 GiB से अधिक को संबोधित करने में असमर्थ हैं: http: //en.wikipedia। org / wiki / सिलेंडर-हेड-सेक्टर ।
स्टेज 2 रैम में कर्नेल को लोड करता है (फिर से, BIOS डिस्क उपयोगिताओं का उपयोग करके)। यदि यह 2.6+ कर्नेल है, तो इसके अंदर इनट्रामर्फ भी संकलित है, इसलिए इसे लोड करने की आवश्यकता नहीं है। यदि यह एक पुराना कर्नेल है, तो बूटलोडर स्टैंडअलोन इनइटर्ड इमेज को मेमोरी में लोड कर देता है, ताकि कर्नेल इसे माउंट कर सके और डिस्क से रियल फाइल सिस्टम को माउंट करने के लिए ड्राइवर प्राप्त कर सके।
समस्या यह है कि कर्नेल (और रैमडिस्क) का वजन 1 MiB से अधिक है, इस प्रकार उन्हें रैम में लोड करने के लिए आपको कर्नेल को पहले 1 MiB पर लोड करना होगा, फिर संरक्षित मोड (32 बिट) पर जाएं, लोड किए गए कर्नेल को उच्च मेमोरी में स्थानांतरित करें (मुफ्त) वास्तविक मोड के लिए पहले 1 MiB), फिर वास्तविक (16 बिट) मोड पर वापस लौटें, डिस्क से रैमडिस्क प्राप्त करें पहले 1 MiB (यदि यह एक अलग initrd और पुराने कर्नेल है), संभवतः संरक्षित (32 बिट) मोड पर फिर से, इसे जहां है, वहां रखें, संभवतः वास्तविक मोड पर वापस जाएं (या नहीं: /programming/4821911/does-grub-switch-to-protected-mode ) और कर्नेल कोड निष्पादित करें। चेतावनी: मैं वर्णन के इस भाग की पूर्णता और सटीकता के बारे में पूरी तरह सुनिश्चित नहीं हूँ।
अब, जब आप अंत में कर्नेल चलाते हैं, तो आपके पास पहले से ही है और रैमडिस्क को बूटलोडर द्वारा रैम में लोड किया जाता है , इसलिए कर्नेल रैमडिस्क से डिस्क यूटिलिटीज का उपयोग करके आपको वास्तविक रूट फाइल सिस्टम माउंट कर सकता है और रूट रूट कर सकता है। रैमफ ड्राइवर कर्नेल में मौजूद होते हैं, इसलिए यह इनट्रैमफ्स की सामग्री को समझ सकता है।