Sé que copy_to_user
/copy_from_user
, get_user
/put_user
funciones son para este propósito.¿Cómo acceder a la memoria de espacio de usuario desde el kernel de Linux?
Mi pregunta es que, dada una dirección/puntero de espacio de usuario, ¿cómo puedo acceder a los datos apuntados por la dirección del kernel en general?
Me imagino que primero tengo que asegurarme de que la página que contiene debe estar en la memoria física (en lugar de en el disco).
¿Cuál es el siguiente paso? ¿Puedo usar *p
, donde p
es el puntero que apunta a algunos datos de espacio del usuario, directamente para referirse a los datos?
¿O primero tengo que invocar kmap
para asignar el marco de página físico que contiene al espacio de direcciones virtuales del kernel? ¿Por qué?
Buen punto y la lógica del código es agradable. Pero supongo que hay alguna tabla de hash o una estructura de datos similar que, dada una dirección virtual, te ayuda a ubicar la página física rápidamente. Hay un error: kaddr = __va (paddr); Esta línea solo funciona cuando paddr reside en memoria baja, ¿verdad? – Infinite
paddr significa dirección física, por lo tanto, siempre existió en la memoria. kaddr significa la dirección del kernel. En Linux, kernel define es '#define __va (x) ((void *) ((unsigned long) (x) + PAGE_OFFSET))'. La asignación de la memoria de la dirección del núcleo no es compleja, solo un PAGE_OFFSET. (Debe ser 0xC0000000 en modo x86). Hay otra forma de obtener la dirección. La aplicación de espacio de usuario puede acceder a la dirección del kernel con/proc//pagemap para obtener información de la página. Si puede obtener PFN, también puede obtener la dirección del kernel. –
richliu