Sistemi Operativi Introduzione all’architettura IA-32 Lez. 15 A.A. 2014/2015 1 Corso: Sistemi Operativi © Danilo Bruschi Microprocessori Intel • Nel 1979 Intel introduce la famiglia dei microprocessore 8086 • 8086, 8087, 8088, e 80186 • Processori a 16-bit con registri a 16-bit • Bus dati a 16-bit e bus indirizzi a 20-bit • 8087 monta un co-processore Floating-Point • 8088 è una versione economica dell’ 8086 • Usa un bus dati a 8-bit • 80186 è una versione più veloce dell’ 8086 A.A. 2014/2015 2 Corso: Sistemi Operativi © Danilo Bruschi 80286 e 80386 • 80286 introdotto nel 1982 • Bus indirizzi a 24-bit ⇒ 224 bytes = 16 MB di indirizzamento • Introduce la modalità di gestione della memoria nota come protected mode • 80386 introdotto nel 1985 • Primo processore a 32-bit (32-bit general-purpose register) • 32-bit data bus e 32-bit address bus • 232 bytes ⇒ 4 GB di indirizzamento • Introduce nuove modalità di gestione della memoria: paging, virtual memory, e flat memory • La segmentazione può essere disabilitata A.A. 2014/2015 3 Corso: Sistemi Operativi © Danilo Bruschi 80486 e Pentium • 80486 introdotto nel 1989 • Versione migliorativa del 80386 • On-chip Floating-Point unit • On-chip unified Instruction/Data Cache (8 KB) • Usa Pipelining: completa l’esecuzione di un’istruzione per ogni ciclo di clock • Pentium (80586) introdotto nel 1993 • 64-bit data bus, bus indirizzi resta a 32 bits • Due linee di pipeline: U-pipe e V-pipe • Superscalare: può completare l’esecuzione di 2 istruzioni per ciclo di clock • Cache dati e istruzioni separate di 8 KB ciascuna • Istruzioni MMX per applicazioni multimediali A.A. 2014/2015 4 Corso: Sistemi Operativi © Danilo Bruschi Evoluzione A.A. 2014/2015 5 Corso: Sistemi Operativi © Danilo Bruschi ARCHITETTURA IA-32 A.A. 2014/2015 6 Corso: Sistemi Operativi © Danilo Bruschi Modalità operative • L’architettura IA-32 (a partire da Intel386) fornisce una serie di funzionalità per la realizzazione di software di sistema, queste funzionalità variano in funzione delle modalità con cui opera il processore : • • • • • Real mode Protected mode Virtual 8086 mode System Management mode IA-32e mode A.A. 2014/2015 7 Corso: Sistemi Operativi © Danilo Bruschi Modalità operative • • • Real-address mode: è la modalità operativa in cui il processore fornisce le stesse funzionalità presenti nell’Intel 8086 con l’aggiunta di alcune estensioni (la possibilità di cambiare modalità operativa in protected o system management mode) Protected mode: la modalità nativa del processore che fornisce un insieme di funzionalità predefinite per la realizzazione di sistemi multiprogrammati garantendo back compatibilità Virtual-8086 mode : dalla modalità protected è possibile passare alla modalità virtual-8086 mode, che consente al processore di eseguire software predisposto per l’architettura 8086 in un ambiente multiprogrammato e protetto A.A. 2014/2015 8 Corso: Sistemi Operativi © Danilo Bruschi Modalità operative • System management mode (SMM): SMM introdotto nel 1990 sul processore 386SL, è una modalità che consente al processore di eseguire codice memorizzato in una zona riservata della memoria nota come SMRAM (System Management RAM). Il codice memorizzato in questa porzione di memoria viene quindi eseguito ad livello di priorità estremamente elevato (-2) • Usato per la gestione di funzionalità hardware: accensione spegnimento dispositivi, diagnostica di componenti A.A. 2014/2015 9 Corso: Sistemi Operativi © Danilo Bruschi IA-64 • Con l’avvento delle architetture a 64 bit è stata introdotta la nuova modalità operativa IA-32e che consente sia il supporto di applicazioni a 32 bit che quello di applicazioni a 64, più precisamente il software può essere eseguito in due sotto modalità: • • 64-bit mode per il supporto di applicazioni e OS a 64-bit Compatibility mode: che consente ad un sistema operativo a 64 bit di gestire applicazioni a 64/32-bit A.A. 2014/2015 10 Corso: Sistemi Operativi © Danilo Bruschi Modalità processore • • • All’accensione il processore viene automaticamente predisposto in real-address mode. Il valore del flag PE nel registro di controllo CR0 determinerà successivamente se il processore stia operando in real o protected mode Il processore entra in modalità SMM ogni volta che riceve un interrupt SMI, eseguito in una delle modalità real-address, protected, virtual-8086, o IA-32e modes. Il processore rientra nella sua modalità “normale” a seguito dell’esecuzione di un’istruzione RSM A.A. 2014/2015 11 Corso: Sistemi Operativi © Danilo Bruschi Modalità processore A.A. 2014/2015 12 Corso: Sistemi Operativi © Danilo Bruschi Protected mode • Modalità introdotta per facilitare la soluzione di problemi di “sicurezza” derivanti dal ricorso al paradigma della multiprogrammazione. A tal fine l’architettura IA-32 include meccanismi di protezione e separazione che si prefiggono i seguenti obiettivi: • • • impedire a un processo di modificare l’area dati di un altro processo (restrizione sulla visibilità della memoria) impedire a un processo di accedere direttamente alle risorse del sistema operativo in caso di errore in un task, assicurare la sopravvivenza del sistema operativo e non compromettere la funzionalità degli altri task A.A. 2014/2015 13 Corso: Sistemi Operativi © Danilo Bruschi Protected Mode • I meccanismi predisposti dall’hardware per risolvere i suddetti problemi sono basati su due principi: • • • ISOLAMENTO: ad ogni processo utente è assegnato uno spazio di indirizzamento diverso, quindi processi diversi non hanno modo di interferire tra loro, se non attraverso sistemi controllati di IPC La porzione di memoria dedicata al SO non può essere acceduta da processi utente Protezione: ai diversi oggetti che popolano il sistema sono assegnati livelli di protezione (0-1-2-3), oggetti con livello di protezione k possono accedere solo ad oggetti con un livello di protezione uguale o maggiore a k A.A. 2014/2015 14 Corso: Sistemi Operativi © Danilo Bruschi I Segmenti • • • • Il meccanismo di isolamento è implementato attraverso il processo di segmentazione, i segmenti sono porzioni di memoria DISGIUNTE in cui sono caricati processi, dati e opportune strutture dati Nella modalità di esecuzione protected i processi utente devono essere “spezzati” in due o più segmenti che possono essere di due tipi, in funzione del contenuto: codice o Dati/ stack I processi sono gestiti dal processore attraverso un apposito segmento noto come Task State Segment (TSS) Un ulteriore segmento (opzionale) è costituito da opportune tabelle, con l’elenco degli oggetti accessibili a un processo (Local Descriptor Table LDT) A.A. 2014/2015 15 Corso: Sistemi Operativi © Danilo Bruschi I segmenti • Le tipologie di segmento imposte dall’architettura e che studieremo sono quindi: • • • • Codice Dati/stack TSS LDT A.A. 2014/2015 16 Corso: Sistemi Operativi © Danilo Bruschi Descrittori • • Ciascuno dei segmenti sopra indicati deve essere provvisto di un opportuna struttura dati che ne descrive le principali proprietà, questa struttura dati è chiamata DESCRITTORE Un descrittore di segmento fornisce al processore le seguenti informazioni: • La dimensione e l’indirizzo di partenza di un segmento, • Informazioni per il controllo degli accessi e sullo stato del segmento • I descrittori di segmento sono generati dal SO o da programmi di sistema A.A. 2014/2015 17 Corso: Sistemi Operativi © Danilo Bruschi Contenuti di un Segment Descriptor • Base Address • Un numero di 32-bit che definisce l’indirizzo di partenza del segmento • 32-bit Base Address + 32-bit Offset = 32-bit Linear Address • Segment Limit • Un numero di 20-bit che specifica la dimensione del segmento • La dimensione può essere specificata in byte o pagine (4 KB) • Diritti di accesso • Se il segmento contiene codice o dati • Se i dati sono read-only, in sola lettura o anche scrivibili • Il livello di privilegio del segmento A.A. 2014/2015 18 Corso: Sistemi Operativi © Danilo Bruschi Descrittori speciali • L’architettura prevede anche un insieme di descrittori speciali, non legati a segmenti, chiamati GATE (call gate, interrupt gate, trap gate e task gate) • Si tratta di un meccanismo fornito dall’hw per controllare l’esecuzione di codice privilegiato da parte di applicazioni che operano in user space A.A. 2014/2015 19 Corso: Sistemi Operativi © Danilo Bruschi Layout descrittore segmento (8 byte) A.A. 2014/2015 20 Corso: Sistemi Operativi © Danilo Bruschi Segment Descriptor // Segment Descriptors struct Segdesc { unsigned sd_lim_15_0 : 16; unsigned sd_base_15_0 : 16; unsigned sd_base_23_16 : 8; unsigned sd_type : 4; unsigned sd_s : 1; unsigned sd_dpl : 2; unsigned sd_p : 1; unsigned sd_lim_19_16 : 4; unsigned sd_avl : 1; unsigned sd_rsv1 : 1; unsigned sd_db : 1; unsigned sd_g : 1; unsigned sd_base_31_24 : 8; }; A.A. 2014/2015 // // // // // // // // // // // // // Low bits of segment limit Low bits of segment base address Middle bits of segment base address Segment type (see STS_ constants) 0 = system, 1 = application Descriptor Privilege Level Present High bits of segment limit Unused (available for software use) Reserved 0 = 16-bit segment, 1 = 32-bit segment Granularity: limit scaled by 4K when set High bits of segment base address 21 Corso: Sistemi Operativi © Danilo Bruschi Bit field • Bit Fields allow the packing of data in a structure. This is especially useful when memory or data storage is at a premium. Typical examples • • • Packing several objects into a machine word. e.g. 1 bit flags can be compacted -Symbol tables in compilers. Reading external file formats -- non-standard file formats could be read in. E.g. 9 bit integers. C lets us do this in a structure definition by putting :bit length after the variable. i.e. struct packed_struct { unsigned int f1:1; unsigned int f2:1; unsigned int f3:1; unsigned int f4:1; unsigned int type:4; unsigned int funny_int:9; } pack; A.A. 2014/2015 22 Corso: Sistemi Operativi © Danilo Bruschi Tabelle dei descrittori • A loro volta i DESCRITTORI sono radunati in TABELLE di DESCRITTORI • Le TABELLE di DESCRITTORI sono organizzate in forma di vettori e sono referenziate attraverso REGISTRI di sistema • Si accede ai DESCRITTORI all’interno delle TABELLE attraverso un indice lineare detto “SELETTORE” A.A. 2014/2015 23 Corso: Sistemi Operativi © Danilo Bruschi Selettori • I selettori hanno la seguente struttura: A.A. 2014/2015 24 Corso: Sistemi Operativi © Danilo Bruschi Le principali tabelle • • • GDT o Global Descriptor Table è una tabella contente descrittori di segmenti accessibili a tutti i processi (non è un segmento, il suo accesso non avviene attraverso selettori) LDT o Local Descriptor Table è una tabella di descrittori di segmenti visibili solo dal processo (task) a cui la LDT è associata IDT o Interrupt Descriptor Table è una tabella contenente i descrittori dei Gates di accesso alle procedure o ai task associati agli interrupt. La IDT corrisponde alla Interrupt Table dell’8086. La IDT può contenere soltanto descrittori di Gate (Interrupt, Trap e Task Gate). A.A. 2014/2015 25 Corso: Sistemi Operativi © Danilo Bruschi Costruzione GDT # Bootstrap GDT .p2align 2 # force 4 byte alignment gdt: SEG_NULL # null seg SEG(STA_X|STA_R, 0x0, 0xffffffff) SEG(STA_W, 0x0, 0xffffffff) gdtdesc: .word .long # code seg # data seg 0x17 # sizeof(gdt) - 1 gdt # address gdt // Application segment type bits #define STA_X 0x8 // Executable segment #define STA_W 0x2 // Writeable (non-executable segments) #define STA_R 0x2 // Readable (executable segments) #define STA_A 0x1 // Accessed A.A. 2014/2015 26 Corso: Sistemi Operativi © Danilo Bruschi GDT /*! * Macros to build GDT entries in assembly.! */! #define SEG_NULL \! .word 0, 0; \! .byte 0, 0, 0, 0! #define SEG(type,base,lim) \! .word (((lim) >> 12) & 0xffff), ((base) & 0xffff); \! .byte (((base) >> 16) & 0xff), (0x90 | (type)), \! (0xC0 | (((lim) >> 28) & 0xf)), (((base) >> 24) & 0xff)! ! A.A. 2014/2015 27 Corso: Sistemi Operativi © Danilo Bruschi Registri di sistema • Al fine di operare in modo efficiente sulle suddette tabelle la CPU IA-32 dispone dei seguenti registri: • • • • GDTR o Global Descriptor Table Register, un registro inizializzato in sede di boot, che punta alla GDT della piattaforma LDTR o Local Descriptor Table Register: un registro aggiornato ad ogni operazione di Task Switching, che punta alla LDT del Task Running IDTR o Interrupt Descriptor Table Register: un registro inizializzato in fase di boot, che punta alla IDT della piattaforma TR o Task Register: un registro che punta al TSS del Task Running A.A. 2014/2015 28 Corso: Sistemi Operativi © Danilo Bruschi Registri di sistema • • Altri registri sono usati dal processore per controllare e gestire l’intero sistema, sono generalmente registri accessibili (almeno in parte) dal sistema operativo con istruzioni privilegiate I principali di questi registri sono: • • • • EIP EFLAGS Control register (CR0, CR2, CR3, and CR4) Segment Register A.A. 2014/2015 29 Corso: Sistemi Operativi © Danilo Bruschi EFLAGS A.A. 2014/2015 30 Corso: Sistemi Operativi © Danilo Bruschi Segment Register • Sei 16-bit Segment Register • Servono per supportare la memoria segmentata, affinché un processo possa accedere ad un segmento è necessario che il selettore di quel segmento sia stato preventivamente caricato nel corrispondente registro • Sono usati come cache per i selettori di segmento • I Segmenti contengono diverse tipologie di dati • Codice • Dati • Stack A.A. 2014/2015 31 Corso: Sistemi Operativi © Danilo Bruschi Segment Register • Parte visibile = 16-bit Segment Register • CS, SS, DS, ES, FS, e GS sono visibili al programmatore • Parte invisibile = Segment Descriptor (64 bits) • Caricato dall’hw A.A. 2014/2015 32 Corso: Sistemi Operativi © Danilo Bruschi Registri General purpose A.A. 2014/2015 33 Corso: Sistemi Operativi © Danilo Bruschi Accesso ai registri • EAX, EBX, ECX, e EDX sono registri a 32-bit • È possibile però accedere a soli 16-bit e 8-bit • I 16-bit meno significativi di EAX sono denotati con AX • AX è ulteriormente suddiviso • AL = 8 bit meno significativi • AH = 8 bit più significativi • ESI, EDI, EBP, ESP: si può solo accedere ai 16 bit meno significativi A.A. 2014/2015 34 Corso: Sistemi Operativi © Danilo Bruschi Registri Floating-Point, MMX, XMM • Otto 80-bit floating-point data register • ST(0), ST(1), . . . , ST(7) • Usati da FPU • Otto 64-bit MMX register • Usati dalle istruzioni MMX • Otto 128-bit XMM registers • Usati dalle istruzioni SSE A.A. 2014/2015 35 Corso: Sistemi Operativi © Danilo Bruschi A.A. 2014/2015 36 Corso: Sistemi Operativi © Danilo Bruschi Supporto ai processi • • Un task è definito come un’unità di lavoro che il processore può attivare, eseguire e sospendere. Può essere usato per eseguire un programma, una routine di sistema operativo, un gestore di interrupt ecc. Un task è composto da due componenti: uno spazio d’esecuzione e un task-state segment (TSS). Lo spazio d’esecuzione è costituito da un segmento codice, un segmento stack, e uno o più segmenti dati A.A. 2014/2015 37 Corso: Sistemi Operativi © Danilo Bruschi TSS • Il TSS è un segmento che contiene un’opportuna struttura dati con le seguenti informazioni: • lo stato dell’ambiente d’esecuzione di un TASK, • i selettori e gli stack pointers a tre segmenti stack (uno stack per ogni livello di privilegio) • Il selettore di segmento per la LDT associata al task • Le informazioni necessarie per gestire la paginazione A.A. 2014/2015 38 Corso: Sistemi Operativi © Danilo Bruschi Stato di un task • Lo stato di un task è univocamente determinato: • • • • • • • • • Dal valore dei segment registers (CS, DS, SS, ES, FS, and GS) Dal valore dei general-purpose register Dal valore di EFLAGS Dal valore di EIP Dal valore del control register CR3 Dal valore del task register Dal valore di LDTR I valori per la gestione dell’I/O (contenuti in TSS) Dagli Stack pointer 0, 1, e 2 (contenuti in TSS) A.A. 2014/2015 39 Corso: Sistemi Operativi © Danilo Bruschi TSS A.A. 2014/2015 40 Corso: Sistemi Operativi © Danilo Bruschi TSS // Task state segment format (as described by the Pentium architecture book) struct Taskstate { uint32_t ts_link; // Old ts selector uintptr_t ts_esp0; // Stack pointers and segment selectors uint16_t ts_ss0; // after an increase in privilege level uint16_t ts_padding1; uintptr_t ts_esp1; uint16_t ts_ss1; uint16_t ts_padding2; uintptr_t ts_esp2; uint16_t ts_ss2; uint16_t ts_padding3; physaddr_t ts_cr3; // Page directory base uintptr_t ts_eip; // Saved state from last task switch uint32_t ts_eflags; uint32_t ts_eax; A.A. 2014/2015 // More saved state (registers) 41 Corso: Sistemi Operativi © Danilo Bruschi uint32_t ts_ecx; uint32_t ts_edx; uint32_t ts_ebx; uintptr_t ts_esp; uintptr_t ts_ebp; uint32_t ts_esi; uint32_t ts_edi; uint16_t ts_es; // Even more saved state (segment selectors) uint16_t ts_padding4; uint16_t ts_cs; uint16_t ts_padding5; uint16_t ts_ss; uint16_t ts_padding6; uint16_t ts_ds; uint16_t ts_padding7; uint16_t ts_fs; uint16_t ts_padding8; uint16_t ts_gs; uint16_t ts_padding9; uint16_t ts_ldt; uint16_t ts_padding10; uint16_t ts_t; // Trap on task switch uint16_t ts_iomb; // I/O map base address }; A.A. 2014/2015 42 Corso: Sistemi Operativi © Danilo Bruschi