2011-09-07 8 views
6

मुझे एक बहुत मुश्किल समस्या का सामना करना पड़ रहा है। मैं एक ही भौतिक स्मृति को इंगित करने वाले 2 आभासी स्मृति क्षेत्रों को प्राप्त करने का प्रयास कर रहा हूं। बिंदु विभिन्न मेमोरी क्षेत्रों पर अलग-अलग पेज सुरक्षा पैरामीटर रखना है।लिनक्स पर एक ही भौतिक स्मृति पर दो वर्चुअल एड्रेस को कैसे मैप करें?

इस मंच पर, उपयोगकर्ता एक समाधान है लगता है, लेकिन यह थोड़े hacky लगता है और यह बहुत स्पष्ट है कि कुछ बेहतर किया जा सकता है है प्रदर्शन के लिहाज से: http://www.linuxforums.org/forum/programming-scripting/19491-map-two-virtual-memory-addres-same-physical-page.html

मैं एक ही समस्या का सामना कर रहा हूँ के रूप में, मैं यह जानने के लिए यहां एक शॉट देना चाहता हूं कि किसी के पास बेहतर विचार है या नहीं। हुड के पीछे गंदे विवरण का जिक्र करने से डरो मत, यह सवाल यही है।

अग्रिम धन्यवाद।

उत्तर

3

मैं एक ही भौतिक स्मृति पर इंगित 2 वर्चुअल मेमोरी एरिया प्राप्त करने की कोशिश कर रहा हूं।

mmap एक ही फाइल में एक ही क्षेत्र, दो बार, या System V shared memory का उपयोग (जो स्मृति में एक फ़ाइल मानचित्रण आवश्यकता नहीं है)।

+0

देखना यह और भी बदतर है। यदि MAP_SHARED निर्दिष्ट किया गया है, तो IO की आवश्यकता होगी और यदि MAP_PRIVATE सेट किया गया है, तो लिखने पर प्रतिलिपि चाल को निष्क्रिय कर देगा। समाधान में थ्रेड में प्रस्तावित समाधान की तुलना में एक ही कमी है: इस साझा स्मृति को अनियंत्रित तरीके से प्रक्रिया में पार किया जाता है। – deadalnix

+0

@deadalnix: सिस्टम वी एसएचएम पर एक नोट जोड़ा गया। AFAIK हैं, उपयोगकर्ता स्थान में ऐसा करने के अन्य तरीके नहीं हैं। –

+0

@ लार्समार> हाँ सिस्टम वी कॉल लिंक में सुझाए गए हैं। यह काम कर रहा है, लेकिन स्मृति को किसी अन्य प्रक्रिया द्वारा आसानी से लगाया जा सकता है, जो सुरक्षा पर समस्याग्रस्त है। – deadalnix

3

मुझे लगता है कि यदि आप एसआईएस वी साझा नापसंद को नापसंद करते हैं तो आप POSIX shared memory objects का उपयोग कर सकते हैं। वे बहुत लोकप्रिय नहीं हैं लेकिन कम से कम लिनक्स और बीएसडी पर उपलब्ध हैं।

एक बार जब आप shm_open के साथ एक एफडी प्राप्त करते हैं तो आप तुरंत shm_unlink पर कॉल कर सकते हैं। फिर कोई भी अन्य प्रक्रिया उसी साझा स्मृति से संलग्न नहीं हो सकती है, और आप इसे कई बार mmap कर सकते हैं। फिर भी एक छोटी दौड़ अवधि उपलब्ध है।

+0

हाहा, ऐसा नहीं है कि मैं एसआईएसवी को नापसंद करता हूं। जो मुझे नापसंद है वह उस चीज़ को प्राप्त करने के लिए स्मृति साझाकरण को सक्षम करना है जिसके साथ कुछ भी नहीं है। – deadalnix

1

आप रूट हैं, तो आप कर सकते हैं mmap("/dev/mem", ...) लेकिन वहाँ नए कर्नेल में चेतावनियां हैं, accessing mmaped /dev/mem?

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