La zona rossa è, in modo semplice e semplice, un'ottimizzazione che può salvare le istruzioni.
Significa che non è più necessario che il codice emesso per ogni funzione sottragga dal puntatore dello stack per rendere lo storage locale come tale
sub XXX, %rsp
all'inizio di ogni chiamata di funzione, anche se non sono funzioni foglia. Spesso il codice emesso dal compilatore può utilizzare lo spazio temporaneo nella zona rossa sotto il puntatore dello stack senza che sia necessario salvarlo e prima di chiamare altre funzioni. Questa è una ottimizzazione utile da avere disponibile.
Se non devi più sottomettere dal puntatore dello stack, il codice emesso può usare rsp come puntatore di base, un lavoro normalmente riservato per rbp, e il codice emesso può usare rbp come un altro registro generale.
Questo significa che il prologo e l'epilogo di ogni chiamata di funzione possono salvare due istruzioni che salveranno e ripristineranno rbp:
(assemblatore di GNU)
pushq %rbp # prologue [ two instructions not necessary ]
movq %rsp,%rbp
.... [code]
movq %rbp,%rsp # epilogue [ two instructions not necessary ]
popq %rbp
Nota che in gcc puoi passare il flag -mno-red-zone se non lo vuoi (ma l'ABI x86-64 lo richiede). Il kernel Linux non ha bisogno di essere compatibile con ABI e quindi tutto il codice del kernel è compilato con -mno-red-zone.
Inoltre, l'accesso alla memoria oltre il puntatore dello stack non è pericoloso se questa è la modalità operativa prevista. È pericoloso e può portare alla corruzione quando non è pianificato e inaspettato. Quando il codice emesso lo fa, sa cosa sta facendo.