Червона зона - це чисто і просто оптимізація, яка може зберегти інструкції. Це означає, що більше не потрібно, щоб випромінюваний код для кожної функції віднімався від вказівника стека, щоб зробити місцевий сховище таким
sub XXX, %rsp
на початку кожного виклику функції, навіть якщо вони не є функціями листів. Часто код, який випускається з компілятора, може використовувати тимчасовий пробіл у червоній зоні під вказівником стека, не потребуючи його збереження та перед викликом інших функцій. Це корисна оптимізація для наявності.
Якщо вам більше не доведеться переводити підказку з покажчика стека, випромінюваний код може використовувати rsp як базовий покажчик, завдання, як правило, зарезервоване для rbp, а випромінений код може використовувати rbp як інший реєстр загального призначення.
Це в кінцевому підсумку означає, що пролог і епілог кожного виклику функції можуть зберігати дві інструкції, які б зберегли і відновили rbp:
(gnu асемблер)
pushq %rbp # prologue [ two instructions not necessary ]
movq %rsp,%rbp
.... [code]
movq %rbp,%rsp # epilogue [ two instructions not necessary ]
popq %rbp
Зауважте, що у gcc ви можете передавати прапор -mno-red-zone, якщо цього не хочете (але ABI x86-64 цього вимагає). Ядро Linux не повинно бути сумісним з ABI, і тому весь код ядра компілюється з -mno-red-zone.
Крім того, доступ до пам'яті поза вказівником стека не є небезпечним, якщо це очікуваний режим роботи. Це лише небезпечно і може призвести до корупції, коли це непередбачувано і несподівано. Коли випущений код робить це, він знає, що робить.