qué - Linux-Asignación de memoria de espacio de usuario en código de núcleo
qué es swap en un sistema linux (2)
Suena como memoria mapeada periférica. Para un enlace estricto en su kernel, tendría entrada agregada en initdata que va a iotable_init (). Por ejemplo, arch / arm / mach-vexpress / ct-ca9x4.c ct_ca9x4_io_desc []. Eso crea un mapeo virtual a físico. Entonces, el código kernel podría usar writel con dirección virtual para escribir allí.
Estoy escribiendo un fragmento de código que necesita almacenar 10k de memoria ubicados en una dirección física específica antes de que el SOC se apague.
Mi problema es que esta dirección física no forma parte del espacio del núcleo, así que tengo que crear una asignación de memoria ad -hoc para poder acceder a este espacio de memoria.
Intenté usar io-remap pero aparentemente no funciona en un espacio que no es del kernel.
¿hay alguna API para hacer esto? ¿Debo usar kmap?
Gracias por adelantado
Encontré la respuesta
la clave es usar la función vmap que crea una asignación para una tabla de página determinada. el problema era cómo inicializar una estructura de tabla de páginas a una dirección física determinada, pero parece que existe una API para eso también
aquí hay un ejemplo para asignar una sola página
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);