1
Lezione 8Struttura di un SOSistemi Operativi (9 CFU), CdL Informatica, A. A. 2014/2015Dipartimento di Scienze Fisiche, Informatiche e MatematicheUniversità di Modena e Reggio Emiliahttp://weblab.ing.unimo.it/people/andreolini/didattica/sistemi-operativi
2
Quote of the day(Meditate, gente, meditate ...)
“There are two ways of constructing a software design. One way is to make it so simple that there are no obvious deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”Sir Charles Anthony Richard Hoare (1943-)Inventore dell'algoritmo di ordinamento QuickSortVincitore del Turing Award (1980)
3
SISTEMI OPERATIVI A STRATI
4
Stratificazione(O pensate forse di sbattere 50M di righe di codice in un solo file?)
Un SO moderno è concepito per strati. Le funzionalità fornite dal SO sono organizzate in strati software successivi impilati uno sopra l'altro.L'insieme degli strati forma uno stack software.Ciascuno strato implementa le proprie funzioni basandosi esclusivamente sulle funzioni definite negli strati inferiori.
5
Un esempio di stack software(Che continua a valere più di mille parole, forse)
Strato 0: funzionalità di accesso all'hw.
HARDWARE
Strato 1: driver dei dispositivi
Strato 2: scheduling, memoria, file system
Strato 3: chiamate di sistema
Strato 4: librerie di sistema
Strato 5: sistema di base
Strato 6: applicazioni utente
6
Che cosa contiene uno strato software?(Bella domanda)
Uno strato contiene l'implementazione delle funzioni e delle strutture dati atte a fornire la funzionalità necessaria allo strato superiore.Implementazione: in due modi possibili.
Software: libreria (statica o dinamica).Hardware: chip (ROM, EEPROM).
7
Il generico strato funzionale(Un po' di sana modellistica ogni tanto non guasta)
Le funzionalità dello strato m fannouso delle funzionalità definite nellostrato m-1. Qui, f
jm è una funzione
pubblica, usabile dallo strato m+1.
Strato m-1fkm−1 f l
m−1
Strato mfunzione j-madello strato mf j
m
8
Il generico strato funzionale(Un po' di sana modellistica ogni tanto non guasta)
Lo strato m definisce anche dellefunzioni private, non visibili aglistrati superiori. Tali funzioni sono disupporto e possono usare le funzionipubbliche dello strato m-1.
Strato m-1fkm−1 f l
m−1
Strato mf jm
f lm funzione
privatafunzionepubblica
fpm−1 fq
m−1
9
Il generico strato funzionale(Un po' di sana modellistica ogni tanto non guasta)
Le funzioni dello strato m+1utilizzano le funzioni definite nellostrato m. Non sono visibili le funzionidi supporto.
Strato m-1fkm−1 f l
m−1
Strato mf jm
f lm funzione
privatafunzionepubblica
fpm−1 fq
m−1
Strato m+1fcm+1
X
10
Vantaggi: modularità(Divide et impera)
Nello sviluppo.Il primo strato può essere progettato senza alcunaconsiderazione per il resto del sistema. Il secondo strato si appoggia sulle funzioni del primo.
Nel debugging.In un sistema ad m strati, se i primi m-1 sono corretticiò implica che l'eventuale errore stia nell'm-mo.
→ Approccio incrementale, per compartimenti.
11
Svantaggi: come definire gli strati?(Come divido?)
Dove finisce uno strato ed inizia il successivo?Esempio: il sistema di gestione della memoria habisogno del driver del disco per poter implementare il meccanismo di swapping.
→ Il driver del disco deve essere collocato “al di sotto” del gestore della memoria.Un SO moderno è soggetto a moltissimi vincoli di questo genere.
12
Svantaggi: riduzione dell'efficienza(Quanto costa dividere et imperare?)
L'uso di più strati introduce ritardi nella fruizione del servizio per via delle cascate più lunghe di funzioni.Con l'aumentare della potenza di calcolo, tali ritardi possono oramai essere considerati trascurabili.
13
MACRO, MICRO, HYBRID KERNEL
14
SO basato su Macro kernel(Detto anche “kernel monolitico”)
L'intero insieme dei servizi esegue in kernel mode. Le funzionalità essenziali del kernel sono contenute in una singola immagine eseguita al boot della macchina.L'intero insieme delle applicazioni esegue in user mode.Esempi:
Kernel Unix-like (Linux, BSD, AIX, System V).
15
Vantaggi e svantaggi(Conviene usarli?)
Vantaggi.L'esecuzione dei servizi è la più veloce possibile (duecommutazioni: user kernel e kernel user).→ →
Svantaggi.Marcata fragilità (un crash del kernel pianta la CPU).Dimensione del kernel enorme (la sezione di testorischia di non entrare nelle CPU cache, con unasensibile riduzione delle prestazioni).
16
Esempio di Macro kernel: UNIX(By Ken Thompson & Dennis Ritchie)
Usermode
Kernelmode
Utenti
Interprete comandi Comandi base Librerie di sistema
Interfaccia system call kernel↔
Segnali, gestioneterminali, I/O caratteri,
driver terminali
File system, swapping,I/O blocchi, driver
nastri e dischi
Scheduling CPU,demand paging,memoria virtuale
Interfaccia kernel architettura fisica↔
Controller terminaliTerminali
Controller nastri/dischiNastri/dischi
Controller memoriaMemoria
17
La dimensione della code base di UNIX(Because size matters)
Con l'aumentare dei servizi, il kernel dei sistemi UNIX è cresciuto notevolmente.
Problemi funzionali (manutenzione del codice).Problemi di sicurezza (maggiore probabilità di crash).Problemi prestazionali (kernel non cache friendly).
Strategie risolutive:uso di moduli caricabili.adozione dell'architettura basata su Micro kernel.
18
Moduli caricabili(“Loadable kernel module”: una idea grandiosa)
Modulo caricabile: file oggettocontenente funzionalità del kernel (file system, driverdi dispositivi, algoritmi di schedulazione, ...).(dis)attivabile a tempo di esecuzione (a mano oppureautomaticamente).
Esempi:Linux, FreeBSD, Mac OS X.
19
Vantaggi e svantaggi(Conviene usarli?)
Vantaggi.La dimensione di base del kernel diminuiscesensibilmente (a pieno vantaggio delle CPU cache).Un crash di un modulo non pregiudica ilfunzionamento del sistema.
Svantaggi.Lieve penalità di prestazioni dovuta alla(dis)attivazione.
20
SO basato su Micro kernel(L'esatto contrario di un kernel monolitico)
Il kernel esegue solo i servizi essenziali. Il resto è eseguito sotto forma di server applicativo. I server parlano fra di loro tramite un sistema a messaggi.Kernel: sistema di messaggistica per i server,scheduler CPU, allocatore memoria.Applicazioni: driver dei dispositivi, gestore filesystem.Esempi:
Tru64 UNIX (Digital), Mach, Minix.
21
Vantaggi e svantaggi(Conviene usarli?)
Vantaggi.Facilità di estensione (nuovo servizio nuovo server);→il kernel non è toccato.Kernel ridotto all'osso, CPU cache friendly.SO robusto rispetto ai crash (muore il server, si ripara,se ne lancia una nuova istanza; nel frattempo, il SOcontinua ad eseguire).
22
Vantaggi e svantaggi(Conviene usarli?)
Svantaggi.Un Micro kernel è meno performante di un kernelmonolitico. Presenza di commutazioni user kernel→e kernel user per ogni chiamata di sistema e per→ogni messaggio scambiato fra server.
23
Esempio di Micro kernel: Minix(By Andrew Tanenbaum)
bash vim make lynx...
Fileserver
Processmanager
Networkserver
Reinc.server
Datastore
SATAdriver
Audiodriver
SCSIdriver
... Printerdriver
IRQ, MMU, IPC Clockdriver
Systemtask
Usermode
Kernelmode
Driver deidispositivi
Servizi
Applicazioni
Chiamate di sistema, messaggi
Chiamate di kernel, messaggi
Chiamate di kernel, messaggi
24
SO basato su Hybrid kernel(Una via di mezzo fra Micro e Macro kernel)
Variante di Micro kernel con una unica differenza:i driver dei dispositivi eseguono in kernel mode.Tentativo di combinare il meglio dei Macro e dei Micro kernel. Funzionalità, prestazioni e sicurezza si collocano come intermedie fra Macro e Micro kernel.Esempi:
Windows, Plan 9, OS X.
25
Esempio di Hybrid kernel: Windows(By Willam Henry Gates)
Usermode
Kernelmode
Hardware Abstraction Layer
Kernel mode driver Micro kernel
Object manager
I/Omanager
IPCmanager
VMmanager
Processmanager GDI
Executive Services
I/Omanager
Workstationservice
Serverservice
Serverservice Win32 POSIX OS/2
Win32appl.
POSIXappl.
OS/2appl.
26
Macro vs. Micro vs. Hybrid(Un'immagine vale più di 1000 parole)
Applicazione
Macro Kernel Micro Kernel
Virtual File System
SchedulerMemoria virtuale
IPCFile System
Device driver
Hardware Hardware
IPC di baseMemoria virtuale
Scheduler CPU
Appl.IPC
Unixserver
Devicedriver
Fileserver
UserKernel
Hybrid kernel
Hardware
IPC di baseMemoria virtuale
Scheduler CPU
Appl.IPC
Unixserver
Devicedriver
Fileserver
Applicazione Applicazione
27
Progetto e studio di sistemi stratificati(Approcci Top Down e Bottom Up)
Approccio “Top Down”. Si va dagli strati più alti a quelli più bassi.Vantaggio: progetto e studio delle applicazioni sono inizialmente molto facili e liberi da vincoli.Svantaggio: Scendendo agli strati inferiori ci si scontra rapidamente con i vincoli imposti di funzionamento dall'hardware. Se non si conosce l'hardware sottostante:
la comprensione degli strati intermedi e bassiè molto difficile.il progetto di uno strato intermedio rischia di esserefondato su assunzioni sbalgliate.
28
Progetto e studio di sistemi stratificati(Approcci Top Down e Bottom Up)
Approccio “Bottom Up”. Si va dagli strati più bassi a quelli più alti.Vantaggio: il progetto può essere condotto e validato in maniera modulare. Lo studio permette di comprendere a fondo l'hardware e le successive scelte progettuali degli strati superiori.Svantaggio: la fase iniziale del progetto o studio è la più ostica, poiché coinvolge la programmazione dell'hardware.
29
“Yes, there are two paths you can go by”(“but in the long run, there's still time to change the road you're on”)
30
STRUTTURAZIONE DI LINUX
31
Scheda descrittiva(La carta d'identità)
Architettura: Macro kernel con moduliVersione iniziale: 0.01 (settembre 1991)Versione attuale: 3.17 (ottobre 2014)Licenza: GPL v2.0 + blob proprietari forniti
esternamenteLinguaggio: C (architecture-independent)
Assembly (architecture-dependent)Standard: Linux Standard Base
32
Livelli di stratificazione(Sono giusti giusti quelli che servono)
Stratificazione del kernel Linux.http://www.makelinux.net/kernel_map/
Stratificazione dell'ecosistema GNU.http://www.makelinux.net/system/
Una utilissima pagina di riferimento.http://www.makelinux.net/reference
33
Organizzazione del codice(Come giustificare quei 70 e rotti MB di archivio compresso)
$LINUXDocumentation
archdrivers fs include init ipc kernel lib mm
net
scripts
34
Organizzazione del codice(Come giustificare quei 70MB di archivio compresso)
arch
La directory arch contiene la porzione di codice detta “architecture-dependent” (dipendente dall'architettura).Qui sono implementati (tipicamente in assembly) tutti i meccanismi di interazione a basso livello con il processore.
$LINUXDocumentation
drivers fs include init ipc kernel lib mm net
scripts
35
Organizzazione del codice(Come giustificare quei 70MB di archivio compresso)
Queste directory contengono la porzione di codice detta “architecture-independent” (indipendente dalla architettura).Qui sono implementati (tipicamente in C) tutti i sottosistemi del kernel (che possono far uso delle funzionalità architecture-dependent).
$LINUXDocumentation
archdrivers fs include init ipc kernel lib mm
net
scripts
36
Organizzazione del codice(Come giustificare quei 70MB di archivio compresso)
La directory scripts contiene una miriade di script e programmi di amministrazione del processo di build del kernel.
$LINUXDocumentation
archdrivers fs include init ipc kernel lib mm
net
scripts
37
Riassumendo(Uno schema di massima, largamente incompleto)
Hardware
Architecture-dependent code
Architecture-independent code
Gestorememoria
VirtualFile System
SchedulerCPU
SistemaI/O
Gestoreinterruzioni
Estensioniprocessore Boot
Kernel
...
...
38
Implementazione object-oriented in C(Object oriented in C? Eh?)
L'implementazione dei servizi principali del kernel (gestore memoria, gestore file system, sistema di I/O) segue un approccio orientato agli oggetti.
Uno scheletro di codice generico scritto in C.Uso di puntatori a funzione per l'invocazione difunzioni specifiche.Inizializzazione dei puntatori a funzione con gliindirizzi delle funzioni di una data implementazione.
39
How is this even possible?(“Come with me, and you'll be, in a world of pure imagination”)
40
Esempio: Virtual File System(In UNIX, everything is a file)
Virtual File System: gestisce le operazioni su file. In Linux, tutto è un file (file regolari, directory, file rappresentanti un dispositivo, socket di rete, …).La semantica di uso dei file è sempre la stessa: open(), read(), write(), seek(), close(). Cambiano i dettagli implementativi.
41
Lettura da file regolare e da dispositivo(In UNIX, everything is a file)
Un file regolare rappresenta contenuto generato dall'utente. Ad esempio, il comando cat file.txt stampa il contenuto del file file.txt, prelevando i blocchi tramite il file system.Un file speciale a blocchi rappresenta il contenuto di un disco a basso livello. Ad esempio, il file speciale /dev/sda1 rappresenta la prima partizione del primo disco SATA/SCSI. Il comando cat /dev/sda1 stampa il contenuto binario del disco a basso livello, prelevando i blocchi tramite il relativo device driver.
42
La funzione di lettura “ad oggetti”(Esempio di scheletro di codice con invocazione opaca)
La funzione vfs_read() implementa una lettura da un qualunque file aperto.
Definita in $LINUX/fs/read_write.cSi noti lo statement
ret = file->f_op->read(file, buf, count, pos);
Il puntatore a funzione read() può puntare ad una qualunque implementazione di read().
43
La struttura file_operations(Dove stanno le implementazioni di read()?)
Componenti diversi facenti uso del VFS forniscono implementazioni diverse di read().La struttura dati struct file_operations definisce i puntatori a funzioni da implementare.Nel caso del file system EXT4, tale struttura dati:
è definita alla fine di $LINUX/fs/ext4/file.c.è associata al file aperto in seguito ad una open().
Per tale file, nel kernel fino alla versione 3.15, read() → do_sync_read().A partire dal kernel v3.16,read() → new_sync_read().
44
Vantaggi e svantaggi(Conviene usare la stratificazione?)
Vantaggi.Riuso di codice (si implementa una volta sola loscheletro funzionale).Modularità (un file contiene lo scheletro funzionale,un altro file contiene l'implementazione).
Svantaggi.Difficoltà di interpretazione del codice (bisognaconoscere le strutture dati implementanti leoperazioni).
45
Esercizi (5 min.)
1. Quale funzione di lettura viene usata da NTFS?
47
Portabilità(Come in Java?)
L'implementazione del kernel è portabile con relativo sforzo su architetture diverse.Architetture diverse hanno dimensioni dei tipi ed organizzazione interna dei dati diverse.
Architetture a 32 e a 64 bit.Architetture Big e Little Endian.
La parte architecture-independent del kernel non può fare assunzioni sui tipi di dato.
→ Definizione di nuovi tipi di dato via typedef.
48
Tipo di dato opaco(Viene ridefinito opportunamente in funzione della configurazione)
Un tipo di dato opaco è un alias di un tipo di dato preesistente ed è definito mediante typedef. Ciò può rendere il codice più leggibile.
Esempio: typedef BYTE unsigned char;BYTE è un alias di unsigned char.
Un tipo di dato opaco può essere ridefinito in funzione della configurazione utente.#ifdef LONG_OFFSETStypedef ssize_t long long;#elsetypedef ssize_t long;#endif
49
Esempio(uid_t)
User ID: ID numerico di un utente (unsigned short). È utilizzato in diverse funzioni del kernel.
→ Il codice diventa più leggibile se si definisce il tipo di dato opaco uid_t.
Esempio: chown_common() in $LINUX/fs/open.c.La signature rende ovvio il compito di tale funzione (cambiaowner e group di un file).
50
Tipo di dato esplicito(Assume sempre la stessa dimensione, indipendentemente dall'architettura)
Un tipo di dato esplicito è un alias di un tipo di dato preesistente ed è definito mediante typedef. Esso deve assumere la stessa dimensione indipendentemente dalla architettura. Ad esempio, per definire un intero a 64 bit senza segno sulle architetture x86_32 e su x86_64:#ifdef X86_64typedef u64 unsigned long;#endif#ifdef X86_32typedef u64 unsigned long long;#endif
51
Esempio(__be32)
Indirizzo IP: è un numero a 32 bit in formato Big Endian, indipendentemente dall'architettura.
→ Si definisce un tipo di dato esplicito __be32 con dimensione fissa di 32 bit e rappresentazione Big Endian, indipendentemente dall'architettura.
Esempio: struct iphdr (intestazione IP) definisce i campisaddr e daddr (IP sorgente e destinazione) come __be32.
52
Esercizi (3 min.)
2. Si identifichi la dimensione del tipo di dato opaco gid_t che rappresenta l'identificatore di un gruppo.
54
Esercizi (3 min.)
3. Si identifichi la natura del tipo di dato s32. È esplicito oppure opaco?
56
È vietato l'uso della libreria del C(Niente printf()!)
Il kernel implementa i servizi richiesti dalla libreria dal C.Per il kernel non è possibile usare alcun servizio della libreria del C. Semmai, è la libreria del C ad usare i servizi del kernel.
Niente printf(), niente malloc()!Alcune funzioni di utilità sono ridefinite.
printk(): stampa messaggi sulla console.kmalloc(), kfree(): (de)allocazione dinamicadella memoria.
57
Esercizi (2 min.)
4. Si trovi la definizione delle funzioni printk() e kmalloc().