Download - Sistemi Operativi: Meccanismi - Lezione 03
1
L'architettura di Von Neumann• Architettura di riferimento dei moderni
calcolatori digitali (anni '40)• Descrive un calcolatore general purpose
di tipo “stored program”– Dati e programmi ospitati nella stessa
memoria (principale)– Un processore esegue programmi che
elaborano dati– Dispositivi I/O
• Implementazione di una macchina di Turing universale
2
L'architettura di Von Neumann
Memoriaprincipale
M
Unità dicontrollo
U
Unitàaritmetico
logica
U
Accumulatore
A
Input
I
Output
O
3
Limiti dell'architettura di base• Un solo dispositivo di ingresso-uscita• Un solo registro (accumulatore)• Componenti con velocità molto differenti
– necessità di sincronizzare la comunicazione
• Collo di bottiglia di Von Neumann:– la velocità di comunicazione
CPU/memoria è il fattore limitante
4
Estensioni del modello diVon Neumann
• Utilizzo di bus per il collegamento e la comunicazione efficiente di molteplici periferiche
• Utilizzo di processori con caratteristiche migliori
• Trasferimento dati asincrono– Interruzioni– Direct Memory Access (DMA)
5
BUS• Sottosistema deputato a trasferire dati
fra unità periferiche• Compiti:
– Fornire collegamenti di comunicazione fra periferiche e memoria/CPU
– Arbitrare l'accesso ai collegamenti di comunicazione
6
BUS• Molteplici linee di comunicazione
– Address bus: trasporta gli indirizzi di accesso alla memoria
– Data bus: trasporta I dati dalla/alla memoria– Control bus: trasporta segnali di controllo
• Master (active) device: può iniziare azioni di trasferimento
• Slave (passive) device: ascolta le richieste– Comando: CPU master, disk slave– Trasferimento dati: disk master, memoria
slave• La memoria non può mai essere master!
7
Architettura con BUS
CPU
C
Memoriaprincipale
M
Unità I/O
U
Unità I/O
U
Address bus
Data bus
Control bus
8
BUS sincrono: lettura
CLK
ADDR
DATA
RD/WR
ENABLE
1. La CPU (master) scrive l'indirizzodi memoria sulla linea ADDR
A1
9
BUS sincrono: lettura
CLK
ADDR
DATA
RD/WR
ENABLE
2. La CPU imposta ad 1il segnale RD
A1
10
BUS sincrono: lettura
CLK
ADDR
DATA
RD/WR
ENABLE
3. La CPU aspetta un ciclo1-0-1 su ENABLE prima di leggere DATA
A1
11
BUS sincrono: lettura
CLK
ADDR
DATA
RD/WR
ENABLE
4. Nel frattempo, la memoria (slave) riconosceil suo indirizzo in ADDR e scrive il valore suDATA
A1
D1
12
BUS sincrono: lettura
CLK
ADDR
DATA
RD/WR
ENABLE
3. La CPU legge il valore su DATA
A1
D1
13
Tipologie di BUS comuni (IBM PC)• Seriali (USB, SATA), paralleli (ATA, SCSI)• Sincroni, asincroni• Di sistema (processor-memory)
– Front-side bus• Di I/O (periferica-memoria):
– ISA, EISA, PCI, PCI-Express, USB, Firewire, AGP
• Bridge (interconnessione bus diversi)• Backside (processore-cache L2)
Le periferiche si collegano ad un canale del bus!
14
Unità periferiche
• Controllore: è un circuito elettronico responsabile del trasferimento dati periferica-buffer locale– gestione di un buffer di memoria locale– gestione di un insieme di registri
speciali♦registri di stato♦registri di comando
• Periferica = Controllore + attuatore (meccanico, ottico, elettromagnetico)
15
Esempio di periferica
Disco SCSI
16
BUS e periferiche
Alloggiamenti (slot) BUS PCI Scheda PCI
17
La scheda madre
18
La scheda madre
19
Il processore (Intel): registri• Presenza di svariati registri (16, 32, 64 bit)• Registri general purpose:
– EAX, EBX, ECX, EDX• Instruction pointer:
– EIP• Stack pointer:
– ESP, EBP• Stato (overflow, segno, riporto):
– EFLAGS
20
Il processore (Intel): memoria• Uso di svariate cache velocissime (L1, L2) per
ridurre l'effetto del collo di bottiglia di Von Neumann– memorie associative: TLB
• Due modelli di memoria possibili:– Flat model ( un solo unico grande blocco)– Segmentato (ciascun processo ha a
disposizione un proprio blocco di memoria)• Modalità di indirizzamento:
– Registro (mov eax, ecx)– Immediato (mov eax, 26)– Registro diretto (mov eax, [esp])– Spiazzamento (mov eax, [esp + 4])
21
Il processore (Intel): istruzioni• Modello set istruzioni
– CISC: poche istruzioni, complesse– RISC: molte istruzioni, semplici
• Flusso istruzioni superscalare:– due pipeline a cinque stadi (Pentium)
♦1 generica, l'altra per op. su interi– Fetch: prelievo opcode istruzione– Decode: decodifica istruzione– Operand fetch: prelievo operando– Instruction execution: esecuzione istruzione– Write back: scrittura del risultato
22
Il processore (Intel): parallelismo• Hyperthreading:
– una copia della circuiteria per l'esecuzione delle istruzioni
– più copie dei registri general purpose e di controllo
– esecuzione simultanea di codice su dati diversi
• Multi-core:– presenza di più miniprocessori con cache L1
(detti core)– unica cache L2 condivisa fra i vari core
23
Il processore (Intel): Pentium
24
Il processore (Intel): Pentium
Il processore
Lo schema architetturale
La ventola di raffreddamento(CPU fan)
25
Meccanismi trasferimento dati• Sistemi time-sharing e multiprogrammati• Meccanismi per la sovrapposizione di:
– operazioni CPU– operazioni I/O
• Meccanismi sofisticati di trasferimento dati:– basati su interruzioni– basati su DMA
26
Trasferimento dati nei vecchi sistemi• Trasferimento dati controllato da CPU• Nessuna sovrapposizione CPU – I/OEsempio: stampa dati dalla memoria
1.Controlla se stampante è pronta a ricevere il carattere successivo
2.Se non è pronta, torna al passo 1.3.Se è pronta, controlla se è necessario
stampare un altro carattere4.Se c'è un altro carattere, torna al passo 1.5.Se non ci sono altri caratteri->FINE
27
Trasferimento dati nei vecchi sistemi
• Busy waiting:– la CPU controlla costatemente lo stato
relativo all'I/O, mantenendosi attiva– Conseguentemente, la CPU non può
intraprendere alcuna altra operazione– spreco di potenza di calcolo– Soluzione: sistema di I/O basato sulle
interruzioni
28
Trasferimento dati basato su interruzioni
CPU
Controllore di memoria
memoria
controlloreunitàdischi
controlloredi lettoreschede
controlloreunitànastri
29
Trasferimento dati basato su interruzioni: esempio
CPU
Controllore di memoria
memoria
controlloreunitàdischi
controlloredi lettoreschede
controlloreunitànastri
1. La CPU carica i registri di comandoidonei all'interno del controllore econtinua l'esecuzione normale delprogramma.
30
Trasferimento dati basato su interruzioni: esempio
CPU
Controllore di memoria
memoria
controlloreunitàdischi
controlloredi lettoreschede
controlloreunitànastri
2. Il controllore esamina il contenuto deiregistri di comando per decidere l'opera-zione da intraprendere (ad es., read).
?
31
Trasferimento dati basato su interruzioni: esempio
CPU
Controllore di memoria
memoria
controlloreunitàdischi
controlloredi lettoreschede
controlloreunitànastri
3. Il controllore pilota il trasferimento deidati dalla periferica opportuna al bufferdi dati locale.
32
Trasferimento dati basato su interruzioni: esempio
CPU
Controllore di memoria
memoria
controlloreunitàdischi
controlloredi lettoreschede
controlloreunitànastri
4. La periferica trasferisce i dati versoil buffer locale nel controllore.
33
Trasferimento dati basato su interruzioni: esempio
CPU
Controllore di memoria
memoria
controlloreunitàdischi
controlloredi lettoreschede
controlloreunitànastri
5. Al termine del trasferimento, ilcontrollore segnala la presenza deidati tramite una interruzione.
34
Trasferimento dati basato su interruzioni: esempio
CPU
Controllore di memoria
memoria
controlloreunitàdischi
controlloredi lettoreschede
controlloreunitànastri
6. La CPU interrompe ciò che stavafacendo e trasferisce il controllo ad unalocazione fissa: procedura di serviziodella interruzione.
35
Trasferimento dati basato su interruzioni: esempio
CPU
Controllore di memoria
memoria
controlloreunitàdischi
controlloredi lettoreschede
controlloreunitànastri
7. La procedura di servizio dell'interruzionetrasferisce i dati dal buffer locale delcontrollore alla memoria principale.
36
Trasferimento dati basato su interruzioni: esempio
CPU
Controllore di memoria
memoria
controlloreunitàdischi
controlloredi lettoreschede
controlloreunitànastri
7. Terminato il trasferimento dati inmemoria, la CPU riprende i calcoliinterrotti.
37
Vettore delle interruzioni• Una procedura di gestione per ciascuna
classe di controllori• Dove sono memorizzati gli indirizzi delle
procedure di controllo?• Vettore delle interruzioni: vettore degli
indirizzi delle procedure di controllo– indicizzato da:
♦un numero di dispositivo♦un identificatore della linea di interruzione
(IRQ)– memorizzato nelle prime locazioni di
memoria
38
Nesting delle interruzioni• Nei primi sistemi basati su interruzioni, durante la
gestione di una interruzione le altre interruzioni vengono disabilitate
– evitare che più interrupt identiche possano operare sugli stessi dati
• Le architetture più sofisticate permettono l'esecuzione annidata (nesting) delle interruzioni
– assegnazione di priorità alle diverse interruzioni
– interruzioni di priorità superiore vengono servite prima, anche in presenza di una interruzione di priorità inferiore
– in quest'ultimo caso, vengono disabilitate tutte le interruzioni di priorità inferiore a quella in esecuzione
39
Eccezioni• Eccezione: interruzione generata dal
software condizioni anomale– divisione per zero– accesso alla memoria non valido
• Trap: procedura di servizio associata ad una eccezione
40
Salvataggio degli indirizzi di ritorno• Poichè l'esecuzione di codice può essere
interrotta in maniera asincrona, è necessario salvare l'indirizzo di ritorno
• Indirizzo di ritorno: indirizzo successivo all'ultima istruzione eseguita prima della interruzione
41
Salvataggio degli indirizzi di ritorno• Indirizzo di ritorno memorizzato su una
pila (stack, ESP) di sistema• Lo stack contiene una sequenza di stack
frame (EBP)– indirizzo di ritorno, valore di alcuni registri
della CPU, parametri di ingresso e di uscita
• Al termine della procedura di servizio della interruzione:– valore dei registri CPU viene ripristinato– esecuzione riprende da indirizzo di ritorno
42
Uso dello stack: un esempio• Si supponga di avere un programma che
esegue la funzione DrawSquare(), che a sua volta esegue la funzione DrawLine()
void DrawLine( ... ) {
...
}
void DrawSquare( ... ) {
DrawLine(...);
}
int main() {
DrawSquare( ... );
}
43
Uso dello stack: un esempio• Quando DrawSquare() è in esecuzione (prima di
invocare DrawLine()), lo stack delle chiamate si presenta nel modo seguente:
Var. localiDrawSquare()
Ind. Ritorno
ParametriDrawSquare()
Stack frameDrawSquare() Frame pointer
Stack pointer
44
Uso dello stack: un esempio• Quando DrawLine() è in esecuzione, lo stack delle
chiamate si presenta nel modo seguente:
Var. localiDrawLine()
Ind. Ritorno
ParametriDrawLine()
Var. localiDrawSquare()
Ind. Ritorno
ParametriDrawSquare()
Stack frameDrawSquare()
Stack frameDrawLine()
Stack pointer
Frame pointer
45
Uso dello stack: un esempio• Quando DrawSquare() ritorna in esecuzione (dopo la
chiamata a DrawLine()), lo stack delle chiamate si presenta nel modo seguente:
Var. localiDrawSquare()
Ind. Ritorno
ParametriDrawSquare()
Stack frameDrawSquare() Frame pointer
Stack pointer
46
Uso dello stack sull'INTEL• Si prenda il sorgente prova.c allegato
– lo si compili: gcc -o prova prova.c– Si generi l'assembly: gcc -S prova.c
• In alternativa, si disassembli prova:– objdump –disassemble prova
(comprende gli stub della glibc)• Si apra il file prova.s• File suddiviso in “sezioni”
– Sezione: area di memoria deputata a contenere codice, dati, quant'altro
– Ciascuna sezione ha una etichetta (label) che la contraddistingue
47
Uso dello stack sull'INTEL• Conoscenza necessaria dell'assembly x86• movl: copia un valore a 32 bit da un
registro/memoria ad un altro registro/memoria• pushl: inserisci un valore nello stack• popl: rimuovi un valore dallo stack• addl/subl: aggiunge/sottrae un valore a 32 bit da
un registro/memoria ad un altro registro/memoria• leave: toglie il valore del frame pointer dallo stack• ret: ritorno da funzione• leal: carica indirizzo effettivo• andl: and bit a bit (allinea a multipli di 16)• call: chiamata a subroutine
48
Chiamata a funzione• Viene effettuata una push di tutti gli argomenti,
dall'ultimo al primo
• Viene effettuata una chiamata alla funzione
• f(a, b); diventa:– pushl a– bushl b– call f
49
Scheletro funzione• Lo scheletro di una tipica funzione in
Assembly è il seguente– salvataggio valore corrente frame pointer– impostazione frame pointer a stack pointer
corrente (1)– creazione spazio per le variabili locali (2)– backup registri da preservare (3)– corpo della funzione (4)– restore registri da preservare (5)– rilascia spazio legato alle variabili locali (6)– ripristina il valore precedente di frame pointer
(7)– Return (8)
50
Scheletro funzione (Assembly)pushl %ebpmovl %esp, %ebpsubl $N, %esppushl %ebxpush %esi...popl %esipopl %ebxmovl %ebp, %esppopl %ebpret
(1)(1)(2)(3)(3)(4)(5)(5)(6)(7)(8)
(2) Nei sistemi Intel, lo stackcresce verso gli indirizzipiù bassi!
51
Impatto delle istruzioni sullo stack
Stack frameprecedente
F
EBP
E
ESP
E
Prima della chiamata f(a, b);
52
Impatto delle istruzioni sullo stack
Stack frameprecedente
F
EBP
E
ESP
E
pushl apushl b
ab
53
Impatto delle istruzioni sullo stack
Stack frameprecedente
F
EBP
E
pushl apushl bcall f
ab
ESP
E
vecchio EIP
54
Impatto delle istruzioni sullo stack
vecchio EBP
pushl %ebp
Stack frameprecedente
F
EBP
E
ab
ESP
E
vecchio EIP
55
Impatto delle istruzioni sullo stack
vecchio EBP
pushl %ebpmovl %esp, %ebp
Stack frameprecedente
F
EBP
E
ab
ESP
E
vecchio EIP
56
Impatto delle istruzioni sullo stack
ESP
E
pushl %ebpmovl %esp, %ebpsubl $N, %esp
var. loc. 1var. loc. 2
...
.
var. loc. N/4
vecchio EBP
Stack frameprecedente
F
ab
vecchio EIPEBP
E
57
Impatto delle istruzioni sullo stack
ESP
E
pushl %ebpmovl %esp, %ebpsubl $N, %esppushl %ebxpush %esi
EBX
E
ESI
var. loc. 1var. loc. 2
...
.
vecchio EBP
Stack frameprecedente
F
ab
vecchio EIPEBP
E
var. loc. N/4
58
Impatto delle istruzioni sullo stackpushl %ebpmovl %esp, %ebpsubl $N, %esppushl %ebxpush %esi... (corpo funzione)
ESP
E
EBX
E
var. loc. 1var. loc. 2
...
.
vecchio EBP
Stack frameprecedente
F
ab
vecchio EIPEBP
E
var. loc. N/4
ESI
59
Impatto delle istruzioni sullo stackpushl %ebpmovl %esp, %ebpsubl $N, %esppushl %ebxpush %esi...popl %esipopl %ebx
var. loc. 1var. loc. 2
...
.
vecchio EBP
Stack frameprecedente
F
ab
vecchio EIPEBP
E
var. loc. N/4 ESP
E
60
Impatto delle istruzioni sullo stackpushl %ebpmovl %esp, %ebpsubl $N, %esppushl %ebxpush %esi...popl %esipopl %ebxmovl %ebp, %esp
vecchio EBP
Stack frameprecedente
F
EBP
E
ab
ESP
E
vecchio EIP
61
Impatto delle istruzioni sullo stackpushl %ebpmovl %esp, %ebpsubl $N, %esppushl %ebxpush %esi...popl %esipopl %ebxmovl %ebp, %esppopl %ebp Stack frame
precedente
F
EBP
E
ab
ESP
E
vecchio EIP
62
Impatto delle istruzioni sullo stackpushl %ebpmovl %esp, %ebpsubl $N, %esppushl %ebxpush %esi...popl %esipopl %ebxmovl %ebp, %esppopl %ebpret
Stack frameprecedente
F
EBP
E
ESP
E
L'istruzione ret estrae dallo stackil solo indirizzo di ritorno, e non iparametri a e b. Nella realtà,l'indirizzo iniziale dello stackviene salvato e ripristinato.
Il valore di ritorno della funzioneviene scritto nel registro %eax.
63
Espressioni notevoli• 16(%ebp): terzo parametro della funzione
• 12(%ebp): secondo parametro della funzione
• 8(%ebp): primo parametro della funzione
• 4(%ebp): vecchio instruction pointer
• 0(%ebp): vecchio frame pointer
• -4(%ebp): prima variabile locale
• -8(%ebp): seconda variabile locale
• -12(%ebp): terza variabile locale
64
Programmed I/O• Tecnica originaria di trasferimento dati• Il trasferimento avviene tramite funzioni
assembler (in()/out()) eseguite dal processore
• Il processore aspetta il risultato della chiamata, senza poter fare altro
• Utilizzata nei dischi IDE/ATA
65
Direct Memory Access (DMA)• Problema: una periferica ad alta velocità
può generare una miriade di interruzioni– CPU costantemente impegnata a trasferire
dati in memoria
• Soluzione: trasferire blocchi di dati ad ogni interruzione senza ricorrere all'ausilio della CPU
66
Direct Memory Access (DMA)• Direct Memory Access• Il controllore del dispositivo trasferisce
l'intero buffer di dati direttamente in memoria– device driver del dispositivo attiva il DMA
impostando alcuni registri del controllore– nessun intervento da parte della CPU
durante la copia– un'interruzione per buffer dati, non per byte
67
Interruzioni ed I/O• Due modalità di richieste di I/O
– richieste bloccanti– richieste non bloccanti
• Modalità bloccante: il controllo torna al programma utente solo dopo che l'I/O è stato completato– al più un I/O completato alla volta
• Modalità non bloccante: il controllo torna al programma utente immediatamente– più richieste di I/O concorrenti
68
Interruzioni ed I/O• Come fare a mantenere traccia di più
richieste di I/O simultanee (caso non bloccante)?
• Tabella di stato dei dispositivi– ogni elemento della tabella indica:
♦il tipo di dispositivo♦l'indirizzo del dispositivo♦lo stato del dispositivo (attivo, inattivo,off)
– più richieste per un dato dispositivo♦ogni elemento della tabella di stato può
essere una lista
69
Interruzioni ed I/O
dispositivo: lettore di schede 1stato: inattivo
dispositivo: stampante 3stato: attivo
dispositivo: unità a dischi 1stato: inattivo
dispositivo: unità a dischi 2stato: inattivo
dispositivo: unità a dischi 3stato: attivo
...
richiesta perstampante 3indirizzo: 38546lunghezza: 1372
richiesta perunità a dischi 3file: xxxoperazione: readindirizzo: 43046lunghezza: 20000
...
70
Interruzioni ed I/O1. Programma esegue richiesta I/O
2. Richiesta viene accodata alla lista del dispositivo opportuno nella tabella di stato
3. Periferica elabora la richiesta
4. Una interruzione segnala il completamento
5. Device driver identifica il dispositivo relativo
6. Viene scandita la lista del dispositivo
7. Viene aggiornata la struttura associata alla richiesta
8. Un programma stava attendendo quei dati? Se sì, viene attivato.
9. Altrimenti, si ripristina lo stato precedente all'interruzione
71
Interruzioni ed I/O
• I sistemi di I/O più sofisticati permettono di ricevere dati prima di essere richiesti dal programma– esempio tipico: scrittura veloce su tastiera
• In questo caso, nella lista del dispositivo non risulta alcuna richiesta da parte di programmi
• Vanno utilizzati ulteriori buffer per memorizza-re dati in attesa che un programma li richieda– un buffer per ciascun dispositivo di input
72
Meccanismi di protezione• In un sistema multiprogrammato, un
programma potrebbe erroneamente modificare arbitrariamente altre locazioni di memoria
• Molti errori vengono rilevati dall'hardware– es. tentativo di eseguire istruzione illegale
• Cosa succede se l'errore non è rilevabile dall'hardware?– es. accesso da parte di un programma a dati
del SO• Serve un meccanismo di protezione della
memoria
73
Modalità operativa duale• Modalità duale: vengono previste due
modalità di funzionamento della macchina.– modo utente– modo monitor (supervisor)
• All'hardware della macchina viene aggiunto un bit: bit modo– 0->monitor (operazione effettuata dal SO)– 1->utente (operazione effettuata da utente)
74
Modalità operativa duale• Ogni volta che si presenta una interruzione, si
passa in modo monitor:bit modo = 0
• Prima di ripassare il controllo al programma utente, viene impostato il modo utente:bit modo = 1
• Alcune istruzioni, dette privilegiate, possono essere eseguite solo in modo monitor
• Se si tenta di eseguire una istruzione privile-giata in modo utente, viene sollevata una eccezione: istruzione illegale
75
Protezioni hardware• Un programma utente può danneggiare il
funzionamento del SO nei seguenti modi:– emettendo istruzioni di I/O illegali– accedendo a porzioni di memoria nel SO– rifiutando il rilascio della CPU
• E' necessario impedire ciascuna di tali operazioni maligne
76
Protezioni hardware• Accessi a porzioni di memoria del SO
– per ciascun programma si definisce un intervallo di indirizzi legali accedibili
– utilizzo di due registri CPU:♦registro base: contiene l'indirizzo più
basso accessibile al programma♦registro limite: contiene l'ampiezza
dell'intervallo degli indirizzi– la CPU verifica che qualunque indirizzo
generato dall'utente rientri nell'intervallo– indirizzo fuori intervallo->eccezione– i registri base e limite sono caricati tramite
istruzioni privilegiate
77
Protezioni hardware• Esecuzione di istruzioni di I/O illegali
– tutte le istruzioni di I/O vengono rese privilegiate
– gli utenti possono eseguire I/O solamente attraverso il sistema operativo
– OSS.: un programma che entra in monitor mode potrebbe sovrascrivere il vettore delle interruzioni ed eseguire codice arbitrario
– occorre allora proteggere il vettore delle interruzioni e le procedure di servizio
– in realtà, viene protetto l'intero SO– tecnica usata nella protezione: spazi di
indirizzamento seperati per SO ed utenti
78
Protezioni hardware
monitor
job 1
job 2
job 3
job 4
0
256000
300040
420940
880000
1024000
300040
120900
registro base
registro limite
79
Protezioni hardware• Rifiuto del rilascio della CPU
– viene introdotto un timer che interrompe l'esecuzione della CPU dopo un intervallo di tempo prestabilito
– Il timer è incrementato da un clock di sistema ad intervalli regolari
– quando scade il timer, viene generata una interruzione che trasferisce l'esecuzione ad un altro programma
– timer ragionevolmente piccolo->time sharing♦intervallo->quanto di tempo
80
Protezione nei processori Intel• Ottenuta tramite molteplici componenti
elettronici• Protezione dall'uso esclusivo di CPU:
– Programmable Interval Timer• Protezione da accessi invalidi alla memoria:
– Segmentazione della memoria, privilege levels
• Protezione da esecuzione istruzioni illegali:– Privilege levels, execution rings
81
Programmable Interval Timer• Timer programmabile integrato nel circuito che
gestisce il Southbridge (I8253, I8254)• Tre contatori ad alta precisione:
– timeout ACPI (protocollo gestione risparmio energetico)
– Interruzioni sul singolo processore; serve per bilanciare le interruzioni equamente in sistemi SMP (APIC)
– Time Stamp Counter (Pentium); un registro a 64 bit che conta il numero di colpi di clock dall'ultimo reset
• Frequenza aggiornamento contatori: da 18.2Hz a 1MHz
82
Programmable Interval Timer• Diverse modalità di esecuzione
– Conteggio a 0– Generazione di impulsi periodici (quanto di
tempo)– Generazione di onde quadre
• Al termine di ogni evento, viene generata una interruzione hardware (IRQ 0)
83
Gestione della memoria negli Intel• L'architettura Intel fornisce due meccanismi
per accedere alle celle di memoria di un calcolatore: segmentazione e paginazione
• Segmentazione:– la memoria è vista come un insieme di aree
(segmenti), ciascuna con un proprio scopo (codice, dati, stack)
– è facile controllare se un processo sta accedendo ad un indirizzo che gli compete oppure no (basta controllare che l'indirizzo generato stia all'interno di uno dei segmenti di competenza del processo)
84
Gestione della memoria negli Intel• L'architettura Intel fornisce due meccanismi
per accedere alle celle di memoria di un calcolatore: segmentazione e paginazione
• Paginazione:– la memoria viene vista a blocchi di 4KB
(pagine)– Permette il caricamento efficiente di programmi
da disco (“per pezzi”)– permette una condivisione raffinata ed
efficiente di zone di memoria comuni– permette l'implementazione della memoria
virtuale
85
I diversi tipi di indirizzi• L'architettura Intel passa per diversi formati di
indirizzi intermedi, prima di poter prelevare fisicamente il dato dalla RAM
• Questi formati sono il prodotto dei meccanismi di segmentazione e paginazione
• Tre formati:– Indirizzi logici– Indirizzi lineari– Indirizzi fisici
86
Indirizzi logici• La memoria del calcolatore può essere vista
come un insieme di porzioni di memoria piccole, dedicate ad un ben specifico scopo (segmenti)– Codice, dati, stack
• Un indirizzo logico di memoria identifica una cella di memoria nel seguente modo:– Identificatore di segmento (segment
selector)– Offset all'interno del segmento
• L'indirizzo logico (detto anche far pointer) è una coppia (selector, offset)– 0000:00401000
87
Indirizzi logici
Memoria principale
Segmento codice/bin/bash
Segmento dati/bin/bash
Segmentselector
offsetCella di memoria
Segmento stack/bin/bash
88
Registri di segmentazione• Dove vengono memorizzate le coppie
(selector, offset) degli indirizzi logici?• L'architettura Intel mette a disposizione
svariati registri segmento (segment registers)– Indicano con QUALE segmento lavorare– ss: stack segment– cs: code segment– ds, es, fs, gs: data segment
• L'offset è memorizzato nei registri indirizzo classici (EIP, ESI, EDI)
• movl $42, %fs:(%eax)
89
Indirizzi lineari• Sono la rappresentazione “classica” della
memoria• La memoria viene vista come un array
gigantesco di 2^n celle, indirizzabile tramite interi da 0 a 2^n-1
• Un indirizzo lineare è un intero da 0 a 2^n-1 che punta alla cella di memoria corrispondente
90
Indirizzi lineariMemoria principale
Indirizzolineare
Cella di memoria
0
2^n-1
91
Indirizzi fisici• Sono simili strutturalmente agli indirizzi lineari
– Corrispondenza 1:1• Non è detto che abbiano gli stessi valori• Nel caso in cui sia attiva la paginazione:
– traduzione indirizzo lineare-indirizzo fisico• Nel caso in cui NON sia attiva la paginazione:
– Gli indirizzi lineari sono usati direttamente sulla linea ADDRESS del Northbridge, che ci connette al front side bus
92
Schema traduzione indirizzi• Da dove parto? Da un indirizzo logico
espresso nella forma (selector, offset) dove:– selector è ottenibile da un segment register– offset è un valore costante/contenuto di un
registro• Dove devo arrivare? Alla generazione di un
indirizzo fisico da scrivere sul bus
Indirizzo logico
T
Indirizzo fisico
93
Schema traduzione indirizzi• Il modulo di traduzione degli indirizzi cambia
forme diverse a seconda della modalità di lavoro della CPU– Real mode: 286 sempre, 386 e superiori nella
fase iniziale del processo di avvio (fino all'avvio di /sbin/init)
– Protected mode: 386 e superiori• Da cosa nasce la diversità?
– Il 286 NON ha la paginazione– Il 286 ha registri a 16 bit, il 386 e superiori ce
li hanno da 32 bit
94
Traduzione indirizzi: real mode1.Supponiamo di dover eseguire l'istruzione
JMP 0x60252.La CPU legge il segment register cs e lo
interpreta come l'identificatore del segmento3.L'identificatore viene trasformato in un
“indirizzo di partenza del segmento” tramite una moltiplicazione x 16 (shift logico a sinistra di 4 bit)
4.Viene sommato l'offset5. Il risultato è l'indirizzo lineare; l'indirizzo
lineare coincide con l'indirizzo fisico (no paging)
95
Traduzione indirizzi: real mode
IstruzioneJMP 0x6025
I
Registro CS0x1000
R
Offset0x6025
O
Indirizzofisico 0x16025
Northbridge
N
Front sidebus
F
RAM
R
CS * 16+ offset
C
96
Traduzione indirizzi: protected mode• In modalità protetta, il segment selector non è
più un numero intero, bensì l'indice di un segment descriptor in una tabella
• Segment descriptor: struttura dati di 8 byte contenente tutte le informazioni necessarie a descrivere un segmento– Base address: indirizzo lineare a 32 bit
indicante la locazione iniziale del segmento– Limit: specifica la lunghezza del segmento– DPL: Descriptor Privilege Level (0-3), descrive il
privilegio minimo per accedere al descrittore
• I segment descriptor acceduti più frequentemente sono mantenuti in una cache
97
Traduzione indirizzi: protected modeSegment descriptor
Base (24-31)
B
4 byte
4 byte Base (0-15)
B
Limit(16-19)
L
Limit (0-15)
L
Base (16-23)
B
DPL
D
01531
63 47 32
98
Traduzione indirizzi: protected mode• I descrittori di segmento sono memorizzati in
due tabelle distinte: global descriptor table (GDT) e local descriptor table (LDT)– 64KB, 8192 entry da 8 byte
• Global Descriptor Table: contiene descrittori di interesse “globale”– Descrittori di aree di memoria contenenti LDT,
Task State Segment, Call Gate
• Local Descriptor Table: contiene descrittori di interesse “locale”– Ne esiste una per ciascun programma in
esecuzione
99
Traduzione indirizzi: protected mode• Ciascuna CPU/core ha un registro gdtr
contenente l'indirizzo iniziale della GDT• Per scegliere un segmento, bisogna caricare
un segment register con un segment selector (analogamente a quanto visto in real mode)
• La differenza sta nel diverso formato del segment selector:– Index: identificatore intero del segmento
utilizzato (13 bit, 8192 segmenti possibili)– TI: bit che identifica in quale tabella è
memorizzato il segmento (0: GDT, 1: LDT)– RPL: Requested Privilege Level (0-3), descrive il
privilegio con cui si sta accedendo al descrittore
100
Traduzione indirizzi: protected mode
2 byte Index (3-15)
I
TI
T
0215
Segment selector
RPL
R
13
101
Traduzione indirizzi: protected mode1. Supponiamo di dover eseguire l'istruzione
JMP 0x08048393 (32 bit)2. La CPU legge il segment selector dal segment
register cs3. Controllo privilegi4. Tramite il bit TI, viene identificata la tabella
(ad es. GDT) in cui il relativo segment descriptor è memorizzato
5. Si individua l'indirizzo del segment descriptor= gdtr + index * 8
6. Si estrae il base address dal segment descriptor7. Si aggiunge l'offset8. Il risultato è l'indirizzo lineare
102
Traduzione indirizzi: protected mode
IstruzioneJMP 0x08048393
I
Offset0x08048393
O
Indirizzolineare 0x08048393
Al sistema dipaginazione
A
Index: 14
I
0
0
3
3
Index * 8+ gdtr
I
CS
gdtr
g
GDT
Segmentdescriptor
S
Base address: 0
B
Base address+ offset
B
103
Traduzione indirizzi: protected mode• Meccanismo di segmentazione complesso• I SO moderni tentano di evitarlo, limitando il
numero di segmenti generati• Il kernel di Linux usa 4 segmenti:
– __KERNEL_CS: kernel code segment, base=0, limit=4GB, DPL=0
– __KERNEL_DS: kernel data segment, base=0, limit=4GB, DPL=0
– __USER_CS: user code segment, base=0, limit=4GB, DPL=3
– __DATA_CS: user data segment, base=0, limit=4GB, DPL=3
104
Traduzione indirizzi: protected mode• Due segmenti distinti per kernel code e user
code, con DPL diversi– Possibilità di proteggere il kernel da accessi
involontari/maliziosi fatti da user space!
• Un solo segmento di codice in ciascun mode– Il meccanismo di segmentazione si alleggerisce
• Flat memory model– Linux, Windows (da NT in poi)
105
Traduzione indirizzi: protected mode• Non abbiamo mica finito; dall'indirizzo lineare
occorre arrivare all'indirizzo fisico!• Meccanismo di paginazione; la memoria viene
vista a blocchi di 4KB• Ciascun blocco può puntare a:
– memoria RAM fisica– blocchi su un filesystem (memory mapping)– area di swap (virtual memory)
• La traduzione indirizzo lineare-contenuto avviene per mezzo di una tabella: page table– Array (in memoria centrale) contenente gli
indirizzi fisici iniziali (32 bit) di ciascuna pagina– Indirizzo iniziale nel registro di controllo CR3
106
Traduzione indirizzi: protected mode• Un indirizzo lineare (0-4GB) viene suddiviso in
due porzioni– I primi 20 bit rappresentano l'indice alla page
table– Gli ultimi 12 bit rappresentano l'offset
dell'indirizzo fisico all'interno della pagina fisica
numero di pagina p offset di pagina d
n-m bit m bit
Dimensione di una pagina: 2n unità di indirizzamentoDimensione dello spazio di indirizzi logici: 2m
n=20, m=12
107
Traduzione indirizzi: protected mode
Indirizzolineare
p d
indirizzo lineare
tabella delle pagine
f
f d
indirizzo fisico
RAMSchema paginazione
CR3+
108
Traduzione indirizzi: protected mode• Se la pagina richiesta non è presente in
memoria centrale, si genera una eccezione: page fault– La routine di servizio preleva la pagina da
memoria secondaria
• Per accedere ad una locazione di memoria occorre:– accedere alla tabella delle pagine, per trovare
l'indirizzo fisico a partire da quello logico– accedere all'indirizzo fisico
• In realtà, ogni accesso alla memoria diventano due accessi alla memoria!– inefficienza
109
Traduzione indirizzi: protected mode• Si usa una memoria associativa hardware,
detta Translation Lookaside Buffer– accesso del tipo: chiave->valore– la memoria associativa trova il valore in
tempo costante– dimensione della memoria associativa molto
ridotta• Il TLS mantiene in cache le porzioni più
accedute della tabella delle pagine
110
Traduzione indirizzi: protected modeSchema paginazione
con TLB
Indirizzolineare
p d
indirizzo lineare
tabella delle pagine
f
f d
indirizzo fisico
TLB
RAM
CR3
+
111
Traduzione indirizzi: protected mode• Le moderne CPU Intel sono corredate con
Physical Address Extension (PAE)– Schema di paginazione a tre livelli– Presenti su Pentium Pro e successivi– Supporto per indirizzare fino a 64GB, senza
cambiare le dimensioni della tabella di pagina e dei blocchi di pagina
– Abilitabile impostando il bit 5 del registro di controllo CR4
• Idea di base: trasformare indirizzi lineari a 32 bit in indirizzi fisici a 36 bit
112
Traduzione indirizzi: protected mode• Il registro CR3 punta ad una piccola Page
Directory Pointer Table di 4 elementi• Ciascun elemento della Page Directory Pointer
Table è una Page Directory• Ciascun elemento della Page Directory è una
Page Table• Il contenuto di un indirizzo lineare viene
suddiviso in tante porzioni, al fine di identificare l'indirizzo fisico finale
113
Traduzione indirizzi: protected mode• I bit 31,30 dell'indirizzo lineare sono l'indice
alla Page Directory Pointer Table• I bit 29,...,21 dell'indirizzo lineare sono l'indice
alla Page Directory• I bit 20,...,12 dell'indirizzo lineare sono l'indice
alla Page Table• I bit 11,...,0 dell'indirizzo lineare sono l'offset
all'interno della Page Table
114
Traduzione indirizzi: protected mode
Indirizzo lineare
Schema paginazione multilivello-PAE
31 24 23 16 15 8 7 0
Dir pointer
Dir pointer
Dir pointer
Dir pointer
CR3
PDPT Pagedirectory
...
64 bitPD entry
...
Pagetable
...
64 bitPT entry
...
...
4KBpage
...
RAM
+
115
Livelli di privilegio• Meccanismo per difendersi da
istruzioni/accessi alla memoria illegali causati da:– malfunzionamenti hardware– comportamenti maliziosi
• La CPU è dotata di 4 modi di utilizzo, disposti “ad anello”– Ring 3: applicazioni utente– Ring 2: device driver– Ring 1: device driver, hypervisor– Ring 0: codice kernel
116
Livelli di privilegio
117
Livelli di privilegio• Un SO “normale” utilizza solamente i livelli di
privilegio 0 (kernel) e 3 (user)– Passaggio automatico tra codice eseguito per
conto del kernel e codice applicativo
• Il ring 1 viene usato nel contesto della virtualizzazione– Xen (dom-1)
118
Livelli di privilegio• Alcune istruzioni macchina (inw()/outw()) sono
permesse solamente in ring 0– Scrittura diretta sui dispositivi non è possibile
se non quando si esegue codice di kernel!– Ovviamente, se il codice del kernel è scritto
male, ogni sorta di danno può accadere
• I livelli di privilegio sono utilizzati anche per controllare i permessi di accesso ai selettori
• I segment selector contengono dei bit di permesso che possono essere controllati durante il processo di accesso al segmento
119
Livelli di privilegio
Data segment selector
Index (3-15) TI
0215
RPL
13
Code segment selector
Index (3-15) TI
0215
CPL
13
CPL: Current Privilege Level (livello di priviligio concui è eseguito il codice del segmento)RPL: Request Privilege Level (livello di privilegio concui si sta tentando di accedere al segmento dati)
120
Livelli di privilegio• Come avviene il controllo dei permessi sul
segmento?• Si estrae il valore CPL dal code segment selector• Si estrae il valore RPL dal data segment selector• Si identifica il segment descriptor usando il campo
Index del data segment selector• Si estrae il valore DPL dal segment descriptor• Si calcola il privilegio più debole fra codice e
richiesta: max(CPL, RPL)• Se max(CPL, RPL) <= DPL, allora l'accesso viene
garantito• Altrimenti, viene generata una eccezione di tipo
General protection fault
121
Livelli di privilegio
Segment descriptor
DPL
Index
Data Segment descriptordei dati da caricare in memoria
RPLTI
Code segment register
CPL
max(CPL,RPL)<=DPL?
True: segmentload
False: GPF
122
123
124
125