Re: Memory mapping in X86
Hi Santhosh, I got this thing in dmesg: [10256.068664] driver_test:7114 map pfn RAM range req uncached-minus for 2f866000-2f867000, got write-back. I am writing some random numbers in mmapped memory. But I am not able to get it from the user space. Note: ( I have allocated memory via adc_dev.adcMemoryArea = (adcdata_t *) __get_free_pages(GFP_KERNEL, 1); ) On Sat, Nov 19, 2011 at 12:16 PM, santhosh kumars <karuna.linux@gmail.com> wrote:
hi, what is the exact error you are getting. thanks, santosh.
On Mon, Nov 14, 2011 at 10:26 AM, Sathishkumar Duraisamy <bewithsathish@gmail.com> wrote:
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/
participants (1)
-
Sathishkumar Duraisamy