Sto imparando sulle implementazioni DEP , ora sto cercando di capire come fa il sistema operativo a sapere quale parte di memoria è intended to hold data only
?
Sto imparando sulle implementazioni DEP , ora sto cercando di capire come fa il sistema operativo a sapere quale parte di memoria è intended to hold data only
?
In un file eseguibile, i byte sono organizzati in sezioni . I nomi tradizionali sono "testo" per una sezione che intende contenere codice e "dati" per una sezione che è destinata a contenere dati. Vi sono anche "rodata" (dati di sola lettura), "bss" (dati di lettura-scrittura inizializzati con zeri) ... Pertanto, il sistema operativo conosce i diritti di accesso da assegnare a ciascuna pagina. I nomi qui riportati sono più della tradizione Unix, ma gli stessi concetti si applicano al mondo Windows.
Quindi l'applicazione allocherà ulteriori blocchi di memoria per i propri usi. Per impostazione predefinita, il SO restituisce blocchi di dati (l'accesso in lettura e scrittura è consentito, ma non l'esecuzione, almeno se DEP è abilitato). L'applicazione può quindi richiedere esplicitamente una modifica con VirtualProtect () : gli interpreti per alcuni linguaggi di programmazione con JIT devono farlo in quanto, per definizione, dinamicamente produrre codice eseguibile e quindi procedere ad eseguirlo immediatamente.
Il sistema operativo tiene traccia dei diritti di accesso previsti per ogni pagina, ma non "indovina": ottiene le informazioni dal file che deve essere eseguito (è parte del formato) o, per l'allocazione dinamica , l'applicazione stessa dovrebbe fornire le informazioni.
La memoria stessa è agnositica. Il sistema operativo definisce a cosa serve ciascuna area. Quindi Windows "sa" perché ha detto che era così.
Qualsiasi file eseguibile contiene solo due tipi di istruzioni: i dati e il codice. In genere, i dati saranno le variabili inizializzate e non inizializzate all'interno di un programma mentre il codice sarà le istruzioni del programma che elaborano e manipolano tali variabili. Quando il file eseguibile viene mappato in memoria, le sezioni di dati vengono mappate in stack e heap mentre le istruzioni del programma sono mappate alla sezione .text del programma.
Se ci pensate, non è assolutamente possibile che le istruzioni del programma cambino durante l'esecuzione del programma, quindi la sezione .text viene sempre mappata come leggibile ed eseguibile. Inoltre, nessun programma legittimo vorrà mai eseguire qualcosa da una sezione dati di un programma perché contiene solo variabili inizializzate e non inizializzate che sono stack e heap sempre mappati come non eseguibili (solo leggibili e scrivibili). Ecco perché ogni volta che DEP rileva un'istruzione eseguibile da uno stack o da un heap, il programma viene terminato. Le istruzioni eseguibili sono consentite solo dalla sezione .text del programma.