2015-12-27 9 views
5

मेरे पास एक कस्टम ड्राइवर है जिसे मैंने लिखा है ताकि उपयोगकर्ता भूमि में सटीक हार्डवेयर रैम मेमोरी पतों की कस्टम मैपिंग को सुविधाजनक बनाया जा सके। मैं उस सामान्य स्मृति को परीक्षण करने की कोशिश कर रहा हूं mmap'd जैसा कि दो प्रक्रियाओं के बीच एक ही हार्डवेयर पते पर साझा किया गया है, दृश्यमान स्मृति संचालन को सुविधाजनक बनाता है जो प्रत्येक पक्ष देख सकता है।वर्चुअल डिवाइस ड्राइवर में वर्चुअल मेमोरी में मेरा लेखन क्यों दिखाई नहीं दे रहा है?

//placement: in a mmap callback to a file_operations facilitated 
    // character device 
    //phys_addr - a variable that I will ioremap for a virtual addr 
    virtaddr = ioremap(phys_addr, size); 
    if (!virtaddr) { 
    printk(KERN_INFO "could not remap page!"); 
    goto out; 
    } else { 
    printk(KERN_INFO "attempting write"); 
    *((int *)virtaddr) = 0xdeadbeef; 
    //wmb(); <--- I haven't tried this yet 
    } 

यह इतना पता चला है के रूप में, मैंने सोचा कि शायद इस मुद्दे को राम को फ्लश करने के लिए कैश के लिए मजबूर करने के लिए एक लिखने बाधा की कमी थी:

मेरे कोड लगभग कुछ इस तरह है। मुझे इस प्रश्न के दायरे से बाहर ओएस विनिर्देशों के कारण कुछ विशेष हार्डवेयर पर परीक्षण बूट करना होगा। मुझे नहीं लगता कि लिखने की बाधाएं मुख्य मेमोरी या रैम पर लागू होती हैं जैसे कि यह डिवाइस रजिस्टरों या डिवाइस मेमोरी के लिए होती है (उदा: एसएसडी या कुछ पर कैश)। तो, मैंने wmb का परीक्षण नहीं किया है, लेकिन मैं बस वहां अपना प्रश्न प्राप्त करना चाहता था। मैंने लिनक्स डिवाइस ड्राइवर्स 3 पुस्तक के माध्यम से कुछ के आसपास भी खोज की है, और मैंने अपना कोड निष्पादित किया है; जिस टुकड़े से मैं खींच रहा हूं वास्तव में निष्पादन में है और मुझे पता है क्योंकि मैं प्रिंटक देख सकता हूं। चालक कोड निष्पादित करता है, लेकिन फिर चल रहा है। आखिरकार, कोड का एक समान टुकड़ा है जो हार्डवेयर मेमोरी के एक सामान्य टुकड़े पर इयरमैप पर प्रदर्शन करता है, जिसे वह तब से पढ़ने की कोशिश करता है। उस पठन में वह मान नहीं है जिसे मैंने लिखा था।

क्यों?

+2

मुझे नहीं लगता कि आपको ऐसा करना चाहिए। उदाहरण के लिए, मुझे लगता है, "याद रखें, हालांकि, ioremap से लौटाए गए पते को सीधे संदर्भित नहीं किया जाना चाहिए; इसके बजाय, कर्नेल द्वारा प्रदान किए गए एक्सेसर फ़ंक्शंस का उपयोग" makelinux.net] पर http डिवाइस लिखने की चर्चा में किया जाना चाहिए (http : //www.makelinux.net/ldd3/chp-9-sect-4)। यदि उस साइट पर विश्वास किया जाना है तो आपको अपने प्रश्न में मौजूद I/O स्मृति को विशेष लिखने के लिए 'iowrite32()' का उपयोग करना चाहिए। –

+0

ठीक है! धन्यवाद, मैंने उस हिस्से को याद किया और शायद कुछ भ्रष्ट कर दिया। मैं कल इसे आज़माउंगा, और यदि यह काम करता है, तो मैं आपको जवाब प्रतिक्रिया बॉक्स में अपनी प्रतिक्रिया देने के लिए कहूंगा ताकि मैं इसे स्वीकार कर सकूं। –

+0

मुझे iowrite32 का उपयोग करना चाहिए ... लेकिन यह सिर्फ राम है जिसे मैं लिख रहा हूं। क्या मुझे iowrite परिवार का उपयोग करना चाहिए क्योंकि वास्तविक वर्चुअल पता लौटाया गया एक वास्तविक dereferencable इकाई नहीं है, लेकिन इसके बजाय पृष्ठ तालिका में एक कुंजी है जहां लेखन होना चाहिए? –

उत्तर

1

क्या आप कृपया बता सकते हैं कि इस कथन "हार्डवेयर रैम मेमोरी एड्रेस यूजर लैंड" में आपका क्या मतलब है।

किस प्रकार का उपकरण आप [PCIe, यूएसबी आदि] का अनुकरण कर रहे हैं

यह सब अपने CPU मार्ग पर निर्भर करता है और के रूप में हार्डवेयर जुड़ा हुआ नहीं है तो अनुवाद के बजाय गलती का कारण नहीं बनेगा यह बस प्रोटोकॉल पर डेटा भेज देंगे जो बस कंट्रोलर से डिवाइस पर नकली पैक पीढ़ी की तरह होगा।

यह सत्यापित करने के लिए कि आप बस लेनदेन की जांच कर सकते हैं और आईओ पोर्ट मैपिंग के मामले में आप विशिष्ट पोर्ट पते/बिट्स से आने वाले संकेतों का उपयोग कर सकते हैं।

+1

आह मैंने केवल यह देखा है। ठीक है, उस समय काम पर (महीने पहले) मैं एक पृथक्करण कर्नेल पर काम कर रहा था और सुविधाओं में से एक सटीक पते के अनुरूप विशिष्ट मेमोरी जोन को अलग करने में सक्षम है। मैं एक कस्टम/dev/कर्नेल ड्राइवर का उपयोग कर रहा था, और इसलिए मेरे पास एक उपकरण नहीं था जिसे मैं अनुकरण कर रहा था। | यह सब इस पर निर्भर करता है ... नहीं, ऐसा इसलिए है क्योंकि मैं काम जटिलताओं और तथ्य यह है कि यह एक अत्यधिक विशिष्ट पृथक्करण कर्नेल कर्नेल मॉड्यूल के कारण सबकुछ नहीं कह सकता है। मुझे पता है कि मैंने इस समस्या को हल किया है, लेकिन मुझे याद नहीं है कि यह विशेष रूप से क्या किया गया था। अगर मुझे याद है, तो मैं इसे जोड़ दूंगा। –

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