Los hilos comparten el mismo espacio de direcciones y código. Sin embargo, para una variable en el almacenamiento local de subprocesos, cada subproceso debe tener su propio valor; por lo que la variable no se puede almacenar simplemente en una dirección fija. Debe haber alguna indirección.
En la CPU x86 de 32 bits, con Linux, se accede a las variables locales de subprocesos a través del registro de segmento %gs
, que hasta ahora no había sido utilizado por el código de la aplicación. Los segmentos son un remanente de tiempos más viejos; Linux siempre ha definido que todos los segmentos comiencen en la dirección 0 y se extiendan a más de cuatro gigabytes, permitiendo que el código los olvide por completo. Sin embargo, todavía están allí, y uno de ellos ( %gs
) se reactivó para admitir el almacenamiento de subprocesos locales. De hecho, todos los subprocesos comparten la misma memoria , pero cada subproceso tiene su propio conjunto de valores de registro.
El canario es una ranura en la pila. Su propósito es sobrescribir cuando se produce un desbordamiento, y es probable que el desbordamiento afecte a la dirección de retorno: el valor que se escribe en la ranura debe leerse sin cambios al final de la función. Ese valor específico se elige aleatoriamente al comienzo de cada subproceso, y cada subproceso tiene su propio valor; esto significa almacenamiento local de subprocesos, por lo que el valor canario de un subproceso puede leerse en un lugar fijo en relación con %gs
, como lo conoce ese subproceso.