2011-06-05 30 views
8

Como sugiere el título, tengo un problema para obtener la dirección física de una dirección virtual.Linux (Ubuntu), lenguaje C: Traducción de direcciones virtuales a físicas

Déjenme explicar: Dada una declaración de variables en el espacio de proceso, ¿cómo puedo derivar su dirección física mapeada por el sistema operativo?

Me he tropezado con algunas llamadas a los sistemas /asm/io.h donde se define la función virt_to_phys(); sin embargo, parece que este encabezado está desactualizado y no puedo encontrar una solución alternativa.

Sin embargo; io.h está disponible en: /usr/src/linux-headers-2.6.35-28-generic/arch/x86/include/asm/. Mi kernel actual es 2.6.35-28, pero io.h no está incluido en /usr/include/asm/?

Por lo tanto, para reiterar: necesito una forma de obtener la dirección física de virtual. Preferiblemente derivado de dentro de la aplicación en tiempo de ejecución. Pero incluso una solución de usar un monitor de /proc/PID/maps servirá.

Cualquier idea o comentario sería muy apreciado.


EDITAR Después de hacer un poco de investigación sobre este tema he encontrado algo que ayuda en este sentido.

Resulta que esto es más que factible, aunque requiere un poco de solución. Aquí está un link a una aplicación simple que analiza las páginas mapeadas actuales. El archivo en cuestión resulta ser (un archivo binario) /proc/pid/pagemap (contiene la asignación física de páginas virtuales). De todos modos, el código en ese enlace se puede modificar para servir como una aplicación de monitor o algo así.

Necesitaba la dirección física para la simulación de caché.

¡Gracias a todos por la ayuda y respuestas!

+4

¿Para qué lo necesitas? –

Respuesta

21

En el código de usuario, no puede conocer la dirección física correspondiente a una dirección virtual. Esta es información que simplemente no se exporta fuera del kernel. Incluso podría cambiar en cualquier momento, especialmente si el kernel decide intercambiar parte de la memoria de su proceso.

En /proc/$pid/maps, usted tiene información acerca de lo que los virtuales direcciones en el espacio de direcciones de su programa corresponden a archivos (mmapped, montón, pila, etc.). Eso es todo lo que obtendrás

Si está trabajando en el código del kernel (que no es, al parecer), puede encontrar la dirección física correspondiente a una página de memoria. Pero incluso entonces virt_to_phys no es toda la historia; Recomiendo leer Linux Device Drivers (especialmente los capítulos 8 y 15).

El encabezado asm/io.h es un encabezado de kernel. No está disponible cuando compila código de usuario porque su contenido simplemente no tendría sentido. Las funciones que declara no están disponibles en ninguna biblioteca, solo en el kernel.

+0

¡Exactamente lo que iba a decir, pero con aún más detalles! +1 –

+3

+1 Me gustaría señalar que si la memoria se intercambia, no existe una ubicación física – hirschhornsalz

1

Pase la dirección virtual al kernel usando systemcall/procfs y use vmalloc_to_pfn. Devuelve la dirección física a través de procfs/registros.

+0

¿Pero no es así, que 'vmalloc_to_pfn' devuelve Número de fotograma de página, y no una dirección? (por ejemplo, http://stackoverflow.com/questions/11442773/vmalloc-to-pfn-returns-32-bit-address-on-linux-32-system-why-does-it-chop-off-h/22013238# 22013238) Ahora, si el PFN se convierte a una dirección, entonces? – sdaau

2

Como parcialmente respondido por el cartel original, el kernel de Linux expone su mapeo a un usuario a través de un conjunto de archivos en el /proc. La documentación se puede encontrar en here. Breve resumen:

  1. /proc/$pid/maps proporciona una lista de asignaciones con sus direcciones virtuales y el archivo correspondiente para archivos asignados.
  2. /proc/$pid/pagemap proporciona más información sobre cada página asignada, incluida la dirección física, si existe.

Como el cartel original se encuentra más adelante, this example proporciona una implementación de muestra de cómo usar estos archivos.

Cuestiones relacionadas