2011-06-03 21 views
5

मेरे कर्नेल को प्रारंभ करते समय, मेरे पास कुछ चीजें होती हैं जिन्हें होने की आवश्यकता होती है: 1) पेजिंग को सक्षम करने की आवश्यकता है, 2) भौतिक स्मृति प्रबंधक को स्मृति मानचित्र को ग्राब से पार्स करने की आवश्यकता होती है, और 3) मिश्रित स्टार्टअप कोड को उस डेटा तक पहुंचने की आवश्यकता है जिसे बाद में वहां रहने की आवश्यकता है (जैसे जीडीटी, आईडीटी, मेमोरी प्रबंधन संरचनाएं)।उच्च आधा कर्नेल प्रारंभ

इन चरणों के बीच निर्भरता मुझे पागल कर रही है। आधे से अधिक के साथ, कर्नेल अपने आभासी पते पर जुड़ा हुआ है और इसलिए जिन विकल्पों के साथ मैं आया हूं वे 1) असेंबली में पेजिंग सक्षम करते हैं, जिसमें सभी मल्टीबूट पॉइंटर्स (असेंबली में) का पालन करना शामिल होगा ताकि वे अभी भी पहुंच सकें भौतिक मेमोरी मैनेजर के लिए और बाद में उन सभी को अनैप करने के लिए, 2) स्टार्टअप कोड को अपने भौतिक पते पर लिंक करें और उसके बाद कर्नेल संरचनाओं को उनके भौतिक पते पर भी एक्सेस करने के लिए कुछ पॉइंटर मैनिपुलेशन करें, या 3) आधे से अधिक का उपयोग न करें गिरी।

संकलन समय पर भौतिक स्मृति की मात्रा को जानने के बिना भौतिक स्मृति प्रबंधक बूटस्ट्रैपिंग भी शामिल है। मुझे पूरा यकीन है कि मुझे पहले संरचनाओं को आवंटित करते समय सभी मल्टीबूट संरचनाओं से सावधानी से बचना होगा, या उन्हें पहले इस्तेमाल करना होगा और फिर उन्हें ओवरराइट करने की चिंता न करें (हालांकि मुझे अभी भी मॉड्यूल से निपटना होगा और शायद यह दृष्टिकोण मल्टीबूट टेबल को एक ज्ञात स्थान पर कॉपी करना शामिल है क्योंकि मुझे भौतिक मेमोरी मैनेजर सेट करते समय उन्हें चाहिए)।

ये समस्याएं हैं कि मैंने अभी तक एक उच्च आधा कर्नेल से बचा है। क्या इन निर्भरताओं को हल करने के लिए किसी के पास अच्छी प्रणाली है? हो सकता है कि this GDT trick पर कर्नेल दोनों को अपने लिंक किए गए/वर्चुअल एड्रेस और मल्टीबूट टेबल को उनके भौतिक पते पर एक्सेस करने के लिए, या उपरोक्त समस्याओं से बचने वाले किसी प्रकार की प्री-डिफ़ाइंड पेज टेबल का उपयोग करने के लिए कुछ भिन्नता हो, शायद पीएसई शामिल हो?

उत्तर

4

यह मैं कैसे इस समस्या को घेरने की कोशिश की है:

मेरे गिरी छवि (शारीरिक) पता 0x01000000 (16MB, बस ईसा डीएमए क्षेत्र के ऊपर) पर GRUB द्वारा भरी हुई है। इस छवि में मूल रूप से दो भाग होते हैं:

  1. एक "प्रारंभिक init" अनुभाग। इस खंड में कोड है जो उच्च आधा कर्नेल पर कूदने के लिए तैयार किया जाता है। मैं इस खंड में कुछ जगह को एक ढेर और इस तैयारी के दौरान उपयोग किए जाने वाले ढेर के लिए भी आरक्षित करता हूं। इस खंड में सभी कोड (वर्चुअल) पता 0x01000000 से जुड़ा हुआ है।
  2. शेष छवि में कोड और डेटा शामिल है जो उच्च आधा कर्नेल का हिस्सा है। इस भाग में सभी कोड (वर्चुअल) पता 0xc0000000 (3 जीबी) से जुड़ा हुआ है।

के बाद से जल्दी init अनुभाग में कोड जहां यह भरी हुई है के रूप में एक ही पते पर जुड़ा हुआ है, GRUB बिना किसी समस्या के लिए इस कोड में कूद कर सकते हैं। यह प्रारंभिक init कोड निम्न चरणों का पालन करता है:

  1. एमबीआई संरचना को स्थानांतरित करें जो GRUB कर्नेल को पास करता है। प्रारंभिक init खंड के अंदर ढेर इसका उपयोग किया जाता है।
  2. पहचान पत्र प्रारंभिक init अनुभाग द्वारा उपयोग किए गए अंतिम पृष्ठ के भौतिक पते पर भौतिक पता 0x0 से शुरू होने वाले सभी पृष्ठों को मानचित्र करता है। पहचान मानचित्रण का अर्थ है कि आभासी पते भौतिक पते के समान हैं। यह सुनिश्चित करता है कि प्रारंभिक init अनुभाग में कोड अभी भी पेजिंग सक्षम होने के बाद निष्पादित किया जा सकता है।
  3. आभासी पता 0xc0000000 पर उच्च आधा कर्नेल मानचित्र करें।
  4. पेजिंग सक्षम करें।
  5. उच्च आधा कर्नेल में कूदें।

इस बिंदु पर शेष प्रारंभिक आधा कोड से किया जाता है। इसमें जीडीटी, आईडीटी, मेमोरी मैनेजमेंट, स्थापित करना शामिल है ... ध्यान दें कि एमबीआई एक प्रसिद्ध स्थान पर स्थानांतरित हो गया है, इसलिए आपको इसे अपने डेटा संरचनाओं के साथ ओवरराइट करने की चिंता करने की आवश्यकता नहीं है।

भौतिक स्मृति प्रबंधक के बारे में एक छोटा सा शब्द: मैं अपने डेटा संरचनाओं के लिए आवश्यक पृष्ठों की मात्रा की गणना करता हूं, कर्नेल छवि के बाद पहले पृष्ठ पर शुरू होने वाली इन संरचनाओं को आवंटित करता हूं और इन डेटा संरचनाओं के बाद शुरू होने वाले पृष्ठों को शुरू करना शुरू करता हूं।

मुझे आशा है कि यह स्पष्टीकरण स्पष्ट है। यदि ऐसा नहीं है, तो कृपया मुझे बताएं। यदि आप चाहें तो मैं आपको अपने कर्नेल की एक प्रति भी प्रदान कर सकता हूं।

+0

धन्यवाद! एक सवाल- प्रारंभिक ढेर (मैं अनुमान लगा रहा हूं) स्थानांतरित एमबीआई रखता है, जिसे आप इसके साथ पूरा करते समय त्याग दिया जा सकता है, लेकिन ऐसा लगता है जैसे प्रारंभिक मैपिंग के लिए पेज टेबल भी रखता है। एक बार जब आप अपनी पहली प्रक्रिया बनाते हैं तो क्या आप उन्हें भी त्याग देते हैं? – rpjohnst

+0

@Rusky: हाँ, एमबीआई को त्याग दिया जा सकता है लेकिन मैं ऐसा नहीं करता क्योंकि यह बहुत छोटा है। मैं उस ढेर में पेज निर्देशिका और पेज टेबल नहीं रखता लेकिन कहीं कम स्मृति में (लगभग 4 केबी)। मैं उनको त्याग नहीं देता क्योंकि पहली बार चलने वाली प्रक्रिया उन्हें प्राप्त करेगी। अर्थात। मेरी पहली प्रक्रिया प्रारंभिकरण के दौरान स्थापित पता स्थान में चली जाएगी। – Job

संबंधित मुद्दे