La zona rossa è, puramente e semplicemente, un'ottimizzazione che può salvare le istruzioni. Significa che non è più necessario che il codice emesso sottragga ogni funzione dal puntatore dello stack per rendere la memoria locale in questo modo
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 la necessità di salvarlo e prima di chiamare altre funzioni. Questa è un'ottimizzazione utile da avere a disposizione.
Se non è più necessario sottostare dal puntatore dello stack, il codice emesso può utilizzare rsp come puntatore di base, un lavoro normalmente riservato a rbp e il codice emesso può utilizzare rbp come altro registro per scopi generici.
Questo alla fine significa che il prologo e l'epilogo di ciascuna chiamata di funzione possono salvare due istruzioni che salverebbero e ripristinere rbp:
(assemblatore 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). Non è necessario che il kernel Linux sia conforme 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. È solo pericoloso e può portare alla corruzione quando non è pianificato e inaspettato. Quando lo fa il codice emesso, sa cosa sta facendo.