Guía de seguimiento dinámico de Solaris

Punteros y direcciones

El sistema operativo Solaris utiliza una técnica denominada memoria virtual para proporcionar a cada proceso de usuario su propia visualización virtual de los recursos de memoria de su sistema. A la visualización virtual de los recursos de memoria se le denomina espacio de direcciones, que asocia un rango de valores de direcciones (bien [0 ... 0xffffffff] para un espacio de direcciones de 32 bits o [0 ... 0xffffffffffffffff] para un espacio de direcciones de 64 bits) a un conjunto de transacciones que el sistema operativo y el hardware utilizan para convertir cada dirección virtual en una ubicación de memoria física correspondiente. Los punteros en D son objetos de datos que almacenan un valor de dirección virtual entero y lo asocia a un tipo en D que describe el formato de los datos almacenados en la ubicación de memoria correspondiente.

Es posible declarar una variable en D para que sea un tipo de puntero especificando primero el tipo de los datos a los que se hace referencia y, a continuación, añadiendo un asterisco ( *) al nombre del tipo para indicar que desea declarar un tipo de puntero. Por ejemplo, la declaración:

int *p;

declara una variable global en D denominada p que es un puntero a un entero. Esta declaración significa que p es un entero con tamaño de 32 o 64 bits, cuyo valor es la dirección de otro entero ubicado en algún lugar de la memoria. Dado que la forma compilada del código en D se ejecuta en el tiempo de lanzamiento del sondeo dentro del propio núcleo del sistema operativo, los punteros en D normalmente son punteros asociados al espacio de direcciones del núcleo. Es posible utilizar el comando isainfo(1) -b para determinar el número de bits que el núcleo del sistema operativo activo utiliza para los punteros.

Si desea crear un puntero a un objeto de datos dentro del núcleo, debe calcular su dirección usando el operador &. Por ejemplo, el código fuente del núcleo del sistema operativo declara un int kmem_flags ajustable. Es posible rastrear la dirección de este int rastreando el resultado de aplicar el operador & al nombre de ese objeto en D:

trace(&`kmem_flags);

El operador * se puede utilizar para hacer referencia al objeto dirigido por el puntero, y actúa como lo contrario del operador &. Por ejemplo, los dos fragmentos de código en D siguientes tienen un significado equivalente:

p = &`kmem_flags;				trace(`kmem_flags);
trace(*p);

El fragmento de la izquierda crea un puntero p de variable global en D. Dado que el objeto kmem_flags es del tipo int, el tipo del resultado de &`kmem_flags es int * (es decir, puntero a int). El fragmento de la izquierda rastrea el valor de *p, que sigue al puntero hasta el objeto de datos kmem_flags. Por tanto, este fragmento es igual que el fragmento de la derecha, que simplemente rastrea el valor del objeto de datos directamente utilizando su nombre.