Qual è il comportamento delle variabili mutabili globali nelle librerie con collegamenti dinamici?

1

Quando una libreria collegata dinamicamente include una variabile mutabile globale, come un contenitore per lo stato inizializzato durante il caricamento della libreria, come si comportano i riferimenti a tale variabile quando si esegue un'applicazione che si collega con essa?

Ovviamente l'applicazione non può alterare la memoria allocata alla libreria collegata dinamicamente dal sistema operativo, in quanto ciò avrebbe implicazioni sulle altre applicazioni che la utilizzano, quindi si deve assumere che i riferimenti alle variabili mutabili globali vengano riscritti per fare riferimento ad alcuni R / Spazio di memoria W di proprietà dell'applicazione. Ma come si compongono il compilatore e il linker per realizzare questo?

    
posta John Cartwright 09.08.2013 - 06:26
fonte

2 risposte

1

La maggior parte dei sistemi operativi supportano un concetto chiamato "sezioni" nel loro formato di file eseguibile (possibilmente utilizzando un nome diverso). Queste sezioni possono avere attributi diversi (come, sola lettura, lettura / scrittura, eseguibile, ecc.) E possono essere caricate in diverse parti dello spazio degli indirizzi di un'applicazione. Ad esempio, la sezione con il codice potrebbe andare nella parte inferiore dello spazio degli indirizzi, mentre i globals sono posizionati nella parte superiore (con tutto il resto disponibile tra stack e heap).

Con le librerie caricate dinamicamente, gli stessi principi possono essere usati per avere una sezione con codice che viene condiviso tra le diverse applicazioni e una sezione con variabili che vengono caricate separatamente per ogni applicazione.

Una funzionalità aggiuntiva necessaria per rendere questo lavoro è l'uso di indirizzi virtuali. Con gli indirizzi virtuali, non vi è una corrispondenza fissa tra gli indirizzi come visti da un'applicazione e le celle della memoria fisica. Ciò consente al sistema operativo di scambiare le pagine di memoria dentro e fuori la RAM, ma fornisce anche i mezzi per condividere pagine di memoria fisica tra processi (anche se non corrispondono a indirizzi virtuali identici in quei processi) e di avere identiche gli indirizzi virtuali in due processi si riferiscono a diversi luoghi fisici.

Quindi, la maggior parte del lavoro svolto per far funzionare le librerie caricate dinamicamente è fatto dal sistema operativo. Il compilatore e il linker devono semplicemente mettere tutto nelle sezioni appropriate, in modo che le cose non modificabili possano essere condivise tra i processi, mentre le variabili vengono allocate separatamente per ogni processo.

    
risposta data 09.08.2013 - 09:12
fonte
1

Ogni processo ha una propria copia della libreria mappata nel suo spazio di indirizzamento virtuale. Quella copia è semplicemente parte della memoria del processo con poca distinzione da altra memoria. Non è speciale perché fa parte di una libreria condivisa. La modifica non ha alcun effetto su altri processi.

Per preservare la memoria fisica, quella mappatura è tipicamente copy-on-write. Ma questa è solo un'ottimizzazione, il sistema operativo potrebbe dare ad ogni istanza una copia completa con la stessa semantica.

    
risposta data 09.08.2013 - 13:28
fonte

Leggi altre domande sui tag