मेरे पास एक कस्टम ड्राइवर है जिसे मैंने लिखा है ताकि उपयोगकर्ता भूमि में सटीक हार्डवेयर रैम मेमोरी पतों की कस्टम मैपिंग को सुविधाजनक बनाया जा सके। मैं उस सामान्य स्मृति को परीक्षण करने की कोशिश कर रहा हूं 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 पुस्तक के माध्यम से कुछ के आसपास भी खोज की है, और मैंने अपना कोड निष्पादित किया है; जिस टुकड़े से मैं खींच रहा हूं वास्तव में निष्पादन में है और मुझे पता है क्योंकि मैं प्रिंटक देख सकता हूं। चालक कोड निष्पादित करता है, लेकिन फिर चल रहा है। आखिरकार, कोड का एक समान टुकड़ा है जो हार्डवेयर मेमोरी के एक सामान्य टुकड़े पर इयरमैप पर प्रदर्शन करता है, जिसे वह तब से पढ़ने की कोशिश करता है। उस पठन में वह मान नहीं है जिसे मैंने लिखा था।
क्यों?
मुझे नहीं लगता कि आपको ऐसा करना चाहिए। उदाहरण के लिए, मुझे लगता है, "याद रखें, हालांकि, ioremap से लौटाए गए पते को सीधे संदर्भित नहीं किया जाना चाहिए; इसके बजाय, कर्नेल द्वारा प्रदान किए गए एक्सेसर फ़ंक्शंस का उपयोग" makelinux.net] पर http डिवाइस लिखने की चर्चा में किया जाना चाहिए (http : //www.makelinux.net/ldd3/chp-9-sect-4)। यदि उस साइट पर विश्वास किया जाना है तो आपको अपने प्रश्न में मौजूद I/O स्मृति को विशेष लिखने के लिए 'iowrite32()' का उपयोग करना चाहिए। –
ठीक है! धन्यवाद, मैंने उस हिस्से को याद किया और शायद कुछ भ्रष्ट कर दिया। मैं कल इसे आज़माउंगा, और यदि यह काम करता है, तो मैं आपको जवाब प्रतिक्रिया बॉक्स में अपनी प्रतिक्रिया देने के लिए कहूंगा ताकि मैं इसे स्वीकार कर सकूं। –
मुझे iowrite32 का उपयोग करना चाहिए ... लेकिन यह सिर्फ राम है जिसे मैं लिख रहा हूं। क्या मुझे iowrite परिवार का उपयोग करना चाहिए क्योंकि वास्तविक वर्चुअल पता लौटाया गया एक वास्तविक dereferencable इकाई नहीं है, लेकिन इसके बजाय पृष्ठ तालिका में एक कुंजी है जहां लेखन होना चाहिए? –