7

से किसी पृष्ठ पर लिखता है, मैं एक कर्नेल मॉड्यूल लिख रहा हूं जिसे प्रक्रिया पी 1 द्वारा एक प्रक्रिया पृष्ठ पी 2 से संबंधित डेटा पेज को ओवरराइट करने के लिए कहा जाता है।कर्नेल मॉड्यूल, जबकि एक प्रक्रिया से बुलाया जा रहा है,

सबसे पहले, कर्नेल मॉड्यूल के अंदर और पी 1 द्वारा जारी फाइल सिस्टम को लिखने के लिए एक लिखने की घटना का जवाब देते समय। मैंने बाद की कार्य संरचना (p2_task) की खोज के लिए लक्ष्य प्रक्रिया (पी 2) की प्रक्रिया आईडी का उपयोग किया।

विशेष पृष्ठ की खोज के लिए मैंने get_user_pages() का उपयोग किया, स्पष्ट रूप से इसे (p2_task->mm) पर कॉल किया। मैंने पिछले फ़ंक्शन द्वारा लौटाए गए पृष्ठ पर kmap() को बुलाया। एक बार जब मुझे पॉइंटर मिला तो मैंने उस मेमोरी को लिखने के लिए सामान्य मेमोरी फ़ंक्शंस (memset()) का उपयोग किया। अंततः kunmap() कहा जाता है।

हालांकि, एक बार प्रक्रिया फिर से चलने के बाद मैं देख सकता हूं कि मैंने जो किया वह लक्ष्य प्रक्रिया पी 2 पर कोई प्रभाव नहीं पड़ा।

मुझे यकीन नहीं है कि मैंने क्या गलत किया है। क्या कोई मदद कर सकता है?

मुझे संदेह है कि किसी भी तरह से आप पी 2 से आने वाले अनुरोध का जवाब देते समय स्मृति को लिख नहीं सकते हैं। यहां से हम एक अलग संदर्भ में हैं।

क्या यह सच है, अगर मैं और नहीं देख सकता हूं तो यह सच है। यदि यह समस्या है, तो क्या मैं वैसे भी वहां जा सकता हूं?

+1

मेरे समझ है कि 'kmap()' एक आभासी पता देता है (कम मेम में) एक भौतिक पेज के लिए:

आप मान बदलने के बाद p1 में यह लागू की कोशिश करो। यही है कि भौतिक पृष्ठ में पहले से ही कर्नेल-स्पेस वर्चुअल एड्रेस 'kmap() 'है। अन्यथा, यह एक ही भौतिक पृष्ठ को कर्नेल-स्पेस आभासी पते पर रीमेप्स करता है और फिर यह नया वर्चुअल पता देता है। तो, कोई नया भौतिक पृष्ठ की आवश्यकता नहीं है। यह भी ध्यान रखें, नया वर्चुअल पता कर्नेल स्पेस के भीतर बनाया गया है जो पी 2 के भीतर नहीं है। – hebbo

+0

सब कुछ कर्नेल स्पेस के भीतर से किया जाता है। – hebbo

+0

क्षमा करें, मैंने सोचा था कि आप पी 1 को अधिक लिखने के लिए पी 2 चाहते थे। अब मैं देखता हूं, आप केवल पी 1 का कहना है कि इसे एक अलग उपयोगकर्ता संदर्भ से बुलाया गया था। Http://makelinux.net/ldd3/chp-15-sect-3 देखें, जो आप ऊपर उल्लिखित कर रहे हैं। मैं देखता हूं कि एकमात्र अंतर है mmap_sem को पकड़ो/रिलीज करें और SetPageDirty() को कॉल करें। –

उत्तर

0

शायद जो पृष्ठ आप लिखने की कोशिश कर रहे हैं वह केवल पढ़ा जाता है? इंटेल आर्किटेक्चर पर आप लिखने की रक्षा सेट कर सकते हैं, http://badishi.com/kernel-writing-to-read-only-memory/

0

मुझे एक टीएलबी समस्या की तरह लगता है, जिससे पी 2 हार्डवेयर में कैश किए गए डेटा का आभासी पता है। क्या पी 2 ने मूल्य को बदलने से पहले पी 2 को पहले पता स्थान में पृष्ठ को पढ़/लिखा है? flush_tlb_page(struct vm_area_struct * vma, unsigned long address)