Segmentazione: chiarimento

Bandit1
Salve a tutti vorrei un chiarimento riguardante il sistema di gestione della memoria del calcolatore, detta segmentazione.

Questo metodo prevede di allocare ai processi, blocchi di memoria di dimensione variabile, assecondando la visione dell'utente, il quale vede la memoria come un'insieme di segmenti di dimensione variabile.
Il segmento è un unità logica come un programma principale, una funzione , una procedura, e l'insieme di questi segmenti costituisce il programma.

L'insieme dei sementi costituisce lo spazio di indirizzamento logico, dove ogni indirizzo (e quindi ogni segmento) è individuato da una coppia di valori: numero del segmento, offset.
Quindi a differenza della paginazione (dove si divideva in due parti l'indirizzo senza che la cpu ne sapesse nulla) abbiamo che gli indirizzi logici sono bidimensionali e grazie alla tabella dei segmenti si ha la conversione in indirizzi monodimensionali.

Tabella dei segmenti composta dal campo limite (indica la lunghezza del segmento) e dal campo base (contiene l'indirizzo fisico iniziale della mem dove è presente il segmento).


Il primo valore della coppia, serve da indice per la tabella dei segmenti, mentre poi l'altro deve essere confrontato con il valore contenuto nel campo limite e deve essere minore per avere poi l'indirizzo fisico necessario per accedere in mem


tutto giusto?

Risposte
hamming_burst
Ciao,
vediamo un po' :-)
"Bandit":

Questo metodo prevede di allocare ai processi, blocchi di memoria di dimensione variabile, assecondando la visione dell'utente, il quale vede la memoria come un'insieme di segmenti di dimensione variabile

in modo astratto, diciamo di sì

Il segmento è un unità logica come un programma principale, una funzione , una procedura, e l'insieme di questi segmenti costituisce il programma.

mmm il paragone non è molto corretto.
Più corretto, l'insieme dei segmenti è un processo. Un segmento è una scatola con un'etichetta, il processo è una scatola con un'etichetta anchessa ma che contiene i segmenti. :-)


L'insieme dei sementi costituisce lo spazio di indirizzamento logico, dove ogni indirizzo (e quindi ogni segmento) è individuato da una coppia di valori: numero del segmento, offset.

mmm più corretto
l'indirizzo logico è composto da: selettore + offset
il selettore serve per "trovare" il descrittore di segmento nella GDT (o LDT, dipende da che strutturazione o nomenclatura del processore hai)
l'offset lo utilizzi in combinazione con la base (contenuta nel descrittore) per ritrovare l'indirizzo (prima lineare se paginata) fisico.


(dove si divideva in due parti l'indirizzo senza che la cpu ne sapesse nulla)

cosa intendi con questo? intendi la traduzione degli indirizzi o la creazione (MMU)?

Quindi a differenza della paginazione abbiamo che gli indirizzi logici sono bidimensionali e grazie alla tabella dei segmenti si ha la conversione in indirizzi monodimensionali.

ok :-)


Tabella dei segmenti composta dal campo limite (indica la lunghezza del segmento) e dal campo base (contiene l'indirizzo fisico iniziale della mem dove è presente il segmento).

attento, come ho scritto già sopra.
La tabella dei segmenti, contiene i descrittori dei segmenti (task segment, code segment, ecc..) nel descrittore c'è la BASE nell'indirizzo logico c'è il limite (parte offset).


Il primo valore della coppia, serve da indice per la tabella dei segmenti, mentre poi l'altro deve essere confrontato con il valore contenuto nel campo limite e deve essere minore per avere poi l'indirizzo fisico necessario per accedere in mem

sì, ho visto dopo questo pezzo più o meno dici ciò che ho scritto io.
Essere minore serve per la "protezione" (può avere altri significati nella segmentazione, vedi "protezione" nei descrittori di segmento).
Domanda per te: se questo controllo non viene validato, che cosa succede?

Non solo indirizzo fisico, a livello teorico può esserci un ulteriore strato di indirizzamento, gli indirizzi lineari che corrispondono ad avere anche la paginazione, cioè segmentazione+paginazione (processori x86 teoricamente, ma di fatto usa solo segmentazione)

Se hai dubbi, chiedi pure :-)

Bandit1
allora cerco di ricapitolare con ordine

intanto ti ringrazio tanto per avermi risposto :-)

allora la segmentazione è un modo di gestire la memoria centrale, che prevede di assegnare blocchi di dimensione variabile ai processi, secondo la visione dell'utente , il quale vede la memoria come un'insieme di segmenti di dimensione variabile.
Un processo è un insieme di segmenti. Un singolo segmento potrebbe essere una funzione principale, una istruzione particolare o cmq una parte di un processo. Quindi se i processi hanno degli indirizzi, anche i segmenti (che costituiscono i processi) hanno degli indirizzi. Indirizzi che sono composti da identificatore (che tu hai chiamato "selettore", ma posso anche chiamarlo "nome" o anche "segmento", giusto?) + un offsett.

ora con la tabella dei segmenti non ci ho capito nulla più di ciò che hai scritto.
la tabella è il supporto hardware che permette di mappare l'indirizzo bidimensionale logico dei segmenti, con l'indirizzo fisico col quale accedere alla memoria. Questa tabella è costituita da due colonne, la prima è il campo limite la seconda il campo base.

disegno che per esempio si può prendere da qui http://www.fe.infn.it/~gianoli/SO/lezioni/SO7_out.pdf pag 48
Col segmento dell'indirizzo logico , che mi funge da indice della tabella, trovo il valore nel campo limite , e quindi quello nel campo base che si andrà a sommare all'offset ,e quindi otterò l'indirizzo per entrare effettivamente in memoria

ora il fatto dei descrittori non l'ho capito: nella tabella mica ci sono i descrittori?


per il fatto se il controllo non viene validato, avviene un interruzione, credo per verificare se c'è un'errore nella segmentazione.

per l'indirizzo che si divide in due parti nel caso della paginazione volevo dire che il processore non sa che la paginazione divide l'indirizzo in due parti, e non sa nemmeno quale sia l'indirizzo effettivamente usato per accedere in memoria, questo è compito della mmu che permette appunto di fare questa operazione del tutto trasparente all'utente (cioè l'utente no nne sa nulla di tutto ciò, in quanto vede la memoria come uno spazio disponibile per un determinato processo e non per una grande varietà d processi.) a differenza della segmentazione dove invece l'indirizzo è composto da due parti in modo nativo.

hamming_burst
allora la segmentazione è un modo di gestire la memoria centrale, che prevede di assegnare blocchi di dimensione variabile ai processi, secondo la visione dell'utente , il quale vede la memoria come un'insieme di segmenti di dimensione variabile.

ok.
domanda: chi gestisce i segmenti?


Un processo è un insieme di segmenti.

Più corretto "un Task è un insieme di segmenti". Non lo ho menzionato sopra per non crearti altri dubbi, ma c'è differenza. Un task può essere:
- un processo
- un thread
diciamo che è la generalizzazione di questi due.


Un singolo segmento potrebbe essere una funzione principale, una istruzione particolare o cmq una parte di un processo.

non vorrei che confondessi "funzione" di un pezzo di codice come un segmento singolo.
Fai attenzione.


Quindi se i processi hanno degli indirizzi, anche i segmenti (che costituiscono i processi) hanno degli indirizzi. Indirizzi che sono composti da identificatore (che tu hai chiamato "selettore", ma posso anche chiamarlo "nome" o anche "segmento", giusto?) + un offsett.

sono i segmenti che hanno gli indirizzi, i processi sono una astrazione di ciò. Un processo è un segmento particolare (task-segment), un processo contiene i segmenti (o meglio tiene traccia dei vari segmenti) code-segment, stack-segment, ecc...
Fai attenzione a non astrarre prima del dovuto. Prima capisci cosa è un segmento e come viene gestito, poi parla di processi.


ora con la tabella dei segmenti non ci ho capito nulla più di ciò che hai scritto.

se non è chiaro nel mio discorso: tabella dei segmenti = GDT (Global Descriptor Table)
una tabella dei segmenti contiene DESCRITTORI che vengono indirizzati dall'indirizzo logico (selettore cerca proprio in questa tabella)


la tabella è il supporto hardware che permette di mappare l'indirizzo bidimensionale logico dei segmenti, con l'indirizzo fisico col quale accedere alla memoria. Questa tabella è costituita da due colonne, la prima è il campo limite la seconda il campo base.

ma no!
te ti confondi con la TLB (translation lookaside buffer) la Cache che è collegata direttamente con la CPU. http://it.wikipedia.org/wiki/Translatio ... ide_Buffer

la TdS è un vettore virtuale che non esiste veramente, è salvato nella memoria fisica. che è gestita come hai detto. Campo base + offset con un'operazione (che non ricordo quale sia, se bit-a-bit o una semplice concatenazione)


disegno che per esempio si può prendere da qui http://www.fe.infn.it/~gianoli/SO/lezioni/SO7_out.pdf pag 48

ok è giusto, metto in conto che la "segment table" è in memoria fisica non in hardware separato.


Col segmento dell'indirizzo logico , che mi funge da indice della tabella, trovo il valore nel campo limite , e quindi quello nel campo base che si andrà a sommare all'offset ,e quindi otterò l'indirizzo per entrare effettivamente in memoria

con "segmento" intendi il "selettore"?


ora il fatto dei descrittori non l'ho capito: nella tabella mica ci sono i descrittori?

forse questo è un discorso più avanzato, vedendo le slide non ne parla. Lascia stare, sappi che è come un'etichetta che contiene sì la "base", ma anche più informazioni per la "protezione" (read/write, autorizzazioni, ecc...)


per il fatto se il controllo non viene validato, avviene un interruzione, credo per verificare se c'è un'errore nella segmentazione.

propriamente sarebbe un fault, ma se non hai visto i descrittori il mio discorso non è valido, cioè la mia domanda era che cosa accadeva ai privilegi dei descrittori, ma lascia stare :-)


per l'indirizzo che si divide in due parti nel caso della paginazione volevo dire che il processore non sa che la paginazione divide l'indirizzo in due parti, e non sa nemmeno quale sia l'indirizzo effettivamente usato per accedere in memoria, questo è compito della mmu che permette appunto di fare questa operazione del tutto trasparente all'utente (cioè l'utente no nne sa nulla di tutto ciò, in quanto vede la memoria come uno spazio disponibile per un determinato processo e non per una grande varietà d processi.) a differenza della segmentazione dove invece l'indirizzo è composto da due parti in modo nativo.

bhe questo mi pare anche ovvio, se l'utente si deve preoccupare di ciò stiamo freschi. I computer sarebbero ancora gestiti da schede perforate... :D

Se hai dubbi chiedi pure :-)

Bandit1
chi gestisce i segmenti ? potrebbe essere il sistema operativo

quella precisazione che hai fatto "non vorrei che confondessi "funzione" di un pezzo di codice come un segmento singolo." che vuoi dire? su un singolo segmento non c'è una sola funzione particolare del codice? ma un gruppo di esse,cioè un gruppo di funzioni e quindi una parte di codice?

le slides sono le prime che ho trovato su internet.
i descrittori li ho fatti ma non li ho collegati con questo argomento

per il fatto dei privilegi , forse il sistema operativo può revocare la possibilità di accedere ad una determinato segmento , grazie ai bit di accesso che vengono associati ad ogni segmento.

hamming_burst
"Bandit":
chi gestisce i segmenti ? potrebbe essere il sistema operativo

domanda idiots, ma che per molte persone sembra una cosa non troppo ovvia :-)
da ricordare però Sistema Operativo più supporto hardware dato da registri speciali.

su questo punto comunque ti consiglio di approfondire la cosa, così riesci a legare l'architettura dei calcolatori basati su RAM (un normale PC) alla gestione della segmentazione o paginazione che sia con, i task perciò con processori preemptive.


quella precisazione che hai fatto "non vorrei che confondessi "funzione" di un pezzo di codice come un segmento singolo." che vuoi dire? su un singolo segmento non c'è una sola funzione particolare del codice? ma un gruppo di esse,cioè un gruppo di funzioni e quindi una parte di codice?

sì, hai ragione. Diciamo che non mi ricordavo una cosa. Il code-segment è il macro-segmento che contiene la parte di codice di un processo. Questo segmento NON può restare in memoria completamente, se tutti i processi trasferissero tutto il loro codice ogni volta non si potrebbe parlare di multi-programmazione, perciò vegono suddivisi in qualche maniera (se c'è paginazione a dimensione di pagina). Questi segmentini contengono istruzioni, perciò dici bene sono "pezzi" di codice. :-)

hamming_burst
per il fatto dei privilegi , forse il sistema operativo può revocare la possibilità di accedere ad una determinato segmento , grazie ai bit di accesso che vengono associati ad ogni segmento.

per questo ti dico di sì, ma la cosa è più complessa di questa, perchè, dall'ambiente al momento di questo fault deriva il tipo di evento attivato, comunque è corretto :-)
Poi non è il bit di accesso, ma il byte (o più, ma di solito è 1) di accesso dove sono contenute le varie informazioni sui tipi di privilegi (queste sono nel descrittore).

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.