2012-03-27 9 views
10

मैंने एक लिनक्स ड्राइवर लिखा है कि ioremaps एक विशेष डिवाइस के लिए पीसीआई बीएआर 0 को एक sysfs बाइनरी विशेषता के लिए निर्यात करता है जो उपयोगकर्ताओं को सीधे इसे नियंत्रित करने की इजाजत देता है।एमएमएपी को कैशिंग मूल्यों से कैसे रोक देगा?

समस्या तब होती है जब मैं सीधे उस बिट मेमोरी (उपयोगकर्तालैंड प्रोग्राम से) तक पहुंचने के लिए विशेषता के शीर्ष पर एमएमएपी का प्रयास करता हूं। पढ़ना ठीक है और अपेक्षित मूल्यों को वापस लौटाता है, हालांकि जब मैं उस स्मृति को लिखता हूं तो यह कर्नेल और मेमोरी के बीच कहीं कैश किया जाता है और जीएमसीएच रूट कॉम्प्लेक्स (और इसलिए डिवाइस) को वितरित नहीं किया जाता है। मैं क्या करना चाहता हूं प्रत्येक पहुंच के बाद एक अंतर्निहित लेखन स्मृति बाधा है।

  • क्या कर्नेल को कैशिंग से स्मृति को एमएमएपी-एड बिट में लिखने से रोकने का कोई तरीका है?

का पालन करें अप:

  • msync() हर के बाद बुला तक पहुंच तरीका यह है "स्वीकार किए जाते हैं"?
+1

फॉलो-अप का उत्तर देने के लिए ... आपको यहां msync() 'की आवश्यकता नहीं है क्योंकि mmap का बैकिंग करने वाली कोई फ़ाइल नहीं है। हालांकि आपको कुछ चीजों के लिए कुछ आर्किटेक्चर विशिष्ट निर्देशों की आवश्यकता हो सकती है ... उदाहरण के लिए Powerpc पर हार्डवेयर एक्सेस के सही क्रम को सुनिश्चित करने के लिए आपको [eieio] (https://www-01.ibm.com/support/knowledgecenter) की आवश्यकता हो सकती है /ssw_aix_61/com.ibm.aix.alangref/idalangref_eieio_instrs.htm) निर्देश (किसी को हास्य की भावना है :-) ... एक ही टिप्पणी की गई [यहां] (https://unix.stackexchange.com/questions/237783/ तक पहुँचने-स्मृति-मैप किया-कब-है-धीमी गति से)। –

उत्तर

19

आगे बढ़ने के लिए जा रहे हैं और मेरे समाधान के साथ इसे स्वयं जवाब दें।

मेरे sysfs mmap फ़ंक्शन से कर्नेल ड्राइवर में,/include/asm/pgtable.h में एक मैक्रो है जो nocache'd pfn remap के लिए उचित झंडे सेट करता है। यह इस तरह दिखता है:

vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); 
if (io_remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff, 
       vma->vm_end - vma->vm_start, 
       vma->vm_page_prot)) 
    return -EAGAIN; 

साथ ही, userland mmap में, मैं MAP_SHARED झंडा mmap झंडे तर्क में इस्तेमाल किया।

दोनों के संयोजन ने अंततः चाल की।

+0

Thx इतना आदमी! मुझे आपके जैसा ही समस्या थी और समाधान नहीं मिला ... – Julien

+1

+1 मेरे लिए भी काम किया। एक बार आपको यह समाधान मिलने के बाद समाधान पोस्ट करने के लिए समय निकालने के लिए धन्यवाद। :-) – TheCodeArtist

+0

धन्यवाद भाई, यह वही था जो मैं ढूंढ रहा था! – Luca

0

मई ioremap_nocache() मदद कर सकता है?

+0

मैं कर्नेल पृष्ठों को उपयोगकर्ता स्पेस पते में रीमेप और अनुवाद करने के लिए io_remap_pfn_range का उपयोग कर रहा हूं। मैंने देखा है (और उपयोग कर रहा हूं) ioremap_nocache() कहीं और और मैन्युअल रूप से प्रत्येक पृष्ठ पर KERNEL_NOCACHE विशेषता सेट करता है। मुझे io_remap_pfn_range का उपयोग करके उस घटना का कोई उल्लेख नहीं है (या सेट करने के लिए ध्वज)। –

+1

अतिरिक्त: ioremap_nocache() का उपयोग केवल आईओ मेमोरी को कर्नेल स्पेस में मैप करने के लिए किया जाता है और उपयोगकर्ता स्पेस में नहीं - यही कारण है कि io_remap_pfn_range आसान है। –

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