2012-03-13 39 views
43

मैं बूट लोडर और सिस्टम के लिए दप नया नहीं हूँ, लेकिन मैं कारण के मूल पता नहीं है क्यों सामान्य कार्यक्रम 0x8000 पर शुरू होता है। मुझे पता है कि पता 0x8000 सामान्य सी/सी ++ कार्यक्रम में प्रारंभ पते के रूप में उपयोग किया गया है।सामान्य कार्यक्रम आमतौर पर 0x8000 पर क्यों शुरू होता है?

एक सामान्य कार्यक्रम के लिए बूटलोडर का न्यूनतम आकार 0x8000 तक का समय लग रहा है? या ROM का न्यूनतम ब्लॉक आकार है जिसे बूटलोडर 32 केबी को आवंटित किया जाना चाहिए? या कोई और कारण है?

मैं देखने के एक आभासी पते बिंदु से, इस बारे में जानना चाहते हैं ऐतिहासिक या तार्किक, और।


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

मैं मूल रूप से देखने का भौतिक स्मृति पते के बिंदु से आर की राय से सहमत हैं।

विविध विशिष्ट प्रणाली कहने के बिना, उदाहरण के लिए लिनक्स (यहां तक ​​कि एंड्रॉइड में), सामान्य आरटीओएस (न्यूक्लियस, और अन्य, विशेष रूप से एआरएम लिंकर सेक्शन), वे सभी एड्रेस एड्रेस जनरल प्रोग्राम के रूप में पता 0x8000 का उपयोग करते हैं। जैसे कि crt_begin.o, crt.o, आदि नामक इस क्षेत्र में लोडर के साथ 0x0 पर स्थित है।

इसलिए मुझे लगता है कि सामान्य प्रोग्राम के लिए बूटलोडर का न्यूनतम आकार 32 केबी ब्लॉक आकार पर विचार कर रहा है यदि यह बूट समय (बूट बूट) में बूटरोम में स्थित होगा।

Ummm, लेकिन मुझे यकीन है नहीं कर रहा हूँ ...

+16

आप यहां किस प्रणाली के बारे में बात कर रहे हैं? –

+2

मेरे पास इसके लिए कोई विश्वसनीय स्रोत नहीं है, लेकिन मैं एक योग्य अनुमान लगा सकता हूं। 0xFF के लिए अनुदेश समर्थन प्राप्त था - ऐतिहासिक कई प्रोसेसर, विशेष रूप से 8 बिट, सुविधा कहते हैं [शून्य पेज] (http://en.wikipedia.org/wiki/Zero_page) जिसका अर्थ है कि पतों 0x00 पर स्मृति कोशिकाओं पड़ा है तेजी से निष्पादित करें। मेरा मानना ​​है कि यह मोटोरोला द्वारा दिनों में वापस पेश किया गया था, क्योंकि उनके पास पुराने एमसीयू पर 6800 की तरह मेमोरी मैप किए गए I/O रजिस्ट्रार थे। -> – Lundin

+2

इसलिए आप चाहते हैं कि मेमोरी का पहला क्षेत्र राम कोशिकाओं या विशेष रजिस्टरों द्वारा कब्जा कर लिया जाए । यह तब समझ में आता है कि शून्य पृष्ठ के बाद आने वाले पता स्थान का हिस्सा एक ही प्रकृति का है: रैम और/या पंजीयक। यह बहुत सारे केबी ले जाएगा, शायद 0x6000 या कुछ ऐसे। मुझे लगता है कि रोम (प्रोग्राम मेमोरी) को किसी भी पते पर रखना सुविधाजनक था और 0x8000 सुविधाजनक था। मैं काफी हद तक निश्चित हूं कि इस प्रश्न का उत्तर मोटोरोला प्रोसेसर डिज़ाइनों में पाया जा सकता है। – Lundin

उत्तर

19

सामान्य में, सभी पर लेकिन छोटी से छोटी एम्बेडेड सिस्टम, मंच ABI डिजाइनर कभी उपयोग में सबसे कम पते रखना ताकि नल पॉइंटर dereferences हो सकता है से बचने के लिए चाहता है फंस गया। null_ptr->some_member में, जैसा कि शून्य सूचक को किसी सरणी या संरचना सदस्य ऑफसेट के साथ संदर्भित किया गया है, के कई KB के कभी-कभी मान्य पते आपको कुछ अतिरिक्त सुरक्षा प्रदान नहीं करते हैं।

+3

मुझे विश्वास नहीं है कि यही कारण है, मैंने कई एम्बेडेड सिस्टमों के साथ काम किया है जहां पता 0 मान्य और एड्रेसेबल मेमोरी है, जबकि साथ ही एनवीएम 8000 पर शुरू होता है। – Lundin

+5

... विशेष रूप से जब पता 0x8000 सी से पहले मौजूद था भाषा और नल पॉइंटर्स लोकप्रिय हो गए। सी से पहले भी आविष्कार किया गया था? – Lundin

+0

जैसा कि मैं इसे समझता हूं, आप नहीं चाहते हैं कि "असली" पॉइंटर्स 0 हो, कभी भी, उन सिस्टमों पर भी जहां एचडब्ल्यू इसके साथ ठीक है। इसलिए, यदि 'malloc()' 0 देता है, तो आप जानते हैं कि यह असफल रहा। ऐसे सिस्टम पर जहां पता 0 जाल नहीं करता है, स्मृति आमतौर पर विशिष्ट उद्देश्यों जैसे इंटरप्ट हैंडलर के लिए आवंटित की जाती है। – MSalters

6

यह सिस्टम पर निर्भर करता है, और कार्यक्रम विभिन्न प्रणालियों पर विभिन्न पते पर शुरू होते हैं। यूनिक्स के तहत, यह हमेशा की तरह (या शायद Posix के लिए आवश्यक) अशक्त सूचक के रूप में पता 0 उपयोग करने के लिए, और आभासी स्मृति के पहले पृष्ठ मैप नहीं है, ताकि एक अशक्त सूचक dereferencing की इच्छा एक खंड उल्लंघन में परिणाम। मैं एक अशक्त सूचक व्यवहार के रूप में पता 0 का उपयोग कर अन्य प्रणालियों इसी तरह (लेकिन वे कितना भिन्न हो सकते हैं आरक्षित) है कि संदेह है। (ऐतिहासिक, यह के रूप में केवल पढ़ने के पहले पृष्ठ मैप करने के लिए हमेशा की तरह था, और शून्य से इसे भरने, कि एक अशक्त सूचक के रूप में अगर इसे रिक्त स्ट्रिंग, "" के लिए सूचक थे कैसा व्यवहार करेंगे करते हैं। यही कारण है कि लगभग 25 साल पहले हो रहा है , तथापि।)

मैं उम्मीद होती है कि आज भी, कुछ एम्बेडेड सिस्टम पते पर शुरू प्रोग्राम लोड करते 0.

2

मैं मामलों पहले 32K पर नज़र रखता है के लिए आरक्षित किया गया था का एक बहुत में संदेह था कोड/राम उपयोग। 8051 eval बोर्डों में निवासी मॉनिटर (कुछ जो डीबगर्स के रूप में भी काम करते थे) के आधार पर सभी ऐप्स के लिए 0x1000 या 0x2000 पर डिफ़ॉल्ट रूप से असामान्य नहीं था।

32K अपने यू-बूट/आदि लोडर अंतरिक्ष हो सकता है।

3

यह कुछ हद तक मनमाने ढंग से है, और लिनक्स पर, कम से कम लिंकर द्वारा निर्णय लिया। सामान्य विचार है कि नल पॉइंटर अपवादों को पकड़ने के लिए कुछ जगह आरक्षित करना है। कर्नेल स्पेस को रोकने में मदद करने के लिए कर्नेल मोड में मनमानी उपयोगकर्ता कोड निष्पादित करने से नल पॉइंटर अवधारणाएं, लिनक्स आपको स्मृति के बहुत नीचे मैपिंग से रोकती है। /proc/sys/vm/mmap_min_addr आपके द्वारा मानचित्रित किए जाने वाले निम्नतम पते को नियंत्रित करता है (यदि आप चाहें तो 0 को 0 पर बदल सकते हैं और 0 पर एक पृष्ठ को मानचित्र कर सकते हैं)।

linux पर आप /proc में देख कर स्मृति मानचित्रण देख सकते हैं। उदाहरण के लिए,

genwitt ~> cat /proc/self/maps 
00400000-0040c000 r-xp 00000000 08:01 354804        /bin/cat 
0060b000-0060c000 r--p 0000b000 08:01 354804        /bin/cat 
0060c000-0060d000 rw-p 0000c000 08:01 354804        /bin/cat 
01dda000-01dfb000 rw-p 00000000 00:00 0         [heap] 
7f5b25913000-7f5b25a97000 r-xp 00000000 08:01 435953      /lib64/libc-2.14.1.so 
7f5b25a97000-7f5b25c97000 ---p 00184000 08:01 435953      /lib64/libc-2.14.1.so 
7f5b25c97000-7f5b25c9b000 r--p 00184000 08:01 435953      /lib64/libc-2.14.1.so 
7f5b25c9b000-7f5b25c9c000 rw-p 00188000 08:01 435953      /lib64/libc-2.14.1.so 
7f5b25c9c000-7f5b25ca1000 rw-p 00000000 00:00 0 
7f5b25ca1000-7f5b25cc2000 r-xp 00000000 08:01 436061      /lib64/ld-2.14.1.so 
7f5b25cd2000-7f5b25e97000 r--p 00000000 08:01 126248      /usr/lib64/locale/locale-archive 
7f5b25e97000-7f5b25e9a000 rw-p 00000000 00:00 0 
7f5b25ec0000-7f5b25ec1000 rw-p 00000000 00:00 0 
7f5b25ec1000-7f5b25ec2000 r--p 00020000 08:01 436061      /lib64/ld-2.14.1.so 
7f5b25ec2000-7f5b25ec3000 rw-p 00021000 08:01 436061      /lib64/ld-2.14.1.so 
7f5b25ec3000-7f5b25ec4000 rw-p 00000000 00:00 0 
7fff18c37000-7fff18c58000 rw-p 00000000 00:00 0       [stack] 
7fff18d0c000-7fff18d0d000 r-xp 00000000 00:00 0       [vdso] 
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0     [vsyscall]
2

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

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

  • कोई संबंधित समस्या नहीं^_^