एक चर के लिए एक स्मृति पता मानचित्र [डुप्लिकेट]
उस मेमोरी स्थान पर एक संरचना बनाने के लिए मैं चर के लिए मेमोरी एड्रेस को कैसे मैप करूं? मैंने दिए गए मेमोरी एड्रेस पर एक स्ट्रक्चर बनाने के लिए कोड के निम्नलिखित टुकड़े की कोशिश की, लेकिन यह सिर्फ़ सेगमेंटेशन दोष को कम करता है?
कोड में मेमोरी लोकेशन एक इनपुट क्षेत्र है, जहाँ मुझे कुछ डेटा सेट करने और एक ओपकोड के साथ डोरबेल बजाने की आवश्यकता होती है, ताकि CPU इनपुट डेटा को उठा सके और इनपुट क्षेत्र में डेटा के साथ वह क्या कहता है
some_struct* some_struct_obj= (some_struct*)0xc321000000;
memset(some_struct_obj, 0x00, sizeof(some_struct));
जवाब
एक चर के लिए एक स्मृति पता मानचित्र
किसी भी चर का सटीक स्थान चुनने के लिए C ++ में कोई तरीका नहीं है। आप केवल संग्रहण वर्ग चुन सकते हैं: स्वचालित, स्थिर या थ्रेड स्थानीय। भाषा कार्यान्वयन पता चुनता है।
उस स्मृति स्थान पर एक संरचना बनाने के लिए मैं कैसे एक स्मृति पते को मैप करूं?
जब तक कि मेमोरी आवंटित की जाती है, तब तक किसी भी मेमोरी एड्रेस में डायनेमिक स्टोरेज (जो कि वैरिएबल नहीं है) के साथ ऑब्जेक्ट बनाना संभव है और इसमें नॉन-ट्रिवियल ऑब्जेक्ट नहीं होते हैं। इसे प्लेसमेंट नई अभिव्यक्ति, या कुछ मानक कार्यों का उपयोग करके प्राप्त किया जा सकता है जो प्लेसमेंट को आंतरिक रूप से नया बनाते हैं।
स्मृति को मनमाने पते से आवंटित करने के लिए मानक C ++ में कोई रास्ता नहीं है। भाषा कार्यान्वयन चर और गतिशील वस्तुओं के लिए स्मृति आवंटित करने का ध्यान रखता है।
वर्चुअल मेमोरी के बिना एम्बेडेड सिस्टम पर, भाषा कार्यान्वयन विशिष्ट मेमोरी एड्रेस रेंज को आवंटित के रूप में दस्तावेज कर सकता है। ऐसे मामले में, आप बस उस मेमोरी में ऑब्जेक्ट बनाने के लिए प्लेसमेंट नए का उपयोग कर सकते हैं। ऐसे पतों का उपयोग अन्य प्रणालियों के लिए पोर्टेबल नहीं होगा।
गैर-मानक तरीके के बारे में कैसे? हाँ, यह मौजूद हो सकता है। उदाहरण के लिए, POSIX मानक mmap
कार्य निर्दिष्ट करता है:
pa=mmap(addr, len, prot, flags, fildes, off);
पैरामीटर
flags
मैप किए गए डेटा की हैंडलिंग के बारे में अन्य जानकारी प्रदान करता है। झंडे का मूल्य इन विकल्पों में से बिटवाइन-समावेशी OR है, जिसे <sys / mman.h> में परिभाषित किया गया है:Symbolic Constant Description MAP_SHARED Changes are shared. MAP_PRIVATE Changes are private. MAP_FIXED Interpret addr exactly.
जब
MAP_FIXED
झंडे के तर्क में सेट किया जाता है, तो कार्यान्वयन को सूचित किया जाता है कि पा का मूल्यaddr
वास्तव में होगा।
हालांकि लिनक्स मैनपेसेज से निम्नलिखित पर विचार करें:
इसके लिए एकमात्र सुरक्षित उपयोग
MAP_FIXED
वह है जहांaddr
पहले और लंबाई द्वारा निर्दिष्ट पते की सीमा एक और मानचित्रण का उपयोग करके आरक्षित की गई थी; अन्यथा, उपयोगMAP_FIXED
खतरनाक है क्योंकि यह जबरन preexisting मैपिंग को हटा देता है, जिससे एक मल्टीथ्रेड प्रक्रिया के लिए अपना स्वयं का पता स्थान दूषित करना आसान हो जाता है।