writing on mmap() ?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi, 
i've got a working version of an mmap()'ed I/O, though read-only.
A device puts its data on RAM through dma and userspace can read it (and 
consequentely dispatch it to other devices).

Now, I need to write some data on the buffer, before the data is sent out.
So, I added PROT_WRITE to the userspace mmap() and <bang>. :)

Data went written on the virtual address, by the userspace, and indeed the 
userspace app can read it correcly, but... the physical memory seems 
untouched.

Briefly, my driver allocate a page of memory this way:
    buffer =  __get_free_pages(GFP_KERNEL | GFP_DMA,  get_order(4K));
and fill it with a pattern:
    for(i=0; i<maxframebuffer; i++)
        buffer[i] = (char)(maxframebuffer - i);

That works fine. (I can inspect the physical memory through a JTAG 
debugger).

Then I define the device_mmap(), nothing more that the usual mmap stub:

int mmaptest_mmap(struct file *filp, struct vm_area_struct *vma)
{
    unsigned int buffersize = 0;

    buffersize = (4K >> PAGE_SHIFT)+1;
    if ( (vma->vm_end - vma->vm_start)>>PAGE_SHIFT > buffersize )
        return -ENOMEM;

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

    if (remap_pfn_range(vma, vma->vm_start, 
                    virt_to_phys(buffer) >> PAGE_SHIFT,
                    vma->vm_end - vma->vm_start, vma->vm_page_prot)){
        return -EAGAIN;
    }
    vma->vm_ops = &simple_remap_vm_ops;
    simple_vma_open(vma);
    return 0;
}

Finally, the userspace program do simply:
    pointer = mmap(blablabla); //with PROT_WRITE and MAP_PRIVATE contained
    *pointer = 0xA5; // just a random constant.

After this, the userspace pointer contains actually 0xA5, while both the 
virtual and physical address of kernel side still contain the values 
initialized before.
( a snapshot of both memories, user side (left) and kernel 
(right) could be found here: http://imageshack.us/f/18/screenshot1fo.png/ )

Some ideas of what happen here? 
Seems there is some kind of COW on pages used with mmap()... is there a way 
to disable it?

Thanks in advance. bye!
-- 
- Andrea Gasparini -
-----------------------------------------------
-------- https://launchpad.net/~gaspa ---------
----- HomePage: http://gaspa.yattaweb.it ------

_______________________________________________
Kernelnewbies mailing list
Kernelnewbies@xxxxxxxxxxxxxxxxx
http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies


[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux