[lkml]   [2005]   [Nov]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
    SubjectRe: Accessing file mapped data inside the kernel
    Anton Altaparmakov wrote:

    >On Wed, 9 Nov 2005, Paulo da Silva wrote:
    >>I posted about this a few days ago but got no responses
    >>so far! I think this should be a trivial question for those
    >>involved in the kernel internals. May be I didn't develop
    >>the problem enough to be understood.
    >>So, here is the question reformulated.
    >>A given file system must supply a procedure for mmap.
    >>int <fsname>_file_mmap(struct file * file, struct vm_area_struct * vma)
    >> int addr;
    >> addr=generic_file_mmap(file,vma);
    >> <Code to access addr pointed bytes or vma->vm_start>
    >> return addr;
    >>I could verify that "addr" is what is returned to the user as
    >>a pointer to a string of bytes that maps a file when a user
    >>program calls mmap or mmap2.
    >>In the user program, I can access those bytes (read/write)
    >>as, for ex., a char pointer.
    >>I don't know how to access those bytes inside the kernel
    >>at the point <Code to access addr pointed bytes or vma->vm_start>
    >>First trys led the program that invoked mmap to block.
    >>I thought that there's something to do with a previous
    >> down_write(&current->mm->mmap_sem);
    >>If I execute
    >> up_write(&current->mm->mmap_sem);
    >>before accessing the data the block situation does not
    >>occur anymore. I would like to hear something about
    >>Anyway, I tryed to use "copy_from_user" but I got
    >>garbage, not the file contents! Using "strncpy" crashes
    >>the kernel (UML)!
    >>Can someone please write a fragment of code to safely
    >>access those bytes, copying them to and from a
    >>kernel char pointed area so that they are read/written
    >>to the file?
    >Why do you want to do that? If you explain what you are trying to do it
    >may be possible to help you better. It is almost 100% certain that your
    >are going about it in completely the wrong way, so please describe what
    >you are trying to do...
    >Best regards,
    > Anton
    Just try to understand the kernel filesystem.
    So far I could understand the 1st layer of
    reading and writing. mmap seems to be a
    difficult task however. So, I made a 1st try
    looking at mmap supplied by the filesystem,
    but I couldn't even succeed with a printk
    of the mapped area! I would like to understand
    what is the meaning of the address (int) returned
    by generic_file_mmap that is also into vma->vm_start
    and is returned to the user as a char pointer.
    I thought that this address, being accessible
    by a user program as a char pointer, should also
    be accessible by a copy-from-user inside the
    kernel. Unfortunately, this didn't happen!
    Why? That's my question. Did I make any mistake?
    A basic fragment of code showing how to access
    that area could enlight me so that I could go
    deeply into the code.

    Suppose a file has a string of text ("foo")
    and the user calls mmap.

    Why does this code not work?

    The supplied filesystem mmap is "generic_file_mmap".
    So, I changed it to foo_file_mmap as follows:

    int foo_file_mmap(struct file * file, struct vm_area_struct * vma)

    int addr;
    char tstr[100];
    up_write(&current->mm->mmap_sem); /* Without this the user program is dead locked */

    return addr;

    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to
    More majordomo info at
    Please read the FAQ at

     \ /
      Last update: 2005-11-10 02:47    [W:2.167 / U:1.528 seconds]
    ©2003-2017 Jasper Spaans. hosted at Digital OceanAdvertise on this site