I thread condividono lo stesso spazio e codice di indirizzo. Tuttavia, per una variabile nella memoria locale del thread, ogni thread deve avere il proprio valore; quindi la variabile non può essere semplicemente memorizzata su un indirizzo fisso. Ci deve essere qualche riferimento indiretto.
Sulla CPU x86 a 32 bit, con Linux, le variabili locali del thread sono accessibili tramite il registro del segmento %gs
, che fino ad allora non era utilizzato dal codice dell'applicazione. I segmenti sono un residuo dei vecchi tempi; Linux ha sempre definito tutti i segmenti che iniziano all'indirizzo 0 e si estendono su quattro gigabyte, consentendo al codice di dimenticarli completamente. Tuttavia, sono ancora presenti e uno di essi ( %gs
) è stato ripristinato per supportare l'archiviazione locale dei thread. Infatti, tutti i thread condividono la stessa memoria , ma ogni thread ha il proprio set di valori di registro.
Il canarino è uno slot in pila. Il suo scopo è quello di essere sovrascritto quando si verifica un overflow e l'overflow ha probabilmente un impatto sull'indirizzo di ritorno: il valore che è scritto nello slot deve essere riletto invariato alla fine della funzione. Questo valore specifico viene scelto casualmente all'inizio di ogni thread e ogni thread ha il suo; questo significa memoria locale thread, quindi il valore canarino di un thread può essere letto da quel thread in un determinato punto relativamente a %gs
, come noto da quel thread.