2012-02-26 8 views
8

Nello studio dei sistemi operativi (principalmente con Linux come riferimento), ci sono alcuni punti che non trovo bene spiegati nel materiale che ho studiato.Segmentazione della memoria nei moderni sistemi operativi

I programmi caricati in memoria sono spesso descritti come divisi in segmenti di testo, dati, stack ecc., Anche nel contesto di sistemi operativi come Linux in cui la memoria virtuale si basa esclusivamente sul paging. È il caso che è solo il programma, e non la memoria stessa che viene definita segmentata? Se è così, trovo la terminologia confusa.

Ho visto che malloc può essere implementato in Linux utilizzando la chiamata "sbrk" che aumenta le dimensioni del segmento di dati. Di nuovo, questo 'segmento di dati' è solo una regione di memoria che viene utilizzata per dati per convenzione e non per un segmento 'reale'? (Domanda extra: 'sbrk' non sembra in grado di ridurre la dimensione del 'segmento'. Significa che un processo non può mai rilasciare memoria nel sistema operativo diverso dal chiudere?)

Anche io sono interessato a sapendo perché i moderni sistemi operativi sembrano non utilizzare la segmentazione (paginata). Non impedirebbe certi tipi di attacchi di avere il codice che risiede nel proprio segmento protetto, aumentando così la sicurezza? D'altra parte, farebbe ad esempio Compilazione JIT impossibile/difficile?

Oltre alle risposte "sì"/"no" alle domande precedenti, sono interessato a qualsiasi elaborazione approfondita sull'argomento.

Grazie in anticipo.

+0

C'è anche 'brk', che * possa * impostare la pausa programma a un valore inferiore. E i segmenti * sono * suddivisi in pagine, e ogni pagina * può * essere effettivamente di sola lettura o non-esecuzione, e il segmento di testo e il segmento di dati ro di solito vengono impostati così. –

risposta

4

Il segmento nel "segmento dati" non ha nulla a che fare con la segmentazione dell'hardware, che è una caratteristica di scarsa rilevanza per i sistemi operativi moderni (cioè ridondanti rispetto al paging) che si basano sul paging per implementare la memoria virtuale. I segmenti presentano anche gravi inconvenienti rispetto al paging (ad esempio, memoria contigua in un segmento deve essere fisicamente contigua) senza alcun beneficio. Per "segmento" per i programmi dello spazio utente, letteralmente si intende una sezione contigua dello spazio virtuale del processo.

Molte architetture non hanno più la segmentazione. Su x86, la segmentazione è solo un payload storico ed è configurata per avere un segmento di codice e dati che copre l'intero spazio degli indirizzi perché la segmentazione non può essere ignorata.

La tua domanda su come liberare memoria ottenuto attraverso sbrk trova risposta qui: How do I free memory obtained by sbrk()?

+0

Grazie per la risposta. Non c'è modo di trarre vantaggio dalla segmentazione _paged_? Mi sembra che avere i segmenti in segmenti reali con il proprio spazio di indirizzamento semplificherebbe la gestione della memoria ed eliminerebbe la possibilità che lo stack e il segmento di dati si raggiungano l'un l'altro. La gestione dei segmenti può essere gestita dal compilatore/linker. Ad ogni modo, penso che l'uso della parola "segmento" nel segmento di dati, ecc., Stia solo chiedendo confusione. Credo che dovrei aggiungere alcune note di disambiguazione ad alcune pagine di Wikipedia :) –

+1

@Gnurou Penso che ti sia confuso. I segmenti x86 sono definiti nello spazio degli indirizzi _linear_ (cioè virtuale), il che significa che il paging viene dopo la segmentazione. Questo è chiaramente indicato nella sezione 3.1 del manuale per gli sviluppatori di [Intel® 64 e IA-32 Architectures: Vol. 3A] (http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software-developer-vol-3a-part-1-manual.html). – reima

+0

reima: hai ragione - grazie per avermelo fatto notare. Rimozione di questi commenti. – Gnurou

Problemi correlati