적색 구역은 순수하고 간단하게 지침을 저장할 수있는 최적화입니다. 그것은 더 이상 로컬 스토리지를 만들기 위해 스택 포인터에서 모든 함수에 대해 방출 된 코드를 빼지 않아도됨을 의미합니다.
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 플래그를 전달할 수 있습니다 (그러나 x86-64 ABI에서는 필요). Linux 커널은 ABI를 준수하지 않아도되므로 모든 커널 코드는 -mno-red-zone으로 컴파일됩니다.
또한 스택 포인터 너머의 메모리에 액세스하는 것이 예상되는 작동 모드 인 경우 위험하지 않습니다. 그것은 위험하며 계획되지 않았을 때 부패로 이어질 수 있습니다. 방출 된 코드가 수행하면 수행중인 작업을 알 수 있습니다.