Domanda

ho letto su OSDev wiki, che la modalità di architettura x86 protetti consentono di creare segmenti separati per codice e dati, mentre non è possibile scrivere nella sezione di codice. Quella di Windows (sì, questo è la piattaforma) carichi nuovo codice nel segmento di codice, ed i dati vengono creati sul segmento di dati. Ma, se questo è il caso, come fa il programma sa che deve passare segmenti per il segmento di dati? Siccome se ho capito bene, tutte le istruzioni indirizzo puntano al segmento si esegue il codice, a meno che non si passa il descrittore. Ma ho anche letto, che così colled modello di memoria piatta consente di eseguire codice e dati all'interno di un segmento. Ma ho letto questo solo in relazione a assembler. Quindi, per favore, qual è il caso di C codice compilato su Windows? Grazie.

È stato utile?

Soluzione

Ci sono due significati per segmento nella spiegazione:

  • un segmento di 8086 indirizzi di memoria
  • un segmento di sezione di programma del modulo oggetto

Il primo è legato a ciò che viene caricato in un registro 80386+ segmento; contiene un indirizzo iniziale di memoria fisica, lunghezza allocazione di memoria, consentiti lettura / scrittura / esecuzione accesso, e se cresce dal basso verso l'alto o viceversa (più alcune bandiere più oscuri, come "copy on riferimento").

Il secondo significato è parte del linguaggio del modulo oggetto. In sostanza, v'è un segmento di nome code, un segmento di nome data (che contiene dati inizializzata), e il segmento per i dati non inizializzati chiamato bss (chiamato per le istruzioni pseudo del 1960 assemblatori che significa blocco di partenza con il simbolo ). Quando mietitrebbie linker oggetto moduli, organizza tutti i segmenti di codice insieme, tutti i segmenti di dati insieme altrove, e il BSS insieme così. Quando il caricatore mappa gli indirizzi di memoria esamina il codice spazio totale e alloca un'allocazione di memoria CPU di almeno quelle dimensioni, e associa il segmento del codice (in una situazione di memoria virtuale) o legge il codice nella memoria allocata per la quale deve impostare temporaneamente la memoria, come scrivibile dati. La protezione da scrittura è fatto attraverso il meccanismo di paging della CPU, così come il registro di segmento. Questo è quello di proteggere i tentativi di scrittura di codice, attraverso, ad esempio, un indirizzo di dati errante. Il caricatore fa anche il setup simile per i due gruppi di segmenti di dati. (Oltre a quelli, v'è la creazione di un segmento di stack e loro assegnazione, e la mappatura immagini condivise.)

Per quanto riguarda le istruzioni x86 esecuzione, ogni operando ha un registro di segmento associato. A volte questi sono espliciti, e talvolta sono impliciti. Codice viene implicitamente accede attraverso CS, pila attraverso SS che è implicita ogniqualvolta è coinvolto registro ESP o EBP e DS è implicito per molti altri operandi. ES, FS e GS deve essere specificato come un override in tutti gli altri casi, ad eccezione di alcune delle istruzioni di stringa come movs e cmps. Nel modello piano, tutti i registri di segmento mappano lo stesso spazio degli indirizzi, anche se CS non consente la scrittura.

Quindi, per rispondere alla tua ultima domanda, la CPU ha quattro (o più) registri di segmento impostati in una sola volta per accedere allo spazio di memoria virtuale piatta del processo. Ogni accesso operando viene controllato per essere appropriato per l'istruzione (come non incrementando un indirizzo CS) e viene controllato dall'unità di protezione di paging per essere autorizzati.

Altri suggerimenti

Le informazioni che leggete è obsoleto. le versioni di Windows dal ~ 1993 l'uso di una TV a 32 bit spazio di memoria virtuale. I valori dei registri di segmento CS e DS materia non è più e non possono essere cambiati. C'è ancora una nozione di codice vs dati, da adesso implementata con attributi di pagina di memoria. Rivedere i valori consentiti passati nell'argomento flNewProtect per il VirtualProtectEx () funzione API .

È molto raramente utilizza questa API da soli, gli attributi vengono impostati con l'immagine del caricatore eseguibile e il gestore degli heap.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top