2012-02-09 9 views
7

के माध्यम से स्मृति को अनचेक के रूप में सेट करें, मैं उपयोगकर्ता-स्पेस प्रक्रिया के भीतर से अनचाहे (लिनक्स, x86-86) के रूप में स्मृति की एक श्रृंखला सेट करना चाहता हूं। This question करीब आता है, लेकिन केवल एमटीआरआर रजिस्टरों का उल्लेख करता है जो भौतिक स्मृति के साथ काम करते हैं। मैं पीएटी टेबल का उपयोग करके ऐसा करना चाहता हूं क्योंकि वे बेहतर अनाज वाले नियंत्रण की पेशकश करते हैं, वे पृष्ठ-दर-पृष्ठ आधार पर वर्चुअल मेमोरी को बिना किसी अक्षम करने की अनुमति देते हैं।x86 पीएटी तालिका

लिनक्स प्रलेखन, Documentation/x86/pat.txt, सुझाव देता है कि mmap और SYNC ध्वज के साथ कुछ होना चाहिए, लेकिन मुझे यह नहीं पता कि अभ्यास में यह कैसे किया जाए। आदर्श रूप से, मैं mprotect(address, range, O_UNCACHABLE) जैसे कॉल का उपयोग करना चाहता हूं।

+0

'पागलपन'/'mlock' पर्याप्त हैं? –

+0

नहीं, ऐसा लगता है कि ये केवल वर्चुअल मैपिंग को प्रभावित करते हैं (चाहे पृष्ठ रैम या डिस्क पर हों), लेकिन वे कैशिंग को प्रभावित नहीं करते हैं ... – Wim

+0

हां, मुझे गलत समझा गया। :( –

उत्तर

2

मैं उपयोगकर्ता-स्तरीय प्रक्रिया के लिए आवश्यक इंटरफ़ेस प्रदान करने के लिए कर्नेल मॉड्यूल लिखने की अनुशंसा करता हूं। कर्नेल मॉड्यूल के अंदर आप पेज गुणों को नियंत्रित करने के लिए set_memory_uc का उपयोग कर सकते हैं।

सिम्युलेटर के बारे में: यह लगभग दस से हज़ार गुना धीमा होना चाहिए-दस लाख बार नहीं - जब तक आप गेट स्तर पर अनुकरण नहीं करते। कर्नेल मॉड्यूल लिखने के लिए आपको लगता है कि समय पर विचार करना न भूलें। यदि मॉड्यूल लिखने और डीबग करने में आपको कुछ सप्ताह लगते हैं तो आप एक बार प्रयोग के लिए सिम्युलेटर का उपयोग करना बेहतर कर सकते हैं।

0

एआरएम प्लेटफार्मों पर विभिन्न डेवलपर्स सवालों के अनुसार कोड होगा:

fd = open("/dev/mem", O_RDWR|O_SYNC); 
uptr = mmap(addr, length, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_LOCKED, fd, off); 

रेफरी:

+0

इसके साथ कोड आप एक भौतिक पता सीमा तक पहुंच सकते हैं लेकिन आपको इसे आरक्षित करना होगा या किसी भी तरह कर्नेल को इसका उपयोग न करने के लिए कहें। यदि आप बुरी चीजें नहीं करेंगे ... –

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