Segmentazione della memoria - Memory segmentation
Memoria segmentazione è un sistema operativo di gestione della memoria tecnica di divisione di un calcolatore 's memoria principale in segmenti o sezioni . In un sistema informatico che utilizza la segmentazione, un riferimento a una posizione di memoria include un valore che identifica un segmento e un offset (posizione di memoria) all'interno di quel segmento. I segmenti o le sezioni vengono utilizzati anche nei file oggetto dei programmi compilati quando sono collegati tra loro in un'immagine di programma e quando l'immagine viene caricata in memoria.
I segmenti di solito corrispondono a divisioni naturali di un programma come singole routine o tabelle di dati, quindi la segmentazione è generalmente più visibile al programmatore rispetto al solo paging . È possibile creare segmenti diversi per moduli di programma diversi o per classi di utilizzo della memoria diverse, ad esempio segmenti di codice e dati . Alcuni segmenti possono essere condivisi tra i programmi.
La segmentazione è stata originariamente inventata come un metodo mediante il quale il software di sistema può isolare diversi processi software ( attività ) e dati che stanno utilizzando. Aveva lo scopo di aumentare l'affidabilità dei sistemi che eseguono più processi contemporaneamente. In un'architettura x86-64 è considerato legacy e la maggior parte del software di sistema moderno basato su x86-64 non utilizza la segmentazione della memoria. Invece gestiscono i programmi e i loro dati utilizzando il paging della memoria che funge anche da protezione della memoria. Tuttavia, la maggior parte delle implementazioni x86-64 lo supporta ancora per motivi di compatibilità con le versioni precedenti.
Implementazione hardware
In un sistema che utilizza la segmentazione, gli indirizzi di memoria del computer sono costituiti da un ID di segmento e da un offset all'interno del segmento. Un'unità di gestione della memoria hardware (MMU) è responsabile della traduzione del segmento e dell'offset in un indirizzo fisico e dell'esecuzione di controlli per assicurarsi che la traduzione possa essere eseguita e che il riferimento a quel segmento e offset sia consentito.
Ogni segmento ha una lunghezza e un insieme di permessi (ad esempio, lettura , scrittura , esecuzione ) ad esso associati. Un processo può fare riferimento a un segmento solo se il tipo di riferimento è consentito dalle autorizzazioni e se l'offset all'interno del segmento rientra nell'intervallo specificato dalla lunghezza del segmento. In caso contrario, viene generata un'eccezione hardware, ad esempio un errore di segmentazione .
I segmenti possono essere utilizzati anche per implementare la memoria virtuale . In questo caso ogni segmento ha un flag associato che indica se è presente o meno nella memoria principale. Se si accede a un segmento che non è presente nella memoria principale, viene sollevata un'eccezione e il sistema operativo leggerà il segmento in memoria dalla memoria secondaria.
La segmentazione è un metodo per implementare la protezione della memoria . Il paging è un altro e possono essere combinati. La dimensione di un segmento di memoria generalmente non è fissa e può essere piccola quanto un singolo byte .
La segmentazione è stata implementata in diversi modi su hardware diverso, con o senza paginazione. La segmentazione della memoria Intel x86 non si adatta a nessuno dei due modelli ed è discussa separatamente di seguito e anche in modo più dettagliato in un articolo separato.
Segmentazione senza paging
Associato a ciascun segmento ci sono informazioni che indicano dove si trova il segmento in memoria: la base del segmento . Quando un programma fa riferimento a una posizione di memoria, l'offset viene aggiunto alla base del segmento per generare un indirizzo di memoria fisica.
Un'implementazione della memoria virtuale su un sistema che utilizza la segmentazione senza paging richiede che interi segmenti vengano scambiati avanti e indietro tra la memoria principale e la memoria secondaria. Quando un segmento viene scambiato, il sistema operativo deve allocare memoria libera contigua sufficiente per contenere l'intero segmento. Spesso si verifica una frammentazione della memoria se non c'è abbastanza memoria contigua anche se potrebbe essercene abbastanza in totale.
Segmentazione con paging
Invece di una posizione di memoria effettiva, le informazioni sul segmento includono l'indirizzo di una tabella di pagine per il segmento. Quando un programma fa riferimento a una posizione di memoria, l'offset viene tradotto in un indirizzo di memoria utilizzando la tabella delle pagine. Un segmento può essere esteso semplicemente allocando un'altra pagina di memoria e aggiungendola alla tabella delle pagine del segmento.
Un'implementazione della memoria virtuale su un sistema che utilizza la segmentazione con paging di solito sposta solo le singole pagine avanti e indietro tra la memoria principale e la memoria secondaria, in modo simile a un sistema non segmentato a paging. Le pagine del segmento possono essere posizionate ovunque nella memoria principale e non devono essere contigue. Questo di solito si traduce in una quantità ridotta di input/output tra l'archiviazione primaria e secondaria e una ridotta frammentazione della memoria.
Storia
Il computer B5000 della Burroughs Corporation è stato uno dei primi a implementare la segmentazione e "forse il primo computer commerciale a fornire memoria virtuale" basata sulla segmentazione. Anche il successivo computer B6500 ha implementato la segmentazione; una versione della sua architettura è ancora in uso oggi sui server Unisys ClearPath Libra.
Il computer GE-645 , una modifica del GE-635 con l'aggiunta del supporto per la segmentazione e la paginazione, è stato progettato nel 1964 per supportare Multics .
L' Intel iAPX 432 , iniziato nel 1975, ha tentato di implementare una vera architettura segmentata con protezione della memoria su un microprocessore.
La versione 960MX dei processori Intel i960 supportava il caricamento e la memorizzazione di istruzioni con l'origine o la destinazione come "descrittore di accesso" per un oggetto e un offset nell'oggetto, con il descrittore di accesso in un registro a 32 bit e con l'offset calcolato da un offset di base nel registro successivo e da un offset aggiuntivo e, facoltativamente, un registro indice specificato nell'istruzione. Un descrittore di accesso contiene bit di autorizzazione e un indice di oggetti a 26 bit; l'indice dell'oggetto è un indice in una tabella di descrittori di oggetti, che fornisce un tipo di oggetto, una lunghezza dell'oggetto e un indirizzo fisico per i dati dell'oggetto, una tabella di pagine per l'oggetto o la tabella di pagine di primo livello per un tabella delle pagine per l'oggetto, a seconda del tipo di oggetto.
I computer Prime , Stratus , Apollo , IBM System/38 e IBM AS/400 (incluso IBM i ) utilizzano la segmentazione della memoria.
architettura x86
La segmentazione della memoria utilizzata dai primi processori x86 , a partire da Intel 8086 , non fornisce alcuna protezione. Qualsiasi programma in esecuzione su questi processori può accedere a qualsiasi segmento senza restrizioni. Un segmento è identificato solo dalla sua posizione di partenza; non c'è controllo della lunghezza. La granularità dell'indirizzo iniziale del segmento è di 16 byte e l'offset è di 16 bit, supportando dimensioni del segmento fino a 64 KiB, quindi i segmenti possono (e spesso lo fanno) sovrapporsi e ogni indirizzo fisico può essere indicato da 4096 diverse coppie segmento-offset (consentendo l'indirizzo sfalsato avvolgente).
La segmentazione nell'Intel 80286 e versioni successive fornisce protezione: con l'introduzione dell'80286, Intel ha chiamato retroattivamente l'unica modalità operativa dei precedenti modelli di CPU x86 " modalità reale " e ha introdotto una nuova " modalità protetta " con funzioni di protezione. Per compatibilità con le versioni precedenti, tutte le CPU x86 si avviano in "modalità reale" senza protezione della memoria, segmenti di 64 KiB fissi e solo indirizzamento a 20 bit (1024 KiB). Un processore 80286 o successivo deve essere commutato in un'altra modalità dal software per poter utilizzare l'intero spazio degli indirizzi e le funzionalità MMU avanzate.
Anche i processori Intel 80386 e successivi supportano il paging; in quei processori, la tabella dei segmenti, invece di puntare a una tabella delle pagine per il segmento, contiene l'indirizzo del segmento nella memoria lineare . Gli indirizzi nella memoria lineare vengono quindi mappati su indirizzi fisici utilizzando una tabella di pagine separata, se il paging è abilitato.
L' architettura x86-64 non utilizza la segmentazione in modalità lunga (modalità a 64 bit). In un'architettura x86-64 è considerato legacy e la maggior parte dei moderni software di sistema basati su x86-64 non utilizzano la segmentazione della memoria. Invece gestiscono i programmi e i loro dati utilizzando il paging della memoria che funge anche da protezione della memoria. Sebbene la maggior parte delle implementazioni x86-64 lo supporti ancora per motivi di compatibilità con le versioni precedenti. Quattro dei registri di segmento: CS, SS, DS ed ES sono forzati a 0 e il limite a 2 64 . I registri di segmento FS e GS possono ancora avere un indirizzo di base diverso da zero. Ciò consente ai sistemi operativi di utilizzare questi segmenti per scopi speciali.
Guarda anche
- Gestione della memoria (sistemi operativi)
- Spazio di indirizzi virtuali
- Memoria virtuale
- Segmento di dati
- Segmento BSS
- Segmentazione della memoria x86
- Errore di segmentazione
- Modello a memoria piatta
Riferimenti
link esterno
- IA-32 Intel Architecture Software Developer's Manual Volume 3A: Guida alla programmazione del sistema. http://www.intel.com/products/processor/manuals/index.htm .
- Sistemi operativi: principi interni e di progettazione di William Stallings. Editore: Prentice Hall. ISBN 0-13-147954-7 . ISBN 978-0-13-147954-8 .