2012-07-15 19 views
9

एलडीडी 3/सी से। 15/खंड "remap_pfn_range का उपयोग करना" और "एक सरल कार्यान्वयन", पीएफएन को vm_pgoff फ़ील्ड के बराबर समझा गया है। मैं इससे उलझन में हूं। यह कैसे हो सकता है?डिवाइस मेमोरी के लिए पेज फ्रेम नंबर कैसे निर्धारित करता है?

ध्यान दें कि vm_pgoff वर्णन किया गया है के रूप में:

फ़ाइल में क्षेत्र की ऑफसेट, पन्नों में। जब कोई फ़ाइल या डिवाइस मैप किया जाता है, तो यह क्षेत्र में मैप किए गए पहले पृष्ठ की फ़ाइल स्थिति है।

इस प्रकार यदि पहला पृष्ठ मैप किया गया है तो फ़ाइल के पहले पृष्ठ से भी मेल खाता है (जो, मुझे लगता है कि काफी आम होगा), vm_pgoff 0. सही होगा? यदि ऐसा है, तो यह remap_pfn_range() के pfn पैरामीटर के लिए सही मान प्रतीत नहीं होता है। मुझे यहां क्या समझ नहीं आ रहा है? सही मूल्य क्या है? संदर्भ में आसानी के लिए, मैं नीचे LDD3 से प्रासंगिक कोड के पुनरुत्पादन कर रहा हूँ (पृष्ठ नहीं। 426)

static int simple_remap_mmap(struct file *filp, struct vm_area_struct *vma) 
{ 
if (remap_pfn_range(vma, vma->vm_start, vm->vm_pgoff, 
        vma->vm_end - vma->vm_start, 
        vma->vm_page_prot)) 
    return -EAGAIN; 
... 
} 

उत्तर

5

विशिष्ट उदाहरण आपके द्वारा दिए गए है कि एक भौतिक स्मृति मैप करने के लिए अनुमति देता है एक चरित्र उपकरण फ़ाइल लागू कर रहा है, बहुत समान करने के लिए/dev/mem। फ़ाइल के ऑफ़सेट को निर्दिष्ट करके आप भौतिक स्मृति पता निर्दिष्ट करते हैं। इसलिए गणना जो पीएफएन खोजने के लिए पृष्ठ आकार में ऑफसेट और विभाजित होती है।

"असली" डिवाइस ड्राइवर के लिए, आपके पास सामान्य रूप से डिवाइस मेमोरी मैप किए गए रजिस्टरों का भौतिक पता होता है या डिवाइस विनिर्देश से हार्ड कोड कोड किया जाता है, और इसका उपयोग पीएफएन (पृष्ठ आकार से विभाजित करके) प्राप्त करने के लिए किया जाता है।

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

  • कोई संबंधित समस्या नहीं^_^