सबसे पहले, यह वास्तव में रैम के साथ कुछ नहीं करना है। हम यहां पते की जगह के बारे में बात कर रहे हैं - भले ही आपके पास केवल 16 MiB मेमोरी हो, आपके पास अभी भी 32-बिट CPU पर पता स्थान के पूर्ण 32 बिट्स हैं।
यह पहले से ही आपके पहले प्रश्न का उत्तर देता है, वास्तव में - जिस समय यह डिज़ाइन किया गया था, वास्तविक दुनिया पीसी में मेमोरी के पूर्ण 4 GiB के पास कहीं नहीं था; वे स्मृति के 1-16 MiB की सीमा में अधिक थे। पता स्थान सभी इरादों और उद्देश्यों के लिए, मुफ्त था।
अब, 0xFFFFFFF0 वास्तव में क्यों? सीपीयू को पता नहीं है कि वहां कितना BIOS है। कुछ BIOS केवल कुछ किलोबाइट ले सकते हैं, जबकि अन्य पूरी मेगाबाइट मेमोरी ले सकते हैं - और मैं विभिन्न वैकल्पिक रैम में भी नहीं आ रहा हूं। सीपीयू को शुरू करने के लिए कुछ पते पर हार्डवेयर्ड होना चाहिए - सीपीयू को कॉन्फ़िगर करने के लिए कोई नोट नहीं है। लेकिन यह केवल पते की जगह का एक मानचित्रण है - पते को सीधे BIOS ROM चिप में मैप किया जाता है (हां, इसका मतलब है कि आपको इस बिंदु पर पूर्ण 4 GiB RAM तक पहुंच नहीं मिलती है यदि आपके पास ऐसा बहुत है - लेकिन यह कुछ खास नहीं है, कई उपकरणों को पता स्थान में अपनी सीमा की आवश्यकता होती है)। 32-बिट सीपीयू पर, यह पता आपको बहुत ही बुनियादी आरंभीकरण करने के लिए पूर्ण 16 बाइट देता है - जो आपके सेगमेंट को सेटअप करने के लिए पर्याप्त है और यदि आवश्यक हो, तो पता मोड (याद रखें,)असली बूट "प्रक्रिया"। इस बिंदु पर, आप रैम का उपयोग बिल्कुल नहीं करते हैं - यह सब सिर्फ मैप किया गया ROM है। वास्तव में, RAM इस बिंदु पर उपयोग करने के लिए तैयार नहीं है - यह BIOS POST की नौकरियों में से एक है! अब, आप सोच रहे होंगे - 0xFFFFFFF0 पते पर 16-बिट वास्तविक मोड कैसे पहुंचता है? ज़रूर, वहाँ सेगमेंट हैं, इसलिए आपके पास 20-बिट एड्रेस स्पेस है, लेकिन यह अभी भी पर्याप्त नहीं है। खैर, इसके लिए एक चाल है - पते के 12 उच्च बिट्स तब तक सेट होते हैं जब तक आप अपनी पहली लंबी कूद निष्पादित नहीं करते हैं, आपको उच्च पता स्थान तक पहुंच प्रदान करते हैं (0xFFF00000 से कम कुछ तक पहुंच को अस्वीकार करते हुए - जब तक आप एक लंबी कूद निष्पादित नहीं करते हैं ।
यह सभी चीजें हैं जो आधुनिक ऑपरेटिंग सिस्टम पर प्रोग्रामर (उपयोगकर्ताओं का उल्लेख नहीं करने के लिए) से छिपी हुई हैं। आपके पास आमतौर पर किसी भी चीज़ के इतने निचले स्तर तक पहुंच नहीं है - कुछ चीजें पहले से ही निस्तारण से परे हैं (आप सीपीयू मोड को विली-नीली स्विच नहीं कर सकते हैं), कुछ विशेष रूप से ओएस कर्नेल द्वारा नियंत्रित किए जाते हैं।
तो एक अच्छा विचार एमएस डॉस पर पुराने स्कूल कोडिंग से आता है। डिवाइस मेमोरी का एक और विशिष्ट उदाहरण सीधे अंतरिक्ष को संबोधित करने के लिए मैप किया जा रहा है जो वीडियो मेमोरी तक सीधी पहुंच है। उदाहरण के लिए, यदि आप डिस्प्ले फास्ट पर टेक्स्ट लिखना चाहते हैं, तो आपने सीधे एड्रेस B800:0000
(प्लस ऑफसेट - 80x25 टेक्स्ट मोड में लिखा है, इसका मतलब है कि (y * 80 + x) * 2
अगर मेरी मेमोरी मुझे राइट - टू बाइट्स प्रति कैरेक्टर, लाइन बाय लाइन)। यदि आप पिक्सेल-दर-पिक्सेल खींचना चाहते हैं, तो आपने ग्राफिक्स मोड और A000:0000
(आमतौर पर पिक्सेल के 8 बिट्स पर 320x200) के प्रारंभ पते का उपयोग किया । कुछ भी उच्च-प्रदर्शन करने का मतलब आमतौर पर डिवाइस मैनुअल में डाइविंग करना होता है, यह पता लगाने के लिए कि उन्हें सीधे कैसे एक्सेस किया जाए।
यह आज तक जीवित है - यह सिर्फ छिपा हुआ है। विंडोज पर, आप डिवाइस मैनेजर में डिवाइसों को मैप किए गए मेमोरी एड्रेस देख सकते हैं - सिर्फ आपके नेटवर्क कार्ड जैसी किसी चीज़ के खुले गुण, संसाधन टैब पर जाएं - सभी मेमोरी रेंज आइटम डिवाइस मेमोरी से आपके मुख्य एड्रेस स्पेस में मैपिंग होते हैं। और 32-बिट पर, आप देखेंगे कि उन उपकरणों में से अधिकांश 2 GiB (बाद में 3 GiB) चिह्न के ऊपर मैप किए गए हैं - फिर से, उपयोगकर्ता-उपयोग करने योग्य मेमोरी के साथ संघर्ष को कम करने के लिए, हालांकि यह वास्तव में वर्चुअल मेमोरी के साथ कोई समस्या नहीं है ( अनुप्रयोगों को वास्तविक, हार्डवेयर पता स्थान के पास कहीं भी नहीं मिलता है - उनके पास स्मृति का अपना वर्चुअलाइज्ड हिस्सा है, जिसे RAM, ROM, डिवाइस या पेज फ़ाइल में मैप किया जा सकता है, उदाहरण के लिए)।
स्टैक के लिए, ठीक है, यह समझने में मदद करनी चाहिए कि डिफ़ॉल्ट रूप से, स्टैक ऊपर से बढ़ता है। इसलिए यदि आप एक करते हैं push
, तो नया स्टैक पॉइंटर होगा 0xFFFFFEC
- दूसरे शब्दों में, आप BIOS इनिट एड्रेस पर लिखने की कोशिश नहीं कर रहे हैं :) जो निश्चित रूप से इसका मतलब है कि BIOS इनइट रूटीन स्टैक का सुरक्षित रूप से उपयोग कर सकता है, इसे रीमैप करने से पहले कहीं अधिक उपयोगी है। पुराने स्कूल प्रोग्रामिंग में, पेजिंग वास्तविक रूप से डिफ़ॉल्ट होने से पहले, आमतौर पर स्टैक रैम के अंत में शुरू होता था, और जब आप अपनी एप्लिकेशन मेमोरी को ओवरराइट करना शुरू करते हैं, तो "स्टैक ओवरफ्लो" होता है। मेमोरी सुरक्षा ने इसे बहुत बदल दिया, लेकिन सामान्य तौर पर, यह यथासंभव पीछे की संगतता बनाए रखता है - ध्यान दें कि कैसे सबसे आधुनिक x86-64 सीपीयू अभी भी एमएस डॉस 5 को बूट कर सकता है। - या कैसे Windows अभी भी कई डॉस एप्लिकेशन चला सकता है जिनके पास पेजिंग के बारे में कोई विचार नहीं है।