Guía de seguimiento dinámico de Solaris

Punteros y espacios de direcciones

Un puntero es una dirección que proporciona una traducción dentro de espacios de direcciones virtuales a una parte de memoria física. DTrace ejecuta sus programas en D en espacio de direcciones del propio núcleo del sistema operativo. Todo el sistema Solaris administra un gran número de espacios de direcciones: uno para el núcleo del sistema operativo y uno para cada proceso de usuario. Dado que cada espacio de direcciones proporciona la ilusión de que puede acceder a toda la memoria del sistema, se puede reutilizar el mismo valor de puntero de dirección virtual a través de espacios de direcciones, pero traducirlo a una memoria física diferente. Por tanto, al escribir programas en D que utilizan punteros, debe ser consciente del espacio de direcciones correspondiente a los punteros que pretende utilizar.

Por ejemplo, si utiliza el proveedor syscall para instrumentar la entrada a una llamada de sistema que lleva un puntero a un entero o matriz de enteros, como un argumento (por ejemplo, pipe(2)), no será válido dejar de hacer referencia a ese puntero o matriz mediante los operadores * o [], porque la dirección en cuestión es una dirección del espacio de direcciones del proceso de usuario que realizó la llamada de sistema. La aplicación de los operadores * o [] a esta dirección en D daría lugar a un acceso de espacio de direcciones del núcleo, que provocaría un error de dirección no válida o a la devolución de datos inesperados a su programa en D dependiendo de si la dirección coincide con una dirección del núcleo válida.

Para acceder a la memoria del proceso de usuario desde un sondeo de DTrace, debe aplicar una de las funciones copyin(), copyinstr() o copyinto() que se describen en el Capítulo 10Acciones y subrutinas al puntero del espacio de direcciones de usuario. Tenga cuidado al escribir sus programas en D a la hora de nombrar y comentar las variables que almacenan direcciones de usuario de forma adecuada para evitar confusiones. También puede almacenar direcciones de usuario como uintptr_t, de forma que no compile accidentalmente código en D que les deje de hacer referencia. Las técnicas para utilizar DTrace en procesos de usuario se describen en el Capítulo 33Seguimiento de procesos de usuario.