2012-07-23 8 views
7

पर भौतिक पते मैपिंग मैं एक छोटी एम्बेडेड सिस्टम पर काम कर रहा हूं। जब मेरा लिनक्स उपयोगकर्ता स्थान में बूट हो जाता है, तो मुझे पता है कि भौतिक स्मृति में मेरे डिवाइस कहां हैं। मैं उन्हें उपयोगकर्ता स्थान वर्चुअल पतों में मैप करना चाहता हूं। वर्तमान में, मैं इसे कर्नेल मॉड्यूल के माध्यम से कर रहा हूं। मैं vmalloc/kmalloc (आकार के आधार पर) का उपयोग करता हूं और फिर मैं अपने भौतिक पते को मैप करने के लिए वर्चुअल पतों पर लौटने वाले ioremap_page_range का उपयोग करता हूं। मुझे नहीं लगता कि यह जाने का सही तरीका है। सबसे पहले मैं स्मृति आवंटित कर रहा हूं और फिर मैं कर्नेल से उस वर्चुअल एड्रेस स्पेस को कुछ अलग भौतिक पता स्थान पर रीमेप करने के लिए कह रहा हूं। (प्रारंभ में मैप किए गए भौतिक-> vmcall/kmalloc में आभासी थोड़े बेकार है क्योंकि मुझे उन भौतिक पृष्ठों की परवाह नहीं है। यह निश्चित रूप से अच्छा नहीं है।)वर्चुअल एड्रेस लिनक्स

इसके बजाए ज्ञात भौतिक स्मृति को उपयोगकर्ता में मैप करने का एक बेहतर तरीका है अंतरिक्ष प्रक्रिया।

धन्यवाद

उत्तर

5

तुम क्या करने कोशिश कर रहे हैं पहुँचने क्या आईओ स्मृति कहा जाता है। मैं केवल लिनक्स डिवाइस ड्राइवर (LDD) पुस्तक और अधिक विशेष अध्याय 9.

"आवंटित" करने के लिए इस तरह के एक क्षेत्र को पढ़ने के लिए प्रोत्साहित कर सकते हैं, तो आप

struct resource *request_mem_region(unsigned long start, unsigned long len, char *name) 

कॉल करने के लिए की जरूरत है। इससे पहले अपने ड्राइवर उस तक पहुँच सकते हैं, आप इसे एक आभासी पता निर्दिष्ट करने के लिए है, इस

void *ioremap(unsigned long phys_addr, unsigned long size) 

के लिए एक कॉल के साथ किया जाता यह सुनिश्चित करने के लिए अपने ड्राइवर तो, विभिन्न आर्किटेक्चर/प्लेटफार्मों पर काम करेगा कुछ एक्सेसर का उपयोग सुनिश्चित करें ऐसे क्षेत्रों में कार्य (ioread8/16/32 या iowrite8/16/32 और उनके सभी प्रकार)।

3

कर्नेल मॉड्यूल में, remap_pfn_range() आभासी पता करने के लिए भौतिक पता परिवर्तित करने के लिए इस्तेमाल किया जा सकता (मैं अपने उपयोगकर्ता अंतरिक्ष प्रक्रिया के अलावा अन्य पता है, कोई भी स्पर्श कि स्मृति। वाला)। निम्नलिखित लिंक सहायक होगा।

How remap_pfn_range remaps kernel memory to user space?

+0

मुझे remap_pfn करने से पहले मुझे mmap करने की आवश्यकता है। हालांकि, मैं ऐसा नहीं करना चाहता। मेरे पास उस स्मृति से जुड़ा डिवाइस नहीं है। इसलिए, मैं सीधे उस भौतिक स्मृति को आभासी पते पर मैप करना चाहता हूं। धन्यवाद –

0

कर्नेल मॉड्यूल में, remap_pfn_range() का उपयोग भौतिक पते को आभासी पते में बदलने के लिए किया जा सकता है। जब आपके पास वास्तविक डिवाइस नहीं हैं तो आप कर सकते हैं: 1) वर्चुअल डिवाइस बनाएं और 2) उस प्रक्रिया के remap_pfn_range वर्चुअल मैपिंग के माध्यम से उसी कर्नेल मेमोरी तक पहुंचने के लिए उन वर्चुअल डिवाइसों पर mmap का उपयोग करें। 3) आमतौर पर समर्पित वातावरण में आप अतिरिक्त भौतिक पृष्ठों को पिन करना चाहते हैं ताकि वे आपकी प्रक्रिया से दूर हो जाएं। 4) आप इन भौतिक पतों को विभिन्न प्रक्रियाओं के साथ भी साझा करते हैं लेकिन अन्य आईपीसी तंत्रों के माध्यम से स्वतंत्र रूप से सिंक्रनाइज़ेशन को संभालने की आवश्यकता होगी क्योंकि वे प्रत्येक प्रक्रिया के रूप में अलग-अलग पते के रूप में देखेंगे।

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