Search code examples
linuxmemory-managementlinux-kernelmemory-mappingmmu

Linux - Mapping user space memory in kernel code


i am writing a piece of code that needs to store 10k of memory located in specific physical address before the SOC shuts down.

My problem is that this physical address is not part of kernel space so i have to create an ad -hoc memory mapping so i can access this memory space.

i tried using io-remap but it doesn't (apparently) work on non-kernel space.

is there any API for doing this ? should i used kmap ?

Thanks in advance


Solution

  • Found the answer

    the key is to use the vmap function which create a mapping for a given page table. the problem was how to initialize a page table structure to a certain physical address but it appears there exists an API for that as well

    here is an example to allocate a single page

    void *virt_addr_ptr
    struct page **my_page = kmalloc(sizeof (*my_page), GFP_KERNEL);
    my_page = phys_to_page(phys_addr_ptr);
    virt_addr_ptr = vmap(my_page, 1, VM_MAP, PAGE_KERNEL);
    
    /*now its possible to access this space */
    memcpy(store_buffer, virt_addr_ptr, store_size);