Memory mapping in X86

Sathishkumar Duraisamy bewithsathish at gmail.com
Sun Nov 13 23:56:46 EST 2011


Hi,

I trying to implement mmap method (And by the way I writing driver to
model adc). I had implemented as shown below. I am not getting the
result as I expected. But got some error: map pfn RAM range req
uncached-minus for 36a0e000-36a0f000, got write-back.

In user space, I call mmap as follows:  map_ptr = (signed short *)
mmap(0,ADC_USER_MEM_SIZE,PROT_READ, MAP_SHARED,fd,0);

Am I doing anything wrong here?


static int simdrv_mmap(struct file *filp,struct vm_area_struct *vma)
{
    unsigned long off	= vma->vm_pgoff << PAGE_SHIFT;
    unsigned long physical = (__pa((void *)adc_dev.adcMemoryArea) >>
PAGE_SHIFT) + off;  // adcMemory I got via
__get_free_pages(GFP_KERNEL, 1);
    unsigned long vsize = vma->vm_end - vma->vm_start;
    unsigned long psize = __pa((void *) adc_dev.adcMemoryArea) - off;

//     Module spanning too high
    if (vsize > psize)
    {
	printk(KERN_ALERT "Module spanning too high");
	return -EINVAL;
    }

    vma->vm_flags	|= VM_IO;
    vma->vm_flags	|= VM_RESERVED;
    vma->vm_page_prot	= pgprot_noncached(vma->vm_page_prot);

    if (remap_pfn_range(vma,vma->vm_start, physical,vsize,vma->vm_page_prot))
    {
        return -EAGAIN;
    }
    printk(KERN_ALERT "Sucessfully memory mapped");
    return 0;
}




-- 
Regards,
Sathishkumar D
http://flowersopenlab.weebly.com/



More information about the Kernelnewbies mailing list