¿Cómo encontrar la dirección física de una variable del espacio de usuario en Linux?

3 minutos de lectura

¿Quiero encontrar la dirección física de una variable definida en un proceso de espacio de usuario? ¿Hay alguna forma de hacerlo usando privilegios de root?

  • ¿Probablemente con /dev/mem?

    – usuario2284570

    19 de julio de 2014 a las 8:59

  • Alguna información relacionada en stackoverflow.com/questions/5748492/…

    – Karthik Balagurú

    4 de noviembre de 2015 a las 2:12

Como se respondió parcialmente antes, los programas normales no deberían preocuparse por las direcciones físicas, ya que se ejecutan en un espacio de direcciones virtuales con todas sus comodidades. Además, no todas las direcciones virtuales tienen una dirección física, pueden pertenecer a archivos mapeados o páginas intercambiadas. Sin embargo, a veces puede ser interesante ver este mapeo, incluso en el espacio del usuario.

Para este propósito, el kernel de Linux expone su mapeo a la zona de usuario a través de un conjunto de archivos en el /proc. La documentación se puede encontrar aquí. Breve resumen:

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

Este sitio web proporciona un programa en C que vuelca las asignaciones de todos los procesos en ejecución mediante esta interfaz y una explicación de lo que hace.

  • Ejemplo mínimo con pruebas: stackoverflow.com/questions/17021214/…

    – Ciro Santilli Путлер Капут 六四事

    16 de julio de 2017 a las 13:03

avatar de usuario
auselen

#include "stdio.h"
#include "unistd.h"
#include "inttypes.h"

uintptr_t vtop(uintptr_t vaddr) {
    FILE *pagemap;
    intptr_t paddr = 0;
    int offset = (vaddr / sysconf(_SC_PAGESIZE)) * sizeof(uint64_t);
    uint64_t e;

    // https://www.kernel.org/doc/Documentation/vm/pagemap.txt
    if ((pagemap = fopen("/proc/self/pagemap", "r"))) {
        if (lseek(fileno(pagemap), offset, SEEK_SET) == offset) {
            if (fread(&e, sizeof(uint64_t), 1, pagemap)) {
                if (e & (1ULL << 63)) { // page present ?
                    paddr = e & ((1ULL << 54) - 1); // pfn mask
                    paddr = paddr * sysconf(_SC_PAGESIZE);
                    // add offset within page
                    paddr = paddr | (vaddr & (sysconf(_SC_PAGESIZE) - 1));
                }   
            }   
        }   
        fclose(pagemap);
    }   

    return paddr;
}   

Primero, ¿por qué querrías hacer esto? El propósito de los sistemas de VM modernos es eliminar al programador de aplicaciones de la complejidad del diseño de la memoria física. Dándoles a cada uno su propio espacio de dirección uniforme para hacer su vida más fácil.

Si quisiera hacer esto, seguramente necesitaría usar un módulo del núcleo. Obtenga la dirección virtual de la variable de la manera normal, use esto para indexar en las tablas de la página de procesos y lea el valor que encuentre (la dirección física del marco). Luego agregue el desplazamiento de página para obtener la dirección física completa. Tenga en cuenta que no podrá usar esta dirección mientras la paginación esté habilitada.

(Si tiene suerte, puede obtener la dirección del marco de una región de VM del sistema de archivos /proc y, por lo tanto, no necesitará escribir un módulo de kernel).

  • …y a menos que bloquee la página en la memoria, esa dirección física podría cambiar en cualquier momento.

    – café

    14 de marzo de 2010 a las 9:22

  • No necesita escribir un módulo kernel: como explican los otros ejemplos, esto ya está expuesto a través de /proc/$pid/pagemap.

    – piscina

    11 de febrero de 2017 a las 2:16

  • Puede ser interesante en arquitecturas NUMA conocer la dirección física de las variables

    – horror

    26 de julio de 2017 a las 10:35

  • “¿Por qué querrías hacer esto?” no es una respuesta

    – étale-cohomología

    9 de abril de 2018 a las 14:47

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad