Zona roja (computación)

término de computación

En ciencias de la computación, una zona roja (red zone) es un área de memoria en la pila de llamadas que se encuentra más allá de la dirección de memoria apuntada por el puntero de pila (%rsp) y que se mantiene sin asignar. Dicha región de memoria no es modificada por interrupciones o excepciones. La existencia de la zona roja es una característica peculiar en procesadores con un conjunto de instrucciones x86-64.

Las especificaciones de x86-64 admiten que un programa puede usar hasta 128 bytes por debajo (es decir, direcciones de memoria inferiores) de aquella apuntada por el puntero de pila en ese momento. Esta región de memoria adicional permite que el programa pueda almacenar datos temporales en memoria sin la necesidad de tener que modificar el puntero de pila, lo cual permite ejecutar dichas operaciones de forma más rápida y eficiente para el procesador.

Uso de zona roja editar

Normalmente, los programas evitan acceder a la zona roja siempre que les sea posible guardar todas las variables locales en los registros enteros, pero es posible que sí se use la zona roja cuando se hace referencia a una variable local de duración muy efímera, (como por ejemplo, un array local) ya que podría ser más costoso para el procesador almacenar dicha variable en un registro local o en la propia pila y después sacarlo (con las consiguientes modificaciones del puntero de pila) que simplemente hacer uso de dicha zona y ahorrar la modificación del puntero de pila.

En un lenguaje de programación de alto nivel, como C, un programa como el siguiente intercambia el contenido de dos variables haciendo uso de un array local:

void intercambio (long *a, long *b) {
    volatile long loc[2];
    loc[0] = *a;
    loc[1] = *b;
    *a = loc[1];
    *b = loc[0];
}

Para este programa, el compilador GCC generaría un código máquina que en sintaxis de lenguaje ensamblador sería:

.intercambio:
    movq (%rdi), %rax
    movq %rax, -24(%rsp)
    movq (%rsi), %rax
    movq %rax, -16(%rsp)
    movq -16(%rsp), %rax
    movq %rax, (%rdi)
    movq -24(%rsp), %rax
    movq %rax, (%rsi)
    ret

En el ejemplo, podemos ver cómo se hace referencia al puntero de pila (%rsp), que es el que apunta al tope de la pila —es decir, la dirección de memoria de la pila más baja asignada por el procedimiento actual. Sin embargo, podemos ver cómo dichas referencias tienen un desplazamiento (offset) negativo; por ejemplo, en la línea 3, se mueve el valor contenido en el registro %rax a una posición 24 bytes por debajo del puntero de pila (-24(%rsp). Dicha posición, que en principio estaría fuera del espacio de memoria del programa actual, está haciendo referencia a la zona roja. Por tanto, podemos ver que dicho programa está aprovechando la zona roja para almacenar temporalmente los contenidos del array local que hemos declarado. Así, el procesador ahorra tener que meter (push) dichas variables en la pila y a continuación sacarlas (pop), con todas las consiguientes modificaciones del puntero de pila, mejorando notablemente la eficiencia.

Véase también editar

Bibliografía editar

  • "i386 and x86-64 Options - Using the GNU Compiler Collection (GCC)".
  • "OpenCores Wiki - OpenRISC GNU toolchain".
  • Computer Systems. A Programmer's Perspective - Bryant · O'Hallaron
  • Apuntes sobre Estructura de Computadores - Universidad de Granada