Sistemi x86 CALCOLATORI ELETTRONICI LM 1
Registri x86 31 15 8 7 AH AX AL EAX 31 IP BH BX BL EBX CH CX DH DX CL DL ECX EDX 31 FLAGS EF SI ESI DI EDI BP EBP 15 8 7 SP CS SS DS ESP Sono presenti anche i registri Floating Point (stack da 8x8 bit). Nei sistemi a 64 bit sono stati inseriti ulteriori registri R8, R9 R16 ES FS DATA GS 2
Segmentazione sistemi x86 (Sistemi a 32 bit) Protezione e controllo accessi ai vari segmenti per verificare sia il diritto di accedere sia la correttezza dell indirizzo (ex- stack) Vari environments ciascuno dei quali deve risultare separato e protetto dagli altri (multiutenza) Supporto per il sistema operativo 886 Indirizzo Memoria x86 Indirizzo Controllo traduzione Memoria 3
Segmentazione rivisitata La segmentazione è uno schema di gestione della memoria che riflette il punto di vista del programmatore Un programma è una collezione di segmenti: programma principale, procedure, funzioni, oggetti, variabili locali e globali, stack etc. ovvero di moduli con informazioni congruenti da allocare in memoria non necessariamente in indirizzi consecutivi (a livello di moduli) La segmentazione permette la rilocazione dinamica e la condivisione Può dar luogo a frammentazione (esterna da non confondere con quella interna delle pagine), ad esempio se il paging non è abilitato Se si vuole controllare l accesso da parte del sistema (a differenza dell 886) è necessario un meccanismo di controllo Ciò si realizza tramite di una tabella dei segmenti (Segment Table) che indica indirizzo iniziale e dimensione di ogni segmento, le sue proprietà (valido/invalido, lettura/scrittura, user/supervisor etc.) etc. puntato da un registro della tabella dei segmenti che punta alla tabella dei segmenti e di un registro della lunghezza della tabella dei segmenti (Segment Table Length Register) tale per cui un numero di segmento k è valido se k<stlr. Ogni entry è un descrittore di segmento Essendo i segmenti di dimensione variabile è necessaria un allocazione dinamica della memoria 4
Descrittore di Segmento Ogni segmento è un oggetto descritto da un descrittore di segmento che ne definisce: L indirizzo iniziale nell ambito dello spazio di memoria virtuale La lunghezza Come vi si può accedere (lettura, scrittura, esecuzione etc.) Il livello di privilegio (ovvero di sicurezza) che un programma deve avere per l accesso (v. dopo) Se si tratta di segmento di dati o di codice o un segmento speciale usato solo dal sistema operativo La presenza o l assenza nella memoria principale L avvenuto accesso (non se è stato scritto) 5
Descrittore di Segmento 31 24 19 16 14 13 11 8 7 Base 31:24 G D B A V Base 15: Limit 19-16 P P L S Type Limit 15: Base 23:16 64 bit 8 bytes Ex. descrittore di segmento di dati AV: disponibile per il software BASE: indirizzo base del segmento (32 bit) DB: parallelismo del segmento (ampiezza degli operandi 16/32 bit) PL: livello di privilegio (v. dopo) G: granularità (limit dimensione del segmento - come multiplo di 1 o 496 bytes) segmento 1B-1MB oppure 4KB-4GB LIMIT: limite del segmento ( 2 bit lunghezza v. bit G) P: segmento presente/assente in memoria S: tipo di descrittore (sistema/applicazione) TYPE: tipo di segmento (dato/codice R/W - Expand down-up) I campi possono essere differentemente interpretati a seconda del TIPO e di altri parametri Si noti che non è presente alcun campo specifico per la determinazione della vecchiaia di un segmento (c è solo un bit accessed - che indica se è stato utilizzato v. dopo) : questo è legato al fatto che di norma il sistema ha il paging attivo con il relativo meccanismo I descrittori sono ovviamente modificati per indirizzamenti con un numero maggiore di bit 6
Descrittori 31 24 19 16 14 13 11 8 7 Base 31:24 G D B A V Limit 19-16 P P L S Type Base 23:16 Base 15: Limit 15: P P L S Type Access Right Byte P PL S > Presente/assente in memoria (per codice/dati) oppure valido/non valido (per segmenti SO e gates) > Livello di protezione > = 1 codice/dati (utente) ; = descrittori di sistema o gates - v. dopo (OS) Type > 16 tipi differenti (in realtà 32 perché il significato dipende anche da S) 7
Descrittori dati (System ->utilizzabile solo dall OS livello v. dopo)) S = 1 non system P P L 1 Type Access Right Byte C/D E W A C/D Codice o dati ( se dati). In questo caso E (Expand) crescita verso il basso o l alto (v. stack) W (Write) sola lettura oppure lettura e scrittura A (Accessed) segmento utilizzato (per il replacement) 8
Descrittori di codice S = 1 non system P P L 1 Type Access Right Byte C/D C R A C/D Codice o dati ( se dati). In questo caso 1 C /1 Conformante o meno (v. dopo) R /1 Sola lettura oppure può essere anche utilizzato come dato A (Accessed) segmento utilizzato (per il replacement) 9
Segmenti di dati Non System C/D E(xp.) W A(ccessed) Descrizione Segmento non ancora utilizzato, a sola lettura, espansione verso l alto 1 Come sopra ma già utilizzato 1 Segmento non ancora utilizzato, lettura/scrittura, espansione verso l alto (normale segmento di dato) 1 1 Come sopra ma già utilizzato 1 Segmento non ancora utilizzato, a sola lettura, espansione verso il basso (call gate v. dopo) 1 1 Come sopra ma già utilizzato 1 1 Segmento non ancora utilizzato, lettura/scrittura, espansione verso il basso (normale segmento di stack) 1 1 1 Come sopra ma già utilizzato 1
Tabelle dei descrittori NO DIRTY BIT (indicatore di modifica o meno ma solo accessed )!!!! Nei sistemi x86 ogni segmento viene reperito tramite il relativo descrittore che può essere posizionato in due differenti tabelle: la GDT (Global Descriptor Table) o la LDT (local Descriptor Table). La GDT contiene tutti i descrittori dei segmenti utilizzati dal sistema operativo ed è sempre presente in memoria. Di LDT ve ne sono tante quante sono i processi presenti nel sistema. Teoricamente per ogni accesso alla memoria (sia esso per dati o codice) è necessario un accesso preventivo alla GDT o alla LDT (ovviamente è previsto un meccanismo di caching dei descrittori v. dopo). Tipici descrittori presenti in ogni LDT sono dati, segmento, codice. Sono anche presenti descrittori di task e di call (v. dopo) Il CS, il SS, il DS etc. quindi NON contengono indirizzi fisici ma indici (selettori) che permettono di individuare un descrittore che punta a sua volta all indirizzo iniziale (virtuale) del segmento interessato. 11
Indirizzamento Un indirizzo nei sistemi x86 è una stringa di bit di 48 bit (16 di selettore e 32 di offset) (nel registro di segmento) 47 48 bit pointer (16+32) 32 31 SELETTORE OFFSET Indirizzo limite Segmento dato Diritti Limite Ind. iniziale Descrittore di segmento Presente in GDT o LDT Indirizzo iniziale del segmento L'indirizzo ottenuto tramite l uso del descrittore è un indirizzo lineare o virtuale 12
Tabelle dei descrittori GDT N Indice SELETTORE N-1 N-2 Registri di CPU LIMIT BASE 4 3 2 1 GDTR Global Descriptor Table Register Il valore dell indirizzo base (e il limite) della GDT è caricabile nei relativi registri tramite istruzioni privilegiate (v. dopo) Poiché l indice nella tabella è fornito dai primi 13 bit del selettore (gli altri sono bit di di controllo) la GDT può contenere fino a 8192 da 8 bytes per un totale di 64 Kbytes. Analogamente per la LDT (e la IDT v. dopo) 13
Local Descriptor Table LDT N N-1 N-2 LDTR LIMIT BASE GDTR GDT N N-1 N-2 4 3 2 1 4 3 2 1 Esiste un registro LDTR contenente un selettore che punta al descrittore della LDT corrente. La LDT è quindi un segmento della GDT! Caricabile con istruzioni privilegiate. 14
Local Descriptor Table Una Local Descriptor Table contiene tutti i descrittori specifici di un task (processo) presente nel sistema. In particolare il registro LDTR contiene il selettore della LDT del task attualmente in esecuzione. Contenuti di una Local Descriptor Table: Descrittori di codice, dati e stack del task Le call gates (v. dopo) per accedere a procedure di livello più elevato I task gates che permettono di mettere in esecuzione altri tasks 15
Aliasing Ma se tutti i dati fanno parte di segmenti come è possibile per il SO modificare il contenuto delle GDT, LDT, IDT etc. dal momento che non esistono specifiche istruzioni di accesso? ALIAS Poiché un segmento è una porzione di memori fisica nulla vieta che la stessa porzione sia descritta da due descrittori diversi con differenti tipi e modalità di accesso N N-1 X K 3 2 1 GDT Y X ed Y sono la stessa zona di memoria descritta da due descrittori diversi ad esempio uno (X) di codice e uno (Y) di dati. Il compilatore, ad esempio, quando genera il codice scrive nel segmento tramite il descrittore X (scrittura abilitata) ma per la messa in esecuzione il SO operativo utilizza il descrittore K. Ovviamente il sistema operativo ne deve tenere traccia in quanto se X (Y) viene scaricato dalla memoria sul disco oppure cancellato è necessario aggiornare tutti i descrittori aliased Per la GDT e ogni LDT esiste il relativo alias 16
Selettore SELETTORE DI SEGMENTO (Contenuto di un registro di segmento) 15 INDEX 3 2 1 T I RPL INDEX: indice nella tabella dei descrittori 13 bit -> 8192 selettori TI: Table Identifier ( >GDT 1 > LDT) RPL: livello di privilegio v. protezione 17
Un esempio mov ax, D mov ds, ax mov dl,[3] Nell 886 significa inserire D nel DS e portare in dl il quarto byte (c è anche la posizione ) del segmento - locazione D3 Anche in x86 significa inserire D nel DS ma D è un selettore 111 e precisamente il ventisettesimo (esiste anche lo zero) della GDT (111 H =26 D ) con livello di privilegio! Se la base riportata nel descrittore è F5D viene letto il byte alla locazione (virtuale) F5D3 (offset della istruzione 3)! 18
Caching dei descrittori I descrittori di tutti i segmenti utilizzati dai registri di segmento sono allocati in piccole cache interne da 8 bytes collegate ai relativi registri di segmento che vengono caricate al primo accesso a un descrittore diverso da quello corrente. Ciò evita che per ogni accesso in memoria si debba prima accedere alla memoria per reperire il descrittore necessario. Ovviamente la formazione dell indirizzo necessita dell indirizzo iniziale delle tabelle dei descrittori. Quello della GDT è contenuta in un registro specifico della CPU (e normalmente viene caricato una sola volta) mentre quello della LDT cambia ad ogni cambiamento di processo e quindi viene anch esso caricato in un registro specifico al primo accesso eseguito da un nuovo processo 19
Indirizzamento completo di un dato x86 Displacement selector SS selector GS selector FS selector ES selector DS selector CS Base Register Index Register X DESCRIPTOR REGISTERS Access Rights SS Access Limit Rights GS Access Base Address Limit Rights FS Access Rights ES Base Address Limit Access Rights DS Base Address Limit Access Rights CS Base Address Limit Base Address Limit Base Address + + Scale Offset LINEAR ADDRESS (indirizzo virtuale) CACHE 2
Scaling Segment Base Address CS, DS, ES FS, GS, ES Base Register EAX, EBX, ECX, EDX EBP, ESI, EDI, ESP Index Register EAX, EBX, ECX, EDX EBP, ESI, EDI Scale Factor Displacement, 1, 2,4,8 Effective Address EX: mov EAX, [EBX][ECX*4 + 6] (displacement totale) 21
Formazione dell offset a livello di istruzione Base Index Scale Displacement EAX EBX ECX EDX ESP EBP ESI EDI EAX EBX ECX EDX EBP ESI EDI * 1 2 4 8 -bit 8-bit 16-bit 32-bit Offset= Base + (Index*Scale) + Displacement mov eax, darray[edx*4] ; In eax (32 bit) una dword (dword 4 bytes) di un array di dwords mov eax, [esi*8][edi] ; In eax una dword di un array di quadwords 22
Indirizzamento completo nei sistemi x86 (32 bit) SELECTOR 15 31 selettore OFFSET Indirizzo Descrittore 31 22 21 12 11 DIR TABLE Indirizzo lineare OFFSET 2 bit address + 12 bit info 2 bit address + 12 bit info OP. P.TBL.ENTRY DIR ENTRY 124 linee CR3 Indirizzo fisico in CR3 Ogni task ha una propria tabella delle pagine in cui risiedono anche gli indirizzi delle chiamate al sistema operativo. Ovviamente è possibile condividere programmi e dati attribuendo traduzioni uguali a indirizzi logici diversi. L OS è una serie di routines richiamate da interrupt software che NON alterano il task (v. dopo) 23
Indirizzamento impaginato Pagine da 4 K 31 22 21 12 11 DIR TABLE OFFSET Pagine da 4 M 31 22 21 DIR OFFSET Se le pagine sono da 4 MB l offset in pagina è ovviamente di 22 bit e quindi i bit di selezione nella tabella delle pagine sono solo quelli di primo livello ovvero i bit 31-22 24
Tabelle delle Pagine Utilizzabile dal software Page size (4K/4M) Tabella II livello utilizzata Page cache disable Page write through User/Supervisor Scrivibile Presente (I livello) Page Directory Element (individuato dal campo DIR dell indirizzo virtuale) 31 12 Initial address 31:12 11 9 8 7 6 5 4 3 2 1 P P Avail P A C W U W P S D T N.B. Segnale PWT non WT/WB* Accessibile solo da Protection Level,1,2 o da tutti (Vedi dopo sistema di protezione) L indirizzo iniziale fisico della tabella di primo livello scandita dal valore DIR è contenuto in CR3 Se l indirizzamento è a due livelli nei bit 31-12 dell indirizzo c è l indirizzo fisico della tabella di II livello da scandire con il valore TABLE per ottenere l indirizzo iniziale fisico della pagina cercata Se la dimensione della pagina è 4MB nei bit 31-22 è contenuto l indirizzo iniziale fisico pagina cercata Nel caso di indirizzamento a due livelli (pagine da 4KB) i due dati PCD e PWT indicano se gli elementi della tabella di II livello sono cacheable o meno e la politica di gestione (WT o BW). Escono sui relativi piedini del processore quando si accede all elemento in questione e sono utilizzati dalla cache di livello superiore. La cacheabilità e il PWT degli elementi della tabella di I livello è presente in CR3. Nel caso di indirizzamento a un solo livello i bit 21-12 non sono significativi e i segnali PCD/PWT hanno lo stesso significato dei corrispondenti bit del caso di II livello (ovvero riguardano i dati della pagina e non della tabella) 25
Tabelle delle Pagine (II livello se esiste) Page Table Entry (individuato dal campo Table dell indirizzo virtuale) Non usati inizialmente 31 12 Page base address 31:12 Avail D Utilizzabile dal software Dirty (scritta) Utilizzata Page cache disable Page write through User/Supervisor Scrivibile Presente V. dopo 11 9 8 7 6 5 4 3 2 1 A P C D P W U W P T Indicano se i dati della pagina sono cacheable o meno e se la politica è WB o WT. Escono sui relativi piedini per essere utilizzati dalla cache di II livello. Per la protezione (v. dopo) prima si verifica il descrittore poi il contenuto della protezione in pagina. Spesso per le tabelle delle pagine PWT=1: così facendo per le tabelle non vi sono problemi di write-back 26
Sharing e protezione Tabella delle pagine del processo 1 Tabella delle pagine del processo 2 Puntator1 Flags Bit di controllo Indirizzi di disco Memoria 27
Page fault I e II livello Cosa succede in caso di un page fault nei sistemi x86? L indirizzo lineare viene salvato automaticamente in CR2 (hardware) Viene generato un interrupt software n. 14 La routine di risposta deve leggere CR2 (v. dopo) Chiamata all OS per trovare una pagina libera o da sostituire Chiamata driver disco Al termine inserzione indirizzo iniziale nella tabella II livello IRET che fa tornare all istruzione che ha provocato il PF Il dato è ora presente 28
Tabelle delle pagine e caches Una tabella delle pagine di primo e secondo livello contiene informazioni che debbono potere essere lette e scritte dal OS e che come tali possono essere inserite in cache. La politica da usare a livello delle tabelle di I e II livello e delle pagine vere e proprie può esser stabilita a livello delle singole pagine Indirizzo fisico Registro di controllo CR3 31 12 11 5 4 3 2 Page directory base address Riservato 1/ i dati della tabella delle pagine di I livello possono essere cacheable o meno. Ovviamente se pagine da 4 MB le informazioni riguardano l unica tabella delle pagine Se cacheable politica WB o WT P C D P W T Riserv. La politica di gestione delle pagine puntate dalla tabella di I livello (tabelle di secondo livello) e delle pagine di dati/codice puntate dalle tabelle di secondo livello sono presenti nei descrittori di pagina L indirizzo iniziale fisico della tabella delle pagine di primo livello (124 elementi) (diverso per ogni processo) è contenuta nei 2 bit più significativi 29
Registri di sistema 31 RESERVED CR CR1 CR2 CR3 CR4 47 15 BASE BASE SELECTOR SELECTOR TR LDTR 16 15 LIMIT LIMIT GDTR IDTR Per il caricamento e la gestione dei registri di sistema esistono specifiche istruzioni (ex. LTR Load Task Register LGDT Load Global Descriptor Table etc.) GDTR e IDTR contengono indirizzi virtuali (page directory base in CR3) TR e LDTR contengono selettori 3
CR 31 329 181716 P G C N D W R A M R W P R 5 4 3 N E R T S 2 1 E M 1 P E R Reserved PG Paging enable CD Cache disable Bit di controllo della NW Not writethrough CACHE AM Alignment mask (align check) WP Write protect (non permette al supervisore di scrivere le pagine user) NE Numeric Error TS task switched (save e restore Floating Point) EM Escape Instruction Trapped PE Protection enabled NB: il paging ha senso solo se PE=1 31
Page Fault CR2 31 PAGE FAULT LINEAR ADDRESS 32
CR4 Registro di controllo CR4 31 7 6 5 4 3 2 1 Riservato Machine check enable (ex. disallineamento) Page Size (4K/4M) Debugging extensions Time stamp disable Protected Mode Virtual Interrupt Virtual 886 Mode Extensions Se il paging è disabilitato l indirizzo lineare coincide con quello fisico Con i sistemi x86 sono possibili sistemi solo segmentati, solo impaginati (definendo un solo segmento che contiene tutto) e sistemi segmentati e impaginati Nei sistemi più moderni il bit 7 indica se le tabelle per l impaginazione possono essere condivise da più processi. Il bit 5 permette l uso di indirizzi a 36 bit M C E P S E D E T S D P V I V M E 33