La zone rouge est, purement et simplement, une optimisation qui peut enregistrer des instructions. Cela signifie qu'il n'est plus nécessaire que le code émis pour chaque fonction soit soustrait du pointeur de pile pour rendre le stockage local comme tel
sub XXX, %rsp
au début de chaque appel de fonction, même s'il ne s'agit pas de fonctions feuilles. Souvent, le code émis par le compilateur peut utiliser l'espace temporaire dans la zone rouge sous le pointeur de pile sans avoir besoin de l'enregistrer et avant d'appeler d'autres fonctions. Il s'agit d'une optimisation utile à mettre à disposition.
Si vous n'avez plus à vous soustraire du pointeur de pile, le code émis peut utiliser rsp comme pointeur de base, un travail normalement réservé à rbp, et le code émis peut utiliser rbp comme autre registre à usage général.
Cela signifie finalement que le prologue et l'épilogue de chaque appel de fonction peuvent enregistrer deux instructions qui enregistreraient et restaureraient rbp:
(assembleur gnu)
pushq %rbp # prologue [ two instructions not necessary ]
movq %rsp,%rbp
.... [code]
movq %rbp,%rsp # epilogue [ two instructions not necessary ]
popq %rbp
Notez que dans gcc, vous pouvez passer l'indicateur -mno-red-zone si vous ne le souhaitez pas (mais l'ABI x86-64 l'exige). Le noyau Linux n'a pas besoin d'être compatible ABI et donc tout le code du noyau est compilé avec -mno-red-zone.
De plus, l'accès à la mémoire au-delà du pointeur de pile n'est pas dangereux s'il s'agit du mode de fonctionnement attendu. C'est seulement dangereux et peut conduire à la corruption lorsqu'il n'est pas planifié et inattendu. Lorsque le code émis le fait, il sait ce qu'il fait.
%rsp
comme pointeur de base dans les deux cas.