Qual è lo scopo della zona rossa?

8

La zona rossa è un'area di dimensioni fisse in memoria oltre il puntatore dello stack che non è stato "allocato". I compilatori generano assemblaggi per accedere a quell'area in semplici funzioni foglia.

Ma non vedo alcun reale vantaggio per la zona rossa. L'accesso alla memoria oltre il puntatore dello stack è molto pericoloso e può facilmente portare alla corruzione dei dati . Perché anche farlo? Il salvataggio di 2 istruzioni del processore (push ebp; mov ebp esp) non darà una reale accelerazione.

P.S. C'era già domanda su SO che era chiuso come off-topic (terribile ingiustizia).

    
posta Alexander Dzyoba 24.02.2014 - 09:23
fonte

1 risposta

13

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.

    
risposta data 24.02.2014 - 09:50
fonte

Leggi altre domande sui tag