AA 2020-2021 Corso "Sistemi Operativi" - Marco Tessarotto - Moodle@Units

Pagina creata da Ilaria Rinaldi
 
CONTINUA A LEGGERE
AA 2020-2021 Corso "Sistemi Operativi" - Marco Tessarotto - Moodle@Units
Corso «Sistemi Operativi»
     AA 2020-2021
         Marco Tessarotto

                            1
AA 2020-2021 Corso "Sistemi Operativi" - Marco Tessarotto - Moodle@Units
Cosa è un Sistema Operativo?

Sistema operativo: insieme di programmi (software)
   che gestisce gli elementi fisici di un calcolatore
                      (hardware).

                                                        2
AA 2020-2021 Corso "Sistemi Operativi" - Marco Tessarotto - Moodle@Units
Il calcolatore visto a «livelli»
• L’utente utilizza il computer
  attraverso l’interfaccia utente                         utente
  (tastiera, mouse, schermo,
  touchscreen, riconoscimento
  vocale…)                              Programmi applicativi (compilatori, browser,
• I programmi applicativi (o               ambienti di svilluppo, shell, editor etc)
  programmi utente) utilizzano le
  risorse di elaborazione per fornire
  strumenti agli utenti per risolvere               Sistema operativo
  problemi
• Il sistema operativo controlla
  l’hardware e ne coordina l’utilizzo      Hardware (CPU, memoria, storage …)
  da parte dei programmi applicativi
• L’hardware fornisce le risorse di
  elaborazione
                                                                                       3
AA 2020-2021 Corso "Sistemi Operativi" - Marco Tessarotto - Moodle@Units
Compiti di un Sistema Operativo
• Il compito di un sistema operativo è di condividere il calcolatore tra
  più programmi e di fornire un insieme di servizi più utili rispetto a
  quello che l’hardware da solo offre
• i sistemi operativi forniscono modi controllati per i programmi di
  interagire, in modo che possano condividere dati o lavorare insieme
• Il sistema operativo gestisce ed astrae l’hardware di basso livello
• condivide l'hardware tra più programmi in modo che vengano eseguiti
  (o sembrino eseguire) allo stesso tempo

                   tratto da https://pdos.csail.mit.edu/6.828/2018/xv6/book-rev11.pdf pag 7   4
AA 2020-2021 Corso "Sistemi Operativi" - Marco Tessarotto - Moodle@Units
Interfaccia del S.O. verso i programmi utente
• Un sistema operativo fornisce servizi ai programmi utente tramite
  un'interfaccia
• Progettare una buona interfaccia risulta essere difficile:
• Da un lato, vorremmo che l'interfaccia fosse semplice e ridotta al minimo
  indispensabile («narrow») perché ciò rende più facile implementarla
  correttamente
• D'altra parte, potremmo essere tentati di offrire molte funzionalità
  sofisticate alle applicazioni
• Il trucco per risolvere questa tensione è progettare interfacce che si basino
  su pochi meccanismi che possono essere combinati per supportare molti
  casi d’uso.

                      tratto da https://pdos.csail.mit.edu/6.828/2018/xv6/book-rev11.pdf pag 7   5
AA 2020-2021 Corso "Sistemi Operativi" - Marco Tessarotto - Moodle@Units
Interfaccia del S.O. verso i programmi utente
• Il sistema operativo Unix fornisce un'interfaccia minima i cui
  meccanismi si combinano bene, offrendo un sorprendente grado di
  generalità.
• Questa interfaccia ha avuto un tale successo che i sistemi operativi
  moderni - BSD, Linux, Mac OS X, Solaris e persino, in misura minore,
  Microsoft Windows - hanno interfacce di tipo Unix.

                   tratto da https://pdos.csail.mit.edu/6.828/2018/xv6/book-rev11.pdf pag 7   6
Codice sorgente, codice macchina, programma
 • Per "codice sorgente" si intende qualsiasi descrizione completamente
   eseguibile di un sistema software
 • codice sorgente: una raccolta di codice in formato testo, con o senza
   commenti, scritta utilizzando un linguaggio di programmazione
   comprensibile dall'uomo
 • Il codice sorgente di un programma specifica le azioni che devono essere
   eseguite da un computer
 • Il codice sorgente viene trasformato da un assemblatore o compilatore in
   codice macchina che può essere eseguito dal computer.
 • Il codice macchina viene memorizzato dal compilatore in un «file»
   (programma) per l'esecuzione in un secondo momento.
 • In alternativa, il codice sorgente può essere interpretato e quindi eseguito
   immediatamente.
                                                                                  7
Kernel, processo, istruzioni, dati, stack
• Unix assume la forma tradizionale di un kernel (nucleo), un
  programma speciale che fornisce servizi ai programmi in esecuzione.
• Ogni programma in esecuzione, chiamato processo, ha una memoria
  contenente istruzioni (codice macchina), dati e uno stack (pila).
• Le istruzioni (codice macchina) sono il risultato della traduzione fatta
  dal compilatore a partire dal codice sorgente ed implementano le
  azioni che deve svolgere il programma.
• I dati sono le variabili su cui agiscono le istruzioni.
• Lo stack organizza le chiamate di funzioni del programma nel corso
  dell’esecuzione delle istruzioni

                    tratto da https://pdos.csail.mit.edu/6.828/2018/xv6/book-rev11.pdf pag 7   8
System call
• Quando un processo deve utilizzare un servizio del kernel, invoca una chiamata di funzione
  all’interno dell'interfaccia del sistema operativo.
• Tale invocazione è detta chiamata di sistema (system call).
• La chiamata di sistema entra nel kernel; il kernel esegue il servizio e restituisce il risultato
• Quindi un processo alterna l'esecuzione tra spazio utente e spazio kernel.
• Ovvero: un processo, nel corso dell’esecuzione, eseguirà istruzioni del programma (nello spazio
  utente) ed istruzioni del kernel (nello spazio kernel, quando il programma effettuerà delle
  system call)
• Il kernel utilizza i meccanismi di protezione hardware della CPU per garantire che ogni processo
  in esecuzione nello spazio utente possa accedere solo alla propria memoria.
• Il kernel viene eseguito con i privilegi hardware richiesti per implementare queste protezioni; i
  programmi utente vengono eseguiti senza questi privilegi.
• Privilegi hardware: insieme di istruzioni «privilegiate» e dati riservati utilizzabili nello spazio
  kernel
• Quando un programma utente invoca una chiamata di sistema, l'hardware aumenta il livello di
  privilegi e inizia a eseguire una funzione prestabilita nel kernel.
                             tratto da https://pdos.csail.mit.edu/6.828/2018/xv6/book-rev11.pdf pag 7   9
System call

              tratto da https://pdos.csail.mit.edu/6.828/2018/xv6/book-rev11.pdf pag 8   10
Caratteristiche di un Sistema Operativo
• Il sistema operativo gestisce ed assegna le risorse del calcolatore ai
  programmi
• Tempo di CPU, spazio di memoria, spazio per la memorizzazione dei
  file, dispositivi di I/O
• Il S.O. agisce come gestore di tali risorse.
• Di fronte a richieste multiple e/o conflittuali di risorse, il S.O. decide
  come assegnarle agli specifici programmi ed utenti affinché il
  computer operi in modo equo ed efficiente

                                                                               11
Breve storia di UNIX

                       12
Breve storia di UNIX
• Linux è un S.O. che fa parte della famiglia dei S.O.
  UNIX

                                                         1965: 500 Kg, 4K words
• La prima implementazione di un S.O. UNIX fu
  realizzata nel 1969: Ken Thompson ai Bell
  Laboratories, divisione di AT&T.
• Fu scritto per il minicomputer Digital PDP-7

                                                                             13
Linguaggio di programmazione C
• Dennis Ritchie, collega di Thompson, cominciò a sviluppare il
  linguaggio C e nel 1973 il S.O. UNIX fu riscritto quasi completamente
  in linguaggio C
• UNIX divenne uno dei primi sistemi operativi scritti in un linguaggio
  ad «alto livello» => quindi «facilmente» portabile su altre architetture
  hardware

• Il linguaggio C nasce fin dall’inizio per scrivere sistemi operativi

                                                                         14
Storia di UNIX
• Dal 1969 al 1979, UNIX fu sviluppato attraverso varie “release”
  (rilasci) :
• First edition, 1971
• Second edition, 1972
• Third edition, 1973
• Fourth edition, 1973
• Fifth edition, 1974: UNIX installato su più di 50 sistemi
• Sixth edition, 1975: usato fuori da AT&T

                                                                    15
BSD e System V
• Fino a questo punto: UNIX è di proprietà di AT&T che non può
  venderlo in quando monopolista nel campo telefonia fissa.
• Ma, dal 1974, AT&T concede l’uso di UNIX alle università USA… che ci
  mettono mano e contribuiscono allo sviluppo di UNIX. Lo possono
  fare perché AT&T fornisce, con la licenza, anche il codice sorgente di
  UNIX.
• Seventh edition, 1979

• Da questo punto UNIX diverge in: BSD e System V

                                                                       16
BSD
• Thompson nel 1975/76 è professore a Berkeley, Università della
  California: insegna UNIX
• Nasce la Berkeley Software Distribution (BSD) con molti
  miglioramenti, nuovi strumenti etc.

• La prima distribuzione è 3BSD nel dicembre 1979

                                                                   17
BSD e … Internet
• 4.2BSD nel 1983, contiene una implementazione completa di TCP/IP
• 4.3BSD nel 1986
• 4.4BSD nel 1993

• 4.2BSD viene distribuita in molte università nel mondo

                                                                     18
System V
• Nel frattempo: AT&T viene “spezzettata” dal governo USA nel 1982…
  AT&T può vendere licenze commerciali di UNIX :
• Release System III, 1981
• System V, 1983

• System V Release 4, 1989

                                                                      19
Microsoft (ed altri) e UNIX

System III è stato utilizzato (su
licenza commerciale) da aziende
terze per creare altri S.O.
proprietari derivati da UNIX:
SunOS (di Sun Microsystems),
Apple Macintosh, SCO XENIX
(Microsoft)

                                    20
Free Software Foundation
• Nel 1984, Richard Stallman iniziò a lavorare su una versione “free” di
  UNIX (libera da diritti commerciali, patenti…) e nel 1985 fonda la Free
  Software Foundation (FSF), organizzazione no-profit.
• Inizia il progetto GNU (GNU is not UNIX). Viene sviluppata (1989) la
  licenza GNU General Public License (GPL). Software licenziato con la
  GPL deve essere reso disponibile nel suo codice sorgente e deve
  essere liberamente distribuibile (open source)

                                                                        21
Progetto GNU
• Il Progetto GNU ha prodotto molti programmi «open source» usati
  ancora oggi (ma non un S.O. UNIX completo: mancava il «kernel»)

• Il progetto GNU ha prodotto: emacs, gcc (GNU C compiler), bash shell,
  glibc (the GNU C library) …

                                                                     22
Architettura tipica del sistema operativo

                                            23
Linus Torvalds
• Nel 1991, Linus Torvalds è uno studente finlandese presso l’Università
  di Helsinki
• Nel corso degli studi, era entrato in contatto con Minix, un S.O. Unix-
  like, sviluppato a scopo didattico dal prof. Andrew Tanenbaum (ma
  Minix non era molto efficiente in quanto era, per prima cosa, uno
  strumento didattico)
• Torvalds iniziò a scrivere per hobby un S.O. per il suo PC basato su
  Intel 80386

                                                                        24
Linux Kernel
• Quindi, Torvalds decise di iniziare a scrivere il suo UNIX kernel
  (1991)…

• Il 5 ottobre 1991 pubblicò su Usenet un messaggio, pubblicando la
  versione 0.02 del Kernel Linux (quasi subito con licenza GPL). Altri
  programmatori si unirono a Torvalds nello sviluppo del kernel Linux

                                                                         25
https://groups.google.com/g/comp.os.minix/c/dlNtH7RRrGA/m/SwRavCzVE7gJ
                                                                         26
OS Linux

         Applicazioni (web browser, email, editor, …)
 User
space
               GNU C library (glibc), X11, gcc …
                                                         Sistema
                                                        operativo

Kernel                   Linux kernel
space

                          hardware

                                                           27
Linux Kernel
• 1991: avvio del progetto
• Marzo 1994: Linux Kernel versione 1.0
• Marzo 1995: Linux Kernel 1.2
• Giugno 1996: Linux Kernel 2.0
• Gennaio 1999: Linux Kernel 2.2
• Gennaio 2001: Linux Kernel 2.4
• Dicembre 2003: linux Kernel 2.6
• …
• Gennaio 2020: Linux Kernel 5.5 (https://www.kernel.org oppure
  github.com)
• Marzo 2021: Linux Kernel 5.11

                                                                  28
BSD – un altro UNIX «libero»
• Nei primi anni 90, era disponibile un altro UNIX free per intel x86-32: il
  porting di BSD per x86-32, conosciuto come 386/BSD. Era basato sul source
  code di 4.3BSD (che non conteneva praticamente più codice di AT&T).
• 386/BSD si divise in due progetti paralleli: NetBSD (portabilità) e FreeBSD
  (performance).
• NetBSD 0.8, aprile 1993
• FreeBSD 1.0, dicembre 1993
• OpenBSD (security), 1996, fork di NetBSD

• Nel 1992 AT&T iniziò una causa verso Berkeley… durata fino al 1994
• risultato: 4.4BSD-Lite, Release 2, giugno 1995

                                                                            29
Linux ed altre architetture
• All’inizio dell sviluppo di Linux, l’obiettivo principale era lo sviluppo di
  una implementazione efficiente per il solo processore Intel 80386

• Con il crescere della popolarità di Linux, fu portato su altre
  architetture quali: x86-64, Motorola/IBM PowerPC, Sun SPARC, MIPS,
  ARM, IBM zSeries, Intel IA-64 …

                                                                                 30
Cpu Intel 80386 (anni ‘80)
                  • https://en.wikichip.org/wiki/intel/microarc
                    hitectures/80386
                  • 1.5 µm process
                  • 275,000 transistors
                  • Clock: 33 MHz

                                                              31
Linux OS - distribuzioni
• Per Linux OS si intende: kernel Linux più altro software (strumenti,
  librerie) che insieme formano un OS completo, pronto per l’uso =>
  distribuzione (distribution)

• Linux kernel + progetto GNU = GNU/Linux

• Le prime distribuzioni apparvero nel 1992. La più vecchia ancora
  attiva è Slackware. Debian apparve nel 1993. Ubuntu (derivata da
  Debian) apparve nel 2004.

                                                                         32
Standard linguaggio C
• Linguaggio C: lo standard “di fatto” era il libro “The C Programming
  language” di Kernighan e Ritchie (1978). C++ iniziò nel 1985.

• Necessità di standardizzare il linguaggio C: 1989, American National
  Standards Insitute (ANSI) C standard: definisce il linguaggio e la standard C
  library (funzioni stdio, stringhe, math, header files etc). Versione di C nota
  come C89 (descritta nel libro “The C Programming language” , seconda
  edizione).
• Nel 1999 fu promulgato una versione aggiornata dello standard del
  linguaggio C: C99
• Nel 2011: C11
• Nel 2018: C18

                                                                                   33
POSIX
• POSIX: Portable Operating System Interface
• Gruppo di standard sviluppati da IEEE, per promuovere la portabilità di
  applicazioni a livello di codice sorgente.

• POSIX.1 : divenne uno standard di IEEE nel 1988; basato sulle UNIX system
  calls e API della C standard library. Ma non richiede necessariamente UNIX
  come OS (quindi altri S.O. possono implementare questo standard).

• POSIX.2: standardizza la shell ed altre utilities, inclusa l’interfaccia a riga di
  comando del compilatore C.

                                                                                       34
POSIX e Linux
• Nel 2001: POSIX.1-2001, noto anche come Single UNIX Specification
  Version 3: SUSv3. Sono 3700 pagine di standard.

• 2008: SUSv4 o POSIX.1-2008

• Linux OS punta a seguire gli standard UNIX, ma non lo segue
  completamente

                                                                      35
Numeri di Linux Kernel
• Linux 5.4 sources:
• 66.031 files (git ls-files | wc -l)
• 27.679.764 lines (git ls-files | xargs cat | wc -l)
• 889.221.135 bytes (git ls-files | xargs cat | wc -c)

Tratto da https://bootlin.com/doc/training/embedded-linux/embedded-linux-slides.pdf

                                                                                      36
As of kernel version 4.6 (in percentage of
number of lines)
• drivers/: 57.0%        • kernel/: 1.2%
• arch/: 16.3%           • firmware/: 0.6%
• fs/: 5.5%              • lib/: 0.5%
• sound/: 4.4%           • mm/: 0.5%
                         • scripts/: 0.4%
• net/: 4.3%
                         • crypto/: 0.4%
• include/: 3.5%
                         • security/: 0.3%
• Documentation/: 2.8%
                         • block/: 0.1%
• tools/: 1.3%           • ...

                                             37
USER vs KERNEL
• Kernel e Utente sono due termini che vengono spesso utilizzati nei sistemi
  operativi.
• La loro definizione è piuttosto semplice: il kernel è la parte del sistema
  operativo in esecuzione con privilegi più alti mentre lo spazio utente di
  solito si riferisce ad applicazioni in esecuzione con privilegi bassi.

• utente privilegiato: un utente autorizzato (e quindi affidabile) a svolgere
  funzioni rilevanti per la sicurezza che gli utenti ordinari non sono autorizzati
  a svolgere
• il privilegio è definito come la delega dell'autorità per eseguire funzioni
  rilevanti per la sicurezza su un sistema informatico (esempi di privilegi in
  un S.O.? Installare un programma, creare un nuovo utente…)

                                                                                38
USER vs KERNEL
• Modalità utente e modalità kernel sono termini che possono fare
  riferimento in modo specifico alla modalità di esecuzione del
  processore.

• Il codice che viene eseguito in modalità kernel può controllare
  completamente la CPU mentre il codice che viene eseguito in
  modalità utente presenta alcune limitazioni.

                                                                    39
USER vs KERNEL
• Lo spazio utente e lo spazio del kernel possono riferirsi
  specificamente alla protezione della memoria o agli spazi degli
  indirizzi virtuali associati al kernel o alle applicazioni dell'utente.

• Semplificando grossolanamente, lo spazio del kernel è l'area di
  memoria riservata al kernel mentre lo spazio dell'utente è l'area di
  memoria riservata a un particolare processo dell'utente.

• Lo spazio del kernel è protetto dall’accesso diretto da parte delle
  applicazioni utente

                                                                            40
Architettura tipica del sistema operativo
• Nell'architettura tipica del sistema operativo (vedere la figura
  seguente) il kernel del sistema operativo è responsabile dell'accesso e
  della condivisione dell'hardware in modo sicuro ed equo verso le
  applicazioni
• Il kernel offre alle applicazioni una Application Programming Interface
  (API) che generalmente viene chiamata «interfaccia delle chiamate di
  sistema» o «system calls interface»
• questa API è diversa dalle normali API di libreria perché
  rappresentano il limite in base al quale la modalità di esecuzione
  passa dalla modalità utente alla modalità kernel

                                                                        41
Application 1         Application 2       Application 3               User
                                                                         space

                    System Call Interface

                                                                                 Kernel
Kernel subsystems: process management, memory management, ...                    space

                         Device drivers

                                                                interrupts

                           hardware
                                                                                          42
System call interface
• Per garantire la compatibilità delle applicazioni, le chiamate di sistema
  vengono modificate raramente. Linux lo impone in particolare
  (diversamente dalle API del kernel che possono cambiare in base alle
  esigenze)
• Il codice del kernel stesso può essere logicamente separato nel codice
  del kernel principale e nel codice dei driver di dispositivo. Il codice dei
  driver di dispositivo è responsabile dell'accesso a determinati
  dispositivi mentre il codice del kernel principale è generico.
• Il kernel principale può essere ulteriormente suddiviso in più
  sottosistemi logici (ad es. Accesso ai file, rete, gestione dei processi,
  ecc.)

                                                                           43
Linux Kernel

https://bootlin.com/doc/training/embedded-linux/embedded-linux-slides.pdf   44
Puoi anche leggere