L architettura a microkernel di Mac OS X



Documenti analoghi
Approccio stratificato

La gestione di un calcolatore. Sistemi Operativi primo modulo Introduzione. Sistema operativo (2) Sistema operativo (1)

Il Sistema Operativo (1)

Architettura di un sistema operativo

Sistemi Operativi STRUTTURA DEI SISTEMI OPERATIVI 3.1. Sistemi Operativi. D. Talia - UNICAL

Definizione Parte del software che gestisce I programmi applicativi L interfaccia tra il calcolatore e i programmi applicativi Le funzionalità di base

Il Sistema Operativo. C. Marrocco. Università degli Studi di Cassino

Con il termine Sistema operativo si fa riferimento all insieme dei moduli software di un sistema di elaborazione dati dedicati alla sua gestione.

Comunicazione tra Computer. Protocolli. Astrazione di Sottosistema di Comunicazione. Modello di un Sottosistema di Comunicazione

Lezione 4 La Struttura dei Sistemi Operativi. Introduzione

Organizzazione Monolitica

Il Sistema Operativo

INFORMATICA. Il Sistema Operativo. di Roberta Molinari

Introduzione alla Virtualizzazione

MODELLO CLIENT/SERVER. Gianluca Daino Dipartimento di Ingegneria dell Informazione Università degli Studi di Siena

Input/Output. Moduli di Input/ Output. gestiscono quantità di dati differenti a velocità diverse in formati diversi. n Grande varietà di periferiche

Software di sistema e software applicativo. I programmi che fanno funzionare il computer e quelli che gli permettono di svolgere attività specifiche

SISTEMI OPERATIVI. Prof. Enrico Terrone A. S: 2008/09

Il sistema di I/O. Hardware di I/O Interfacce di I/O Software di I/O. Introduzione

Introduzione alle tecnologie informatiche. Strumenti mentali per il futuro

Sistema Operativo. Fondamenti di Informatica 1. Il Sistema Operativo

Un sistema operativo è un insieme di programmi che consentono ad un utente di

Software relazione. Software di base Software applicativo. Hardware. Bios. Sistema operativo. Programmi applicativi

Capitolo 3: Strutture dei sistemi operativi

I Thread. I Thread. I due processi dovrebbero lavorare sullo stesso testo

Sistemi Operativi (modulo di Informatica II) I processi

Dispensa di Informatica I.1

Il Software. Il software del PC. Il BIOS

Architetture Applicative

CAPITOLO 5 - Sistemi Operativi Moderni

Il software impiegato su un computer si distingue in: Sistema Operativo Compilatori per produrre programmi

Pronto Esecuzione Attesa Terminazione

STRUTTURE DEI SISTEMI DI CALCOLO

L informatica INTRODUZIONE. L informatica. Tassonomia: criteri. È la disciplina scientifica che studia

Introduzione al sistema operativo. Laboratorio Software C. Brandolese

Architettura hardware

PARTE 4 La Macchina Software

ASPETTI GENERALI DI LINUX. Parte 2 Struttura interna del sistema LINUX

Gestione della memoria centrale

Sistemi operativi. Esempi di sistemi operativi

EXPLOit Content Management Data Base per documenti SGML/XML

In un modello a strati il SO si pone come un guscio (shell) tra la macchina reale (HW) e le applicazioni 1 :

Architettura di un sistema di calcolo

Reti di Telecomunicazione Lezione 8

Sistemi Operativi. Processi GESTIONE DEI PROCESSI. Concetto di Processo. Scheduling di Processi. Operazioni su Processi. Processi Cooperanti

Reti e Internet: introduzione

Corso di Informatica

La Gestione delle risorse Renato Agati

ARCHITETTURA DI RETE FOLEGNANI ANDREA

MODULO 02. Iniziamo a usare il computer

Architettura di un calcolatore

Sistemi Operativi MECCANISMI E POLITICHE DI PROTEZIONE. D. Talia - UNICAL. Sistemi Operativi 13.1

MECCANISMI E POLITICHE DI PROTEZIONE 13.1

Database. Si ringrazia Marco Bertini per le slides

Il Sistema Operativo. Introduzione di programmi di utilità. Elementi di Informatica Docente: Giorgio Fumera

Sistemi Operativi IMPLEMENTAZIONE DEL FILE SYSTEM. D. Talia - UNICAL. Sistemi Operativi 9.1

Introduzione al sistema operativo Il file system: file, directory,...

Il SOFTWARE DI BASE (o SOFTWARE DI SISTEMA)

Corso di Sistemi di Elaborazione delle informazioni

Indice generale. OOA Analisi Orientata agli Oggetti. Introduzione. Analisi

Scheduling della CPU. Sistemi multiprocessori e real time Metodi di valutazione Esempi: Solaris 2 Windows 2000 Linux

BDX 3D-EDITOR (autore: Marco Bedulli) Scopo del software. Caratteristiche fondamentali. Linguaggi utilizzati. Navigazione 3D

Il sistema operativo. Sistema operativo. Multiprogrammazione. Il sistema operativo. Gestione della CPU

Le Infrastrutture Software ed il Sistema Operativo

MANUALE MOODLE STUDENTI. Accesso al Materiale Didattico

Sistemi Operativi di Rete. Sistemi Operativi di rete. Sistemi Operativi di rete

Introduzione alle applicazioni di rete

Telerilevamento e GIS Prof. Ing. Giuseppe Mussumeci

Capitolo 4 Pianificazione e Sviluppo di Web Part

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca. Parte II Lezione 5

FONDAMENTI di INFORMATICA L. Mezzalira

lo PERSONALIZZARE LA FINESTRA DI WORD 2000

Mac Application Manager 1.3 (SOLO PER TIGER)

Come usare P-touch Transfer Manager

Introduzione ai sistemi operativi

Approfondimenti. Contenuti

ISTVAS Ancona Introduzione ai sistemi operativi Tecnologie Informatiche

Evoluzione dei sistemi operativi (5) Evoluzione dei sistemi operativi (4) Classificazione dei sistemi operativi

IL SOFTWARE TIPI DI SOFTWARE. MACCHINE VIRTUALI Vengono definite così perché sono SIMULATE DAL SOFTWARE, UNIFORMANO L ACCESSO SISTEMA OPERATIVO

3. Introduzione all'internetworking

Classificazione del software

IBM SPSS Statistics per Mac OS - Istruzioni di installazione (Licenza per sito)

Lezione 1. Introduzione e Modellazione Concettuale

. A primi passi con microsoft a.ccepss SommarIo: i S 1. aprire e chiudere microsoft access Start (o avvio) l i b tutti i pro- grammi

Sistemi Operativi IMPLEMENTAZIONE DEL FILE SYSTEM. Implementazione del File System. Struttura del File System. Implementazione

Calcolatori Elettronici A a.a. 2008/2009

Creare una Rete Locale Lezione n. 1

Coordinazione Distribuita

Hardware delle reti LAN

Computazione multi-processo. Condivisione, Comunicazione e Sincronizzazione dei Processi. Segnali. Processi e Threads Pt. 2

FPf per Windows 3.1. Guida all uso

Sistema di protezione (2) Protezione (1)

Sistema di protezione (1)

LINUX. Che cos'e` un sistema operativo?

Lo scenario: la definizione di Internet

Scenario di Progettazione

Estensioni e modelli. Ancora poco conosciuti, consentono di estendere la suite per l ufficio. Ecco come servirsene

Procedura per la configurazione in rete di DMS.

Progettaz. e sviluppo Data Base

Il sistema operativo TinyOS

Transcript:

Facoltà di Ingegneria Corso di Studi in Ingegneria Informatica Elaborato finale in Sistemi Operativi L architettura a microkernel di Mac OS X Anno Accademico 2012-2013 Candidato: Andrea Saldamarco matr. N46000783

Alla mia famiglia ed ai miei amici

Indice Introduzione 5 Capitolo 1. Il sistema Operativo 9 1.1 Architettura di un Sistema Operativo 10 1.1.1 System Calls 12 1.2 Architettura Monolitica 13 1.3 Architettura Modulare 14 1.4 Architettura a microkernel 15 1.4.1 Progettazione del microkernel 17 Capitolo 2. Mac OS X Overview 19 2.1 Mac OS X 20 2.2 Darwin 22 2.3 Kernel XNU 23 2.4 Mach 25 2.5 BSD 25 2.6 I/O Kit 26 2.7 Altre componenti di XNU 27 2.7.1 Libreria libkern 27 2.7.2 Libreria libsa 28 2.7.3 Platform expert 28 2.7.4 Kernel extensions 28 2.8 Hight-Level layers 29 III

2.8.1 Applications services 29 2.8.2 API 30 Capitolo 3. Il Kernel XNU 31 3.1 Mach 31 3.1.1 Task e Thread 32 3.1.2 Porte 33 3.1.3 Messaggi 34 3.2 BSD 35 3.2.1 System Calls 35 3.2.2 Networking 36 3.2.3 File system 37 3.3 Scheduling 39 3.4 Interprocess Communication (IPC) 41 3.4.1 Mach IPC 42 3.4.2 Mach exceptions 42 3.4.3 Posix IPC 43 3.5 Gestione della memoria 44 3.5.1 Virtual memory 44 3.5.1.1 Pager 45 3.5.1.2 Copy on Write (COW) 46 3.5.2 Memoria fisica 47 3.5.2.1 Page faults 49 3.5.3 Universal Page List (UPL) 49 3.5.4 Unified Buffer Cache (UBC) 49 3.5.5 Memoria condivisa 50 Conclusioni 51 Bibliografia 52 IV

Introduzione Lo scopo di questa tesi è descrivere l architettura di uno dei Sistemi Operativi più conosciuto e studiato degli ultimi anni: Mac OS X. Mac OS X è il sistema operativo sviluppato da Apple Inc nel 2001 per i computer Macintosh ed è un evoluzione del primo sistema operativo proprietario di Apple nato negli anni 80. Facendo un passo indietro, vale la pena ripercorrere velocemente la storia di Apple a partire dalla sua nascita nel 1979. La società è fondata da Steve Jobs, Steve Wozniack e Ronald Wayne a Cupertino, in California. Wayne lascia la società quasi subito, poiché non crede nel progetto. La prima sede di questa nuova società è il garage di casa: qui i fondatori lavorano al loro primo computer, l'apple I. Successivamente Jobs e Wozniak lanciano l'apple II. Le vendite toccano il milione di dollari. Nel 1980 la Apple è quotata in Borsa e cresce rapidamente tanto che Jobs decide di assumere un direttore generale con molta esperienza, John Sculley proveniente dalla Pepsi Cola. Nel 1984 viene prodotto un personal computer compatto e dotato di un nuovo sistema operativo a interfaccia grafica: Mac OS. Dotato di icone, finestre e menù a tendina, il Mac accende da subito l'interesse del pubblico. Nonostante l'indubbia superiorità rispetto agli altri computer in offerta sul mercato, le vendite del Macintosh non raggiungono i livelli attesi. Jobs punta il dito contro John Sculley; i due vengono allo scontro, ciascuno attribuendo all'altro la responsabilità del mancato successo. 5

Sculley pone il consiglio d'amministrazione di fronte all'alternativa: o me o lui. Il Consiglio si schiera dalla sua parte. Jobs va via e nel 1985, fonda una nuova società, la NeXT. NeXT è inizialmente una società simile ad Apple, nel senso che produce computer venduti con un sistema operativo proprietario. Il primo computer NeXT (un cubo nero) esce nel 1988 con un proprio sistema operativo NeXTSTEP, molto apprezzato nel mondo accademico e scientifico. Il sistema di Jobs mira a un ambiente operativo funzionale e bello, cosa che gli riesce piuttosto bene: fornisce ottime basi per la programmazione, la tipografia e anche per la produzione audio/video. Figura I-1 Storia dei sistemi operativi NeXT 6

NeXTSTEP ha avuto anche un importante ruolo nella formazione di Internet come la conosciamo oggi, poiché nel 1990 Tim Berners-Lee sviluppa al CERN di Ginevra il primo browser web e il primo server web con il sistema operativo NeXTSTEP. Tuttavia, le vendite dei computer NeXT non vanno bene, la fabbrica viene chiusa, e nel 1993 la società decide di dedicarsi solo al software, cioè al sistema operativo. Il sistema operativo NeXTSTEP non arriva all utente comune, ma viene apprezzato da diversi gruppi di fruitori specializzati: tecnici, scienziati, banche, i quali sviluppano molte applicazioni e trovano NeXTSTEP adeguato per implementare velocemente le proprie idee. NeXTSTEP usa Unix 1 e precisamente la variante BSD (Berkeley Software Distribution) Unix dell Università della California. Unix gira su un microkernel chiamato Mach sviluppato dalla Università Carnegie-Mellon. È nel suo complesso un sistema operativo molto robusto e con elevate capacità di rete. La società scrive anche un window server (cioè un sistema di interfaccia) per il sistema operativo. L interfaccia utente prende gli eventi dall utente e li passa all applicazione. L applicazione, a sua volta, trasmette all interfaccia quello che deve visualizzare all utente. Una caratteristica molto interessante è che il codice che va all interfaccia è esattamente lo stesso codice che va alla stampante. Quindi il programmatore scrive il codice una sola volta e questo codice viene usato sia per la visualizzazione a monitor che per la stampa. Successivamente, NeXT fa evolvere NeXTSTEP in OpenStep, una tecnologia che separa il livello applicativo da quello della gestione dell'hardware demandandolo a un sistema operativo sottostante; con questa tecnologia si può far funzionare un applicativo OpenStep su molte piattaforme con minime modifiche. La programmazione viene fatta in un linguaggio che si chiama Objective-C, una estensione del linguaggio C, che lo rende orientato agli oggetti. Nel 1995 Apple decide di sostituire il vecchio Mac OS con un sistema operativo moderno, con caratteristiche simili a NeXTSTEP. Avvia un progetto chiamato Copland, dal famoso compositore americano Aaron Copland, che viene portato avanti con molta difficoltà, fino a quando Apple decide di abbandonarlo. Intanto, la società, pubblica Mac OS 8 (nuova versione del vecchio sistema operativo) e di valuta l acquisto di un nuovo sistema operativo. La scelta cade proprio su NeXTSTEP. Poiché la NeXT è una compagnia relativamente piccola, Apple decide di comperarla in blocco. 1 UNIX è un sistema operativo portabile per computer inizialmente sviluppato da un gruppo di ricerca dei laboratori AT&T e Bell Laboratories 7

Nel 1996 Apple annuncia l acquisto di NeXT per 492 milioni di dollari e in dicembre Steve Jobs torna nella società che aveva fondato assieme a Steve Wozniack vent anni prima. Iniziano così i lavori, che dureranno quattro anni, per implementare NeXTSTEP su Mac. Il sistema operativo cambia nome e diventa Mac OS X. 8

Capitolo 1 Il Sistema Operativo Un sistema operativo (S.O.) è un componente software di un sistema di elaborazione il cui compito principale è quello di controllare l esecuzione di programmi applicativi e di agire come intermediario tra questi e l hardware con lo scopo di facilitarne l uso e, al tempo stesso, di garantire che tale uso sia effettuato in maniera efficace ed efficiente. Schematicamente possiamo quindi suddividere un sistema di elaborazione in tre livelli: 1. Livello hardware; 2. Sistema operativo; 3. Livello applicativo. Figura 1.1 Architettura del sistema operativo Un sistema operativo, in definitiva, non è altro che un insieme di programmi che nascondono la macchina fisica alle applicazioni. Un programma applicativo opera sulle risorse fisiche, il S.O. fornisce ai programmi applicativi un interfaccia costituita da un insieme di funzioni che mascherano la struttura della macchina fisica mostrando all utente una macchina virtuale, più semplice da usare. 9

Tale astrazione permette al programmatore di strutturare un programma applicativo in maniera indipendente dalla maggior parte dei dettagli architetturali della macchina fisica. L interfaccia di programmazione che il S.O. fornisce ai programmi utente viene indicata genericamente come API (Application Programming Interface). Le operazioni offerte dall API di un S.O. vengono denominate con il termine di System Calls, a indicare che esse sono interruzioni software (sincrone) che vengono chiamate dai programmi applicativi. Altre funzioni del S.O. sono la protezione e la sicurezza dei dati dei vari utenti, la gestione dei malfunzionamenti e la gestione delle risorse. 1.1 Architettura di un sistema operativo Il principale compito di un S.O. è quello di coordinare l evoluzione di più programmi applicativi concorrentemente. Figura 1.2 Architettura generale di UNIX Un primo componente di ogni sistema operativo è quello dedicato alla gestione dei processi, lo scheduler. È compito di questo componente ripartire l uso del processore fra i vari programmi caricati in memoria, in modo tale che lo stesso sviluppi un insieme di processi contemporaneamente, dando l illusione che ciascuno di essi sia eseguito su un diverso processore virtuale. 10

Un ulteriore componente del S.O. è dedicato alla gestione della memoria principale. Per consentire l evoluzione concorrente di un insieme di processi, è necessario che i corrispondenti programmi siano allocati in memoria principale per essere eseguiti. Il S.O. astrae per ogni processo una memoria virtuale, in modo da garantire a ciascuno una propria porzione di memoria (virtuale), con uno spazio di indirizzi (virtuali), e garantisce inoltre accesso e protezione. La gestione dei dispositivi periferici costituisce un ulteriore componente del S.O.. Il S.O. garantisce un corretto accesso ai dispositivi da parte dei processi, evitando possibili interferenze legate alla competizione per il loro uso. Altro compito del S.O. sui dispositivi I/O sta nel mascherare la complessità e la diversità dei vari dispositivi hardware. Esso, infatti, fornisce agli utenti una facile interfaccia per operare su tali dispositivi. Ultimo componente è il file System, linguaggio tramite il quale l utente si interfaccia con il sistema, che garantisce organizzazione, accesso e recupero dei file. Il S.O. ha una parte centrale chiamata Kernel che risiede in memoria principale e contiene tutte le funzioni più utilizzate da S.O.. Il Kernel possiede tante unità centrali quanti sono i processi (processori virtuali), non possiede meccanismi di interruzione e possiede istruzioni di sincronizzazione e scambio di messaggi tra processi che operano sui processori virtuali. Figura 1.3 Kernel tradizionale di UNIX 11

Qualunque richiesta di servizio di sistema deve essere inoltrata al kernel attraverso una system call. L esecuzione di una system call, da parte di un processo utente, corrisponde all attivazione di una parte del kernel a favore dello stesso processo, per espletare il servizio. Quando il Kernel, o parte di esso, viene eseguito a favore di una chiamata di sistema, si dice che tale processo viene eseguito in kernel mode. Una volta espletato il compito, il processo utente ritorna nello stato di user mode. La transizione dello stato da user mode a quello di kernel mode viene effettuata mediante la chiamata di una delle system call. La transizione inversa avviene all atto della chiamata di return() della system call stessa. Al programma utente le trap 2 (interruzioni software) appaiono come delle normali funzioni di libreria. Nel tempo sono stati proposti vari modelli strutturali cui fare riferimento per organizzare il kernel di un sistema. Essi sono: 1. Architettura monolitica; 2. Architettura modulare; 3. Architettura a microkernel. 1.1.1 System Calls Come già esposto, quando un processo vuole eseguire un compito come allocazione in memoria, lettura, scrittura, invio dati e molte altre operazioni, è necessario usare le system call. Esse possono essere effettuate direttamente dall applicazione o indirettamente attraverso un framework 3, come il framework Cocoa su Mac OS X. Le applicazioni utente non hanno accesso diretto all hardware o alle strutture del sistema operativo pertanto hanno bisogno di uscire dai confini del proprio spazio di indirizzamento per invocare una chiamata di sistema. Una volta invocata la system call il controllo passa dall applicazione utente al kernel. Il trasferimento del controllo al kernel viene generalmente eseguito con l ausilio della CPU (Central Processing Unit). 2 Eccezione di natura software generata da un istruzione non lecita. Una trap è un interruzione sincrona (interna) e si distingue da l interruzione asincrona (esterna, non prevedibile in sede di programmazione). 3 Supporto software che include librerie e codice che interagisce con l utente indipendentemente dall applicazione in cui appartiene. 12

Il kernel è un processo privilegiato ed ha la capacità di eseguire operazioni che non sono disponibili per i processi utente, ma sono necessari per la configurazione del sistema. Quando il controllo viene trasferito al kernel, a seguito di una system call, la CPU entra in modalità privilegiata, mentre il codice del kernel viene eseguito e poi discende ai privilegi limitati prima di tornare all applicazione utente. Poiché il kernel esegue ad un livello Figura 1.3 Esempio di una chiamata di sistema privilegiato, durante l esecuzione di una chiamata di sistema per conto di un processo utente, c è il pericolo che ciò provochi inavvertitamente una violazione della sicurezza. Tale situazione potrebbe accadere se il kernel fosse indotto a svolgere un compito vietato al processo utente, come ad esempio è l apertura di un file di cui non si dispongono le autorizzazioni. Per evitare che accada, ogni volta che il kernel esegue una richiesta per conto di un processo utente, è necessario fare attenzione a convalidare i parametri forniti dal processo e vedere la loro validità. 1.2 Architettura monolitica Nell architettura monolitica un sistema operativo è costituito da un unico programma, senza particolari suddivisioni in moduli distinti. Tale semplice struttura ha lo scopo di fornire la massima funzionalità utilizzando il minimo spazio. Il kernel è inteso come un interfaccia virtuale di alto livello sull hardware sottostante che, tramite l uso di system call, implementa i servizi necessari in diverse procedure che girano in modalità supervisore. In questo tipo di architettura ogni componente può comunicare con tutti gli altri. 13

Il kernel racchiude tutte le funzioni del sistema operativo, permettendo un elevata velocità di accesso alle procedure. Figura 1.4 Esempio di architettura monolitica Punti di debolezza sono le difficoltà che si riscontrerebbero qualora si volesse modificare il sistema operativo e le difficoltà di implementazione, in quanto non si può aggiungere un nuovo dispositivo hardware senza aggiungere il relativo modulo al kernel. Un esempio di sistema monolitico è l MS-DOS. 1.3 Architettura modulare Le architetture modulari suddividono il sistema in componenti (moduli), ciascuno dei quali è fornire una delle funzionalità del sistema ed è costruito sopra gli strati inferiori. Ogni modulo è caratterizzato da una ben precisa interfaccia, che specifica la funzionalità offerta e il modo di utilizzarla, e da un corpo, non visibile all esterno, contenente l implementazione del modulo. Con questo approccio, ogni modifica all implementazione del modulo che Figura 1.5 Esempio di architettura modulare mantiene inalterata la sua interfaccia, non ha nessuna influenza sul resto del programma. Tale architettura meglio riflette il concetto di modularità e di facilità di gestione poiché ogni modulo fornisce un servizio ai moduli superiori. 14

Unix utilizza un architettura modulare e distingue i moduli in due categorie: 1. Interfaccia: specifica le funzionalità offerte e il modo in cui utilizzarle 2. Corpo: contiene l implementazione del modulo. Lo svantaggio è l efficienza, poiché ogni richiesta ai livelli inferiori deve passare sempre dai livelli più alti e quindi c è un aumento dell overhead 4. 1.4 Architettura a microkernel Il terzo modello utilizzato per lo sviluppo dei sistemi operativi è l architettura a microkernel, che risale agli anni 90 ed è la più recente. In essa quasi tutte le funzionalità del kernel sono spostate nello spazio utente. Ciò alleggerisce il lavoro del sistema operativo, poiché la maggior parte delle funzionalità vengono eseguite in maniera utente. Figura 1.6 Esempio di architettura a microkenel Nel kernel risiede solo una piccola parte del codice che si occupa della sincronizzazione tra/dei processi ed della gestione della memoria. Gli altri moduli (scheduling, file system, I/O, ) girano nello spazio utente e comunicano tra loro attraverso un meccanismo di comunicazione tra processi, gestito dal kernel. Al vertice dell architettura c è sempre l interfaccia, rappresentata dalle system calls, che offre i servizi del sistema operativo ai programmi applicativi. Le comunicazioni tra i vari moduli del sistema operativo avvengono tramite uno scambio di messaggi tramite client-server. 4 L overhead è un parametro temporale che rappresenta il tempo medio necessario alla CPU per eseguire moduli del kernel. 15

I processi di sistema sono indicati come server; i processi client accedono ai servizi offerti dal server attraverso i meccanismi di IPC (Interprocess communication). Supponiamo che un programma voglia aprire un file: nel caso monolitico, esso contatterà il kernel attraverso una system call, il kernel farà le sue operazioni e rimanderà il risultato al chiamante. Con l architettura a microkernel, invece, il programma comunicherà al server del file system la sua intenzione di aprire un file; il server, se necessario, contatterà a sua volta altri server e, una volta terminato il suo compito, invierà una risposta al programma chiamante. Quindi la IPC è la principale funzione fornita da un microkernel ed essa può facilmente diventare un collo di bottiglia di questi sistemi. Tornando all esempio di prima, con un kernel monolitico l apertura di un file richiede una sola chiamata di sistema, mentre con un microkernel sono necessarie almeno due IPC, quindi almeno due system call. Alla luce di quanto già detto, i sistemi a microkernel introducono overhead maggiore rispetto al caso monolitico, ma hanno anche numerosi vantaggi: interfaccia uniforme, modularità, flessibilità, estensibilità, semplicità e manutenzione. La progettazione dei microkernel impone una interfaccia uniforme alle richieste da parte dei processi. I processi non devono fare distinzione fra servizi livello kernel e servizi a livello utente, perché ogni servizio è fornito tramite le IPC. Inoltre, l architettura è di facile estensibilità, in quanto la modifica o l aggiunta di funzionalità richiede la modifica o l aggiunta di processi applicativi (server), non del kernel. Altra caratteristica legata all estensibilità dell architettura a microkernel è la flessibilità, in quanto il sistema può essere utilizzato per scopi diversi. Nuove funzionalità possono essere aggiunte, mentre funzionalità non necessarie possono essere rimosse, senza alterare le altre strutture. La portabilità consente di trasferire il sistema su un nuovo processore, in quanto la maggior parte del codice dipende dall hardware che è nel microkernel. Altro aspetto significante è l affidabilità, un microkernel più piccolo può essere testato rigorosamente. 16

1.4.1 Progettazione del microkernel Il microkernel deve contenere le funzioni che dipendono dall hardware, quelle necessarie per supportare i server e le applicazioni in modalità utente. Queste funzioni cadono nelle categorie generali di: gestione della memoria, comunicazione tra processi, gestione degli interrupt e dell I/O. Il microkernel controlla il mapping 5 tra la memoria virtuale e la memoria fisica e implementa meccanismi di protezione; il resto della gestione della memoria è implementato all esterno. Un possibile set minimo di funzioni per la gestione della memoria offerte dal microkernel sono: 1. Grant: un processo può concedere alcune sue pagine ad un altro processo. Il kernel rimuove queste pagine dallo spazio di indirizzamento del proprietario e le assegna al processo ricevente. 2. Map: un processo può mappare qualunque sua pagina nello spazio di indirizzamento di un altro processo, in modo che entrambi hanno accesso alle pagine; ciò crea condivisione di memoria fra due processi. Il Kernel mantiene l assegnazione delle pagine al proprietario originale e permette all altro processo di accedervi. 3. Flush: un processo può chiedere indietro qualunque pagina abbia concesso o mappato su di un altro. Il meccanismo di base per la comunicazione tra processi si fonda sullo scambio di messaggi. Figura 1.7 Esempio di comunicazione interprocesso Il messaggio è composto da un header, contenente mittente e destinatario) e da un corpo, che contiene i dati da trasferire. Tipicamente, si può pensare alla comunicazione interprocess come basata su porte associate ai processi: una porta è, essenzialmente, una coda di messaggi destinati ad un particolare processo, a cui si associa una lista di 5 Il mapping consiste nella traduzione degli indirizzi virtuali in indirizzi fisici. 17

accessibilità che indica quali processi possono comunicare con con esso. L identità della porta e l accessibilità su di essa sono amministrate dal kernel. Il microkernel riconosce gli interrupt, ma non può gestirli, esso genera un messaggio per il processo a livello utente associato a quell interrupt e lo invia al processo correttamente associato all interrupt. La trasformazione degli interrupt in messaggi deve essere effettuata dal microkernel, ma questo non è coinvolto nella gestione degli interrupt specifica dei dispositivi. I driver possono essere implementati come processi esterni che attendono messaggi dalle periferiche e colloquiano attraverso I/O memory mapped. 6 6 Tecnica che assegna ad ogni periferica I/O un indirizzo di memoria, in modo che essa risulta mappata in memoria. Altra tecnica è I/O mapped, in questo caso per le periferiche vengono utilizzati indirizzi ed istruzioni specifiche, distinte da quelle della memoria. 18

Capitolo 2 Mac OS X Overview Nel giugno del 2000 Jobs, sul palco del MacWorld Expo, presenta una versione dimostrativa pienamente funzionante di Mac OS X, il nuovo sistema operativo consumer di Apple, la cui uscita era prevista nel 2001. La presentazione è particolare perché, per dimostrare al meglio le capacità del nuovo sistema operativo. Jobs avvia una applicazione appositamente difettata chiamata Bomb. Al contrario di quanto faceva Mac OS 9, che in caso di crash di una applicazione costringeva al riavvio di tutto il sistema, Mac OS X chiude semplicemente l applicazione andata in crash, lasciando inalterate le altre già in esecuzione grazie alle tecnologie per la memoria protetta incluse nelle sue fondamenta. Oltre a questo, Mac OS X presenta finalmente un multitasking. Anche l interfaccia è cambiata, presentandosi com è in parte conosciuta ancora oggi: Aqua. Icone nuove, finestre totalmente rifatte nel look, animazioni e trasparenze. Ancor più importante di ciò è la presenza della dock 7, grande eredità di NeXTSTEP e OpenSTEP, che adesso sfoggia un aspetto moderno e ancor più funzionale di prima. Possiamo proprio dire che Mac OS X è un mix di varie tecnologie che differiscono non solo in ciò che fanno, ma anche nella provenienza, nella filosofia che rappresentano e nel modo in cui sono implementate. All utente finale, tuttavia, il Mac OS X si presenta con un immagine coesa e consistente. Il fatto che i computer Apple abbiano una base hardware limitata e ben definita ne ha sicuramente aiutato il successo, a fronte di una forte efficienza ed ottima implementazione di alcuni codici driver propri dell hardware. 7 Funzionalità dell'interfaccia grafica di alcuni sistemi operativi che serve ad eseguire programmi e funzionalità del sistema e a passare agevolmente tra le applicazioni in esecuzione. 19

Da un punto di vista high-level, il Mac OS X può essere considerato come composto da tre classi di tecnologie: quelle originarie di Apple, quelle originate all interno della NeXT e quelle originate in qualunque altro posto ; quest ultimo consiste principalmente di software open source di terze parti. L utente finale rimane il maggior beneficiario, potendo contare su una varietà di software mai vista su una singola piattaforma. Il Mac OS X fornisce i benefici di un tipico sistema UNIX mantenendo la tradizionale facilità d uso del Macintosh. Il suo ambiente UNIX è sufficientemente conforme allo standard da garantire la portabilità della maggior parte dei software, molti altri programmi non-unix (come Microsoft Office o Adobe Creative Suite) sono disponibili in modo nativo per Mac OS X, per non parlare poi della varietà di programmi propri di Apple. 2.1 Mac OS X Mac OS X è il primo ad avere un kernel Unix-like, noto come XNU ( XNU is Not Unix ), ottenuto dall unione del kernel Mach e del kernel BSD (Berkeley Software Distribution). Il kernel XNU è alla base anche di un sistema operativo open source di nome Darwin, le cui tecnologie sono riversate su Mac OS X. In definitiva Mac OS X è stato creato combinando: 1. Darwin OS, un sistema operativo libero e completo sviluppato da Apple, con kernel XNU basato sul microkernel Mach, ispirato e ibridato al kernel del sistema operativo BSD. 2. Una serie di I/O kit, frameworks, un set di librerie ottimizzate che facilitano il porting del codice UNIX e alcuni set di API (Carbon e Cocoa), sviluppate da NEXTStep e Apple Computer. 3. Un'interfaccia grafica, chiamata Aqua, sviluppata da Apple Computer. Il sistema operativo ha avuto il suo primo rilascio commerciale nel 2001. È implementato per processori PowerPC G3, PowerPC G4 e PowerPC G5 prodotti da IBM e Motorola (ora Freescale Semiconductors), per processori Intel (probabilmente su tutti i processori con istruzioni SSE2) e per processori ARM Cortex. 20

Figura 2.1 Struttura di Mac OS X Mac OS X mantiene transitoriamente, fino al rilascio della versione Leopard per PowerPC, una retro compatibilità quasi assoluta con le applicazioni Macintosh anche molto datate, grazie alla caratteristica di poter caricare, all'occorrenza, il Mac OS Classic in una macchina virtuale, all'interno di un apposito task isolato e chiuso dal resto del sistema. Inoltre, le A.P.I. Carbon hanno consentito una veloce conversione di molti applicativi da Mac OS 9 a Mac OS X, dando modo di completare la transizione. L'eredità del NeXTSTEP è ancora presente, si nota anche dal fatto che molte primitive iniziano con la sigla "NS" (contrazione di NEXTStep). Le A.P.I. NEXTStep/OpenStep sono state integrate nel sistema operativo nelle A.P.I. Cocoa. Mac OS X è in grado di eseguire direttamente molti programmi per B.S.D. e GNU/Linux attraverso la compilazione dei sorgenti (make) e, in alcuni casi, tramite il ricorso alla gestione grafica via Apple X11, presente di serie nel sistema operativo, anche se normalmente non utilizzato dalle applicazioni per OS X che adoperano nativamente il motore grafico Quartz. 21

2.2 Darwin Darwin è un sistema operativo che utilizza il kernel XNU ed insieme all interfaccia grafica Aqua, forma Mac OS X. Tale sistema operativo è libero perché distribuito al pubblico con l Apple Public Source License per renderlo open source. Darwin rappresenta una grande quantità di software che l Apple ha riunito da una varietà di fonti come NEXTSTEP e OPENSTEP, Mach, vari flavors di BSD (principalmente FreeBSD). È importante sottolineare che, tutti questi software esterni sono stati integrati nel Mac OS X molto efficacemente, grazie ad importanti modifiche e ottimizzazioni. Anche se è possibile configurare e controllare la maggior parte di tale software così come si farebbe normalmente su un tradizionale sistema UNIX, il Mac OS X mette a disposizione interfacce utente semplificate e più consistenti, che riescono a nascondere la sottostante complessità. Questa efficienza nell adottare tecnologie da diverse fonti, integrandole in modo sinergico, è una delle grandi forze del Mac OS X. L Apple mette a disposizione Darwin come un set di packages, dove ogni pacchetto è un archivio contenente il codice sorgente di una parte del Mac OS X. Il numero di pacchetti presenti varia da release a release. Darwin, come molti kernel moderni segue un approccio ibrido, contenendo caratteristiche sia di un microkernel che di un kernel monolitico. Difatti, segue un approccio da microkernel per quanto riguarda la gestione dei servizi, ma integra nello stesso microkernel ampie porzioni del sistema monolitico per ridurre i tempi dovuti alla IPC. In definitiva, deriva da un unione in stile NeXT di Mach e FreeBSD., ma non è dotato di una struttura a microkernel pura come Mach. Tutte le altre porzioni del kernel dividono lo spazio di indirizzamento con Mach per prevenire un abbattimento delle prestazioni quando le altre parti devono comunicare con esso e permettere anche una maggiore integrazione di tutti i componenti. Oltre ai componenti Mach e BSD, l'interfaccia dei driver funziona tramite un componente chiamato I/OKit. Questo è un modello per la creazione di driver orientato agli oggetti; ciò significa che tutti i driver esistenti per BSD devono essere convertiti per I/OKit prima che possano essere utilizzati da Darwin, ma significa anche che verranno fornite molte caratteristiche che attualmente mancano a BSD. La natura ad oggetti riduce anche il codice ridondante e semplifica lo sviluppo dei driver. 22

Riassumendo grossolanamente la relazione fra tutti questi differenti componenti, è possibile affermare che: Mach fornisce l'ambiente per la memoria virtuale e molto del codice di partenza specifico della macchina, I/OKit i driver per le varie periferiche e BSD fornisce le interfacce a tutti i componenti, come il file system, le chiamate di sistema e praticamente tutto ciò di cui hanno bisogno le applicazioni utente. Questa è ovviamente una grossa semplificazione della relazione fra i diversi componenti, ma dovrebbe fornire una vaga idea su come essi si interpolano. 2.3 Kernel XNU Il kernel del Mac OS X si chiama XNU, è ibrido, ovvero basato sull unione del codice del microkernel Mach e del kernel monolitico FreeBSD. Le funzioni primitive e i servizi fondamentali del kernel XNU si basano su Mach 3.0, il quale è stato concepito come un microkernel semplice ed estensibile. Esso riesce ad eseguire il nucleo del sistema operativo come un processo separato, cosa che permette una grande flessibilità (si possono eseguire svariati sistemi operativi in parallelo sul microkernel Mach), ma nel contempo riduce le prestazioni a causa del context switch 8 tra Mach ed altri sistemi operativi. Come già detto, XNU ha un architettura a strati, costituita da tre componenti principali ed altre 4 componenti secondarie. Mach: lo strato servizio (gestione dei processi, IPC, gestione memoria ); BSD: fornitore primario dell interfaccia di programmazione del sistema; I/O Kit: ambiente per i drivers; Libkern: libreria interna al kernel: Libsa: libreria interna al kernel utilizzata solo all inizio del system start-up; Platform Expert: modulo astrazione hardware; Kernel extension: varie famiglie di I/O Kit; 8 Il context switch è un particolare stato del sistema operativo durante il quale avviene il cambiamento del processo correntemente in esecuzione su una delle CPU. 23

Figura 2.2 Componenti principali del kernel XNU Il kernel XNU supporta il caricamento a memoria dinamico 9 nello spazio di indirizzi del kernel a runtime 10. Questo aspetto permette funzionalità extra, come i driver, che possono essere caricati dinamicamente mentre il kernel è in esecuzione; in questo senso possiamo affermare che il kernel di Mac OS X è qualcosa in più di XNU. Il package XNU del Darwin contiene approssimativamente un milione di linee di codice, in cui una metà sono riconducibili al BSD ed un terzo al Mach. Le varie estensioni del kernel, non tutte sono necessarie o caricate in un dato sistema, formano nell insieme un altro milione di linee di codice. Il numero di kernel extensions caricate in un certo momento in un dato sistema, sono significativamente meno di quelle presenti nel sistema. 9 Consente ad un processo di caricare e scaricare le sue parti dal disco quando serve a runtime 10 Indica a tempo di esecuzione, ovvero il caricamento in memoria è effettuato durante l esecuzione del kernel e non in fase di compilazione. 24

2.4 Mach Se il kernel di XNU è il cuore di Mac OS X, allora il Mach può essere considerato il cuore di XNU. Mach fornisce servizi di basso livello che sono trasparenti alle applicazioni. Figura 2.3 Servizi del livello Mach e BSD Tali servizi sono: Astrazione hardware (nasconde le differenze tra architettua a x32 e x64) ; Meccanismi di IPC; Gestione del processore (scheduling ed SMP (Symmetric multiprocessing)); Mutitasking (supporto ai task ed ai threads); Gestione della memoria virtuale (incluso il paging, la protezione e la condivisione); Supporto real-time; Console I/O. Il microkernel Mach trasferisce il codice BSD all esterno, in tale modo il codice specifico Unix viene eseguito come server in modalità utente permettendo di rimpiazzare BSD con un altro sistema operativo e/o di eseguirne altri simultaneamente. 2.5 BSD Il kernel XNU include molte linee di codice derivanti direttamente da FreeBSD, tale codice per poter funzionare correttamente con Mach ed I/O Kit è stato modificato, pur conservando alcune caratteristiche tipiche dei sistemi BSD. A differenza di Mach, che fornisce solo alcuni servizi fondamentali, il livello BSD si trova tra Mach e le applicazioni utente ed implementa molte funzioni del sistema operativo di base, sulla scorta dei servizi offerti da Mach. Possiamo quindi dire che BSD fornisce le interfacce all utente. 25

I servizi forniti dallo strato BSD sono: System calls; Networking: garanzia al sistema di interagire facilmente con altri sistemi, nonché come server, fornendo funzioni base; File System; Supporto al Memory management: facilita l allocazione in memoria grazie all Unified Buffer Cache (UBF); Security: protezione della memoria, garantisce che le applicazioni non interferiscano tra loro e, nel caso di crash di un applicazione, il sistema rimane stabile.; Process and User management: fornisce supporto all utente ed ai processi ( ad esempio la creazione di un processo fork() ); POSIX APIs. 2.6 I/O Kit Come ultimo componente principale di XNU rimane l I/O Kit, che è un framework orientato agli oggetti per i drivers di periferica. L implementazione dell I/O Kit consiste nelle librerie C++ residenti nel Kernel (libkern ed I/O Kit) e un framework per lo spazio utente. Esso fornisce un astrazione hardware del sistema, con dei templete 11 base per molti driver; ciò rende semplice l implementazione di un nuovo hardware, in quanto gran parte delle sue funzionalità le erediterà da altre classi di driver base, consentendo un grande riutilizzo del codice. L I/O Kit mantiene un database noto come I/OCatalog, cheè un registro di tutte le classi disponibili in I/O Kit. Un altro database, l I/ORegistry, traccia delle istanze degli oggetti dell I/OCatalog. Gli oggetti dell I/ORegistry rappresentano in genere driver o classi di supporto e sono strutturati in maniera gerarchica, che rispecchia il modo in cui i dispositivi hardware sono collegati fisicamente tra loro. Un esempio è un dispositivo USB, esso è un figlio del controller USB cui è collegato. 11 Struttura generica o stardard. 26

L I/O Kit si basa su tre concetti principali: Famiglie Driver Nodi Le famiglie rappresentano astrazioni comuni per determinati dispositivi. Ad esempio IOUSBFamily, gestisce molti meccanismi per il sostegno dei dispositivi USB. I driver sono responsabili della gestione del dispositivo ed esso può avere una corrispondenza con una o più famiglie. Sempre nel caso di una periferica USB, il driver può dipendere dall IOUSBFamily, così come IOStorageFamily. I nodi sono punti di accesso per un canale di comunicazione fisico o logico. 2.7 Altre componenti di XNU 2.7.1 Libreria libkern La libreria libkern, a differenza di Mach e BSD che forniscono API per interagire con il sistema, offre i servizi necessari ai driver ed alle classi utili allo sviluppo di software per il kernel. Queste sono alcune funzioni che si trovano in libkern: Allocazione, costruzione e distruzione dinamica di oggetti (esempio gli operatori new() e delete() ). Classi speciali come OSObject, superclasse che gestisce tutto l I/O Kit. Implementazioni di funzioni classiche del C : printf(), scanf(),strtol(),. Funzioni come OSMalloc(), per allocazione di memoria e primitive di sincronizzazione. Libkern fornisce anche una serie di classi, la più importante delle quali è OSObject, che è considerata la superclasse di tutto l/o Kit 27

2.7.2 Libreria libsa La libreria libsa è una libreria di supporto utilizzata durante le fasi dell avvio del sistema per caricare le estensioni del kernel, che si comporta come un linker 12. Le estensioni di OS X sono normalmente caricate su richiesta, attraverso il daemon 13 dello spazio utente kextd. Durante le prime fasi del bootstrap kextd non è disponibile. 2.7.3 Platform expert Il Platform Expert è un oggetto, essenzialmente un driver specifico della motherboard, che conosce il tipo di piattaforma su cui sta girando il sistema. Esso gestisce l enumerazione e il rilevamento del dispositivo per il bus di sistema ed è inoltre responsabile della costruzione dell I/O Kit albero, scopre le periferiche collegate al bus e così via. 2.7.4 Kernel extensions Il kernel XNU, come già detto, supporta il caricamento in memoria dinamico. Ciò permette di avere funzionalità extra, come i driver, che può essere caricato e smontato mentre il kernel è in esecuzione. Oltre ai driver, l ambiente del kernel Mac OS X include delle estensioni che possono essere caricate dinamicamente quando necessarie. Molte delle estensioni standard sono indirizzate all I/O Kit. 12 Programma il collegamento (linking) tra la traduzione del codice sorgente in linguaggio macchina (codice oggetto) e le librerie del linguaggio necessarie alla carretta esecuzione. 13 Programma speciale eseguito in background, senza l intervento dell utente. 28

2.8 Hight-Level layers La tesi nello specifico tratta i low-level layers (strati di basso livello), ma è doveroso accennare i livelli superiori dell architettura che hanno caratterizzato la storia del sistema Mac OS X. 2.8.1 Application services Nello strato dell application services il più importante è il sistema grafico. Il cuore grafico è composto da una tecnologia denominata Quartz utilizzata in Mac OS X per la grafica in 2D, OpenGL per il 3D ed Apple QuickTime per la multimedialità. Apple ha fortemente incoraggiato gli sviluppatori all uso della tecnologia Quartz come valor aggiunto ai sistemi Mac OS X. Quartz svolge il ruolo di window server e di rendering 2D indipendentemente dal dispositivo utilizzato, basandosi su un modello bidimensionale indipendente dalla piattaforma PDF (Portable Document Format). Quartz si può definire come la rappresentazione della terza generazione di sistemi grafici, dopo la scrittura del pixel e l impiego di funzioni di basso livello. Tale tecnologia utilizza vettori grafici e funzioni matematiche per la manipolazione degli elementi grafici. OpelGL viene utilizzato da Apple per il rendering in tre dimensioni, attenendosi ad uno standard che consente una grande portabilità del codice scritto. QuickTime svolge il ruolo di potente motore multimediale per l apertura e la memorizzazione di file audio, video, animazioni, grafici. Il pacchetto è disponibile per un considerevole numero di piattaforme ed è in grado di gestire innumerevoli formati. Tutto questo permette di rendere l interfaccia grafica Aqua particolarmente semplice, piacevole e potente, secondo la tradizione Apple. La componente che mette in comunicazione il layer application services con il layer API è il Carbon Core. Il Carbon Core sono delle librerie dinamiche 14 scritte in linguaggio C, che permettono l esecuzione dei programmi Mac OS più datati. Successivamente parleremo del layer API, tale livello permette l esecuzione dei programmi scritti per sistemi Mac OS. 14 Nel collegamento dinamico le componenti di una libreria sono caricate nel programma a tempo di esecuzione piuttosto che essere collegate dal lineker. Esse restano separate dall eseguibile e contenute in un file separato. 29

2.8.2 API La maggior parte delle applicazioni si collocano nel livello API che viene anche chiamato Application Environments Layer. Mac OS X ha diversi ambienti applicativi ed a ciascuno offre delle API per sviluppare. Alcune delle API più importanti offerte a questo livello sono: BSD API: l ambiente applicativo BSD in Mac OS X è molto simile, ma non uguale, al tradizionale livello utente basato su UNIX. È possibile usare l ambiente BSD per strumenti di scrittura e script di shell. Carbon: sono le API contenute in OS X che consentono ai programmi scritti per i sistemi precedenti a Mac OS X di funzionare sul nuovo sistema operativo tramite piccole modifiche. Se l applicazione fosse scritta senza Carbon allora necessiterebbe di Classic. Classic: il suo compito è quello di emulare OS 9 in modo da eseguire applicazioni pre OSX (dunque senza Carbon) su macchine con OSX. Il nome identifica anche l ambiente Classic Cocoa: è l ambiente di programmazione orientato agli oggetti incluso in OSX. Le applicazioni basate su Cocoa sono sviluppate tramite linguaggi come Objective-C, AppleScript, C++, Objective-C++, Java e Python. Le applicazioni Cocoa sono native per OSX.. Cocoa è una raccolta di API e un insieme di strumenti visive che sono particolarmente utili per la modellazione dei dati. 30

Capitolo 3 Il kernel XNU In questo capitolo sono trattati gli aspetti interni al kernel, su cui è stato sviluppato il Mac OS X di Apple e gli aspetti caratterizzanti del sistema. In particolare, la trattazione riguarderà principalmente il microkernel Mach ed il sottosistema BSD, la gestione dalla memoria, lo scheduling e l IPC. 3.1 Mach Il Mach è stato progettato come un kernel per sistemi operativi orientati alla comunicazione con pieno supporto al multiprocesso. Nell idea degli sviluppatori dovrebbe essere un microkernel in cui i tradizionali servizi del sistema operativo (come il file system, l I/O, i gestori della memoria, i networking, etc.) sono residenti nello spazio utente, con una chiara e logica separazione modulare tra loro ed il kernel. Il Mach fornisce un interfaccia di macchina virtuale agli altri strati creando un astrazione dell hardware di sistema. Pensato per essere semplice ed estensibile, il cuore del kernel Mach fornisce un meccanismo IPC che è il fondamento per una moltitudine di servizi da esso offerti. In particolare, l unione dell IPC e del sottosistema della memoria virtuale porta a varie ottimizzazioni ed esemplificazioni. Tutte le componenti del kernel del Mac OS X risiedono in un singolo spazio di memoria kernel. Questa caratteristica ne agevola le prestazioni: è molto più veloce per effettuare una chiamata diretta tra i componenti. 31

Il Mach ha cinque astrazioni base dal punto di vista del programmatore: Task; Thread; Porte; Messaggi; VM Object. 3.1.1 Task e Thread Mach fa distinzione tra task e thread. Un task è un ambiente di esecuzione statica, cioè non compie alcuna computazione da solo, ma fornisce una struttura nella quale le altre entità eseguono (thread). Il task è considerato come un resource container, infatti esso contiene una collezione di risorse come: accesso ai processori, memoria virtuale, IPC, gestori delle eccezioni, descrittori dei file, stato della protezione, stato della gestione e statistiche. Un thread è, invece, l entità di esecuzione nel Mach, esso esegue all interno di un task e possiede dei propri registri, quali: program counter 15, uno stack e registri del processore. I thread sono spesso chiamati processi leggeri, ad indicare il fatto che possiedono poche informazioni di stato, e sono quindi veloci da creare, distruggere ed interrompere. Il thread ha le seguenti proprietà: Il codice eseguito da un thread risiede nello spazio di indirizzi del proprio task. Tutti i thread interni ad un task condividono le risorse del task. In particolare, poiché tutti i threads condividono la stessa memoria, un thread può sovrascrivere la memoria di un altro, senza la necessità di ottenere nessun privilegio aggiuntivo. Un thread può avere il proprio gestore delle eccezioni (excpetion handler 16 ). Ogni thread ha un proprio stato di computazione, che include i registri del processore, un program conter ed uno stack. Notiamo che nonostante lo stack di un thread sia indicato come privato, esso risiede nello spazio di indirizzi di tutti gli altri threads appartenenti allo stesso stack. Di conseguenza, per quanto detto, ogni thread può accedere agli stacks degli altri threads dello stesso task. 15 Registro che contiene indirizzo all'istruzione che dovrà essere successivamente eseguita. 16 Meccanismo hardware per la gestione delle interruzioni. 32

Ricapitolando: un task è passivo, con risorse proprie e costituisce l unità base della protezione; un thread è attivo, esegue istruzioni ed è l unità base del controllo di flusso. Un task è considerevolmente più costoso da creare o distruggere di un thread. 3.1.2 Porte Tutte le funzioni IPC sono svolte attraverso i concetti di porte e messaggi. Le primitive per lo scambio dei messaggi sono fondamentali: con esse, infatti, i task (o i thread) possono comunicare con il kernel, tant è vero che quasi tutte le funzioni di Mach si basano sulle funzioni di send() e recive(). Una porta è un canale di comunicazione; in particolare, è una coda di una determinata lunghezza, gestita e protetta dal kernel. Le operazioni di base su una porta sono la send() e la recive() di messaggi: spedire ad una porta permette ad un task di mettere i messaggi nella coda sottostante, mentre ricevere su una porta permette al task di recuperare i messaggi dalla coda. Per poter accedere ad una porta, i task ed i thread devono possedere determinati diritti su di essa (port right). Esistono tre tipi di diritti: lettura (recive right), scrittura (send right) e scrittura singola (send once right). Il diritto di lettura è esclusivo: per ogni porta, può esserci un solo ricevente, solo un task può leggere i messaggi in arrivo; il diritto di scrittura, al contrario, può essere posseduto da parecchi task. Quando si parla di un messaggio inviato ad un task, s intende che il messaggio è spedito alla porta il cui task possiede i diritti di ricezione. Il messaggio viene poi rimosso dalla coda da un thread interno al task ricevente. Figura 3.1 Diritti sulle porte 33

3.1.3 Messaggi I messaggi possono essere spediti e ricevuti attraverso la famiglia di funzioni mach_msg. Un messaggio Mach nel Mac Os X è così formato: Header: contiene tutte le informazioni di controllo del messaggio. Body: contiene dei dati utente o dati del kernel. Trailer: contiene gli attributi del messaggio. Un messaggio può essere semplice o complesso. Un messaggio semplice contiene un header immediatamente seguito dal body, mentre un messaggio complesso un body strutturato. Porte e messaggi si prestano bene anche ad astrarre alcuni meccanismi di livello più basso, come gli interrupt e le porte hardware. Figura 3.2 Dipendenza grafiche delle librerie di mach_msg 34

3.2 BSD In Mac Os X, lo strato BSD è in esecuzione con il processore in modalità privilegiata e non come un task utente, come originariamente era previsto dal progetto Mach; inoltre, viene eseguito nello spazio di indirizzamento del Mach e I/O Kit. Ricordiamo i servizi offerti dallo strato BSD: System calls; Networking: garanzia al sistema di interagire facilmente con altri sistemi, nonché come server, fornendo funzioni base; File System; Supporto al Memory management: facilita l allocazione in memoria grazie all Unified Buffer Cache (UBF); Security: protezione della memoria, garantisce che le applicazioni non interferiscano tra loro e, nel caso di crash di un applicazione, il sistema rimane stabile; Process and User management: fornisce supporto all utente ed ai processi ( ad esempio la creazione di un processo fork() ); POSIX APIs. 3.2.1 System Calls Quando un applicazione ha bisogno di servizi del file system o desidera accedere alla rete, è necessario effettuare una system call al kernel. Lo strato BSD implementa tute le chiamate di sistema. Quando una system call viene eseguita, il kernel passa da user mode a kernel mode. Questa API, chiamata API system call, è la tradizionale Unix Api per richiamare le funzioni del kernel dallo spazio utente. Ci sono all incirca 200 system call (open, read, fork, write, exec). Lo strato BSD fornisce anche la funzione ioctl(), a sua volta una chiamata di sistema, che è l abbreviazione di controllo I/O, tale funzione viene di solito utilizzata per inviare comandi a driver di periferica. 35

3.2.2 Networking Il networking è un sottosistema principale di BSD; quest ultimo gestite molti aspetti delle reti come ad esempio l attuazione di protocolli TCP/IP. Lo stack di rete BSD accetta i dati in uscita da un applicazione, controlla il formato del pacchetto e poi li dirotta verso l interfaccia rete appropriata. BSD implementa anche il firewall 17 IPFW (Ip Firewall), che filtra i pacchetti da/per il computer in base ad un criterio impostato dall amministratore del sistema. Il livello rete di BSD supporta un ampia gamma di protocolli di livello rete e trasporto, tra cui IPv4, IPv6, TCP e UDP. Al livello più alto troviamo anche protocolli DHCP e ICMP. Inoltre, sono presenti altre funzioni relative alla rete come Routing e NAT. Il kernel supporta anche il network extensions attraverso il meccanismo NKE (Network Kernel Extensions). Il NKE supporta il caricamento dinamico e può essere utilizzato per vari scopi, tra i quali: Meccanismi personalizzati di firewall e sicurezza; Supporto per l uso e l aggiunta di nuovi protocolli; Creazione di interfacce di rete virtuali; Creazione di sistemi personalizzati di routing; Un NKE utilizza, in genere, uno dei seguenti meccanismi di filtraggio: Socket 18 filter: consente di inserire dei filtri in varie punti del socket layer per filtrare traffico in ingresso o in uscita. IP filter: consente il filtraggio del traffico Ip. Interface filter: consente di monitorare e modificare il traffico su una specifica rete. Interface KPI(Kernel Programming Interface): è un interfaccia di programmazione per la creazione di nuove reti. 17 Componente hardware e/o di una rete informatiche, utilizzato per accettare, bloccare o mediare il traffico dati. 18 Astrazione software progettata per poter utilizzare delle APLI per la trasmissione e la ricezione di dati attraverso una rete. 36

3.2.3 File system Mac OS X ha implementato il VFS (Virtual File System) che è una strato software nel kernel che definisce ed implementa l interfaccia al file system. Esso funge da livello di astrazione per molti tipi di file system, permettendo quindi la loro coesistenza. Il VFS deve saper gestire in qualunque momento tutti i file system attivi. Esso consente il supporto per i nuovi file system per essere facilmente aggiunti come estensioni del kernel tramite l interfaccia di programmazione del kernel VFS, in modo completamente trasparente al sistema operativo. Figura 3.3 Schematizzazione del VFS Ogni volta che un file system è inizializzato compie una registrazione presso il VFS. Questa è un operazione che avviene all avvio del sistema se il supporto file system è direttamente inserito nel kernel. Il risultato della registrazione è quello di rendere il VFS capace di leggere il superblocco del nuovo tipo di file system. È in tale blocco, infatti, che sono memorizzate le informazioni basilari ed in particolare le operazioni specifiche per accederne al contenuto Il kernel supporta una diversa gamma di file system. Il file system primario utilizzato da Mac OS X è HSF+ (Hierarchical File System Plus), che è stato sviluppato come sostituto per i file system HFS di Mac OS. 37

Figura 3.4 File system presenti su Mac OS X All interno del file system operazioni su file e directory sono implementate attraverso i vnodes e VOP (vnode operation). Le chiamate VOP vengono utilizzate per operazioni sui singoli file oppure sulle singole directory. Un esempio può essere l apertura o la scrittura di un file: VOP_OPEN e VOP_READ, rispettivamente per aprire e scrivere un file. Per effettuare operazioni di caricamento o smontamento di una periferica si usano le chiamate del VFS. Un esempio è il mount e l umount di una periferica: VFS_MOUNT e VFS_UMOUNT. HSF+ ha il supporto per il journaling, una tecnica usata per preservare l integrità dei dati da eventuali cadute di tensione. Quando un applicativo invia dei dati al file system per memorizzarli su disco, questo prima memorizza le operazioni che intende fare su un file di log ed in seguito provvede ad effettuare le scritture sul disco, quindi registra del file di log le operazioni che sono state effettuate. In caso di crash durante la scrittura del disco, il file system non dovrà fare altro che controllare in file di log per determinare quali operazioni non sono state terminate e quindi sarà in grado di correggere gli errori presenti nella struttura del file system. HFS+ supporta i file di grandi dimensioni, fino a 8EiB (1Exbibyte= ) che è la dimensione massima del volume possibile. Il file system ha il pieno supporto per i caratteri Unicode 19. Il file system NFS fornisce l accesso ai server di rete come se fossero montati in locale ed è quindi molto utilizzato per operazioni di networking. 19 Sistema di codifica che assegna un numero univoco ad ogni carattere usato per la scrittura di testi, in maniera indipendente dalla lingua, dalla piattaforma informatica e dal programma utilizzati. 38

3.3 Scheduling In un tipico sistema operativo, un processo rappresenta un programma in esecuzione con le risorse di sistema associate. Il kernel fornisce un illusione d esecuzione concorrente attraverso lo scheduling delle risorse tra i processi. Su un sistema multiprocessore, o multicore, è possibile eseguire più processi concorrentemente. Nei sistemi Unix, l unico modo per creare un nuovo processo è attraverso la chiamata fork() e l unico modo di far girare un nuovo programma in un processo è attraverso la chiamata di sistema exec(). Il Mach astrae alcune strutture importanti nel sottosistema di processo del Mac OS X: 1. Processor set: (struttura dell insieme dei processori) durante l avviamento del kernel, prima che lo scheduler possa partire, viene inizializzato il default processor set con tutti i processori di sistema. Un oggetto processor set ha due porte che lo rappresentano: la porta name e la porta control. La porta name è un identificatore che può essere utilizzato per recuperare informazioni circa l insieme dei processori. La porta control rappresenta l oggetto sottostante, che può essere utilizzato per eseguire operazioni di controllo. 2. Processors : è la descrizione di un processore fisico (indipendente dalla macchina). Il Mach raggruppa i processors in uno o più processor set, ognuno dei quali con una propria run queque (coda pronta) di task eseguibili, e ogni processore ha una sua coda di esecuzione. Un task contiene una lista dei suoi threads ed un riferimento al relativo processor set. Il sistema di schedulazione Mach si basa sull algoritmo Round Robin 20 con code e livelli di priorità. Ad ogni thread è associata un valore di priorità, compreso tra 0 e 127; il valore viene determinato attraverso la media esponenziale del tempo di CPU precedentemente usato, abbassando la priorità dei thread con precedenti tempi di esecuzione lunghi. Lo scheduler del Mac OS assegna il processore ad ogni thread per un breve periodo di tempo detto quanto (timeslice), dopo il quale schedula un altro thread in attesa di 39

esecuzione con priorità maggiore o uguale. Nel caso si presenti un thread con priorità maggiore, quello in esecuzione può essere interrotto prima dello scadere del proprio timeslice, per lasciare il processore al thread prioritario (preemptive scheduling). La priorità viene ricalcolata continuamente e ne vengono distinti quattro tipi, che possono essere assegnati ad un thread. Figura 3.5 Livelli di priorità dello scheduling Ogni coda di esecuzione comprende tre variabili: un mutex, un contatore ed una variabile di supporto scelta. Il mutex viene usato per bloccare la struttura dati e per garantire che solo una CPU alla volta stia gestendo la coda. Il contatore mantiene il numero di threads sulle code, se tale numero è pari a zero non ci sono task da eseguire e viene lanciato un apposito thread d attesa. La terza variabile viene utilizzata come suggerimento su dove trovare il thread a priorità massima migliorando la ricerca nelle code non vuote. Per garantire che non vi siano unità in esecuzione in attesa da molto tempo, starvation, Mach ha un thread interno al kernel che ogni due secondi scansiona le code di esecuzione aumentando di priorità eventuali thread che stanno andando in starvation 21. 20 RR è un particolare algoritmo di scheduling, di tipo preemptive. Esegue i processi nell'ordine d'arrivo, come il avendo la prelazione del processo in esecuzione. 21 Indica quelle condizioni in cui ad un processo a bassa priorità non viene mai assegnata una risorsa. 40

3.4 Interprocess communication Nei moderni sistemi operativi, dei semplici programmi possono essere composti da molti threads, i quali devono comunicare tra loro per scambiarsi dei dati o delle informazioni. L interprocess communication (IPC) è un meccanismo ben definito di comunicazione tra due entità. Storicamente le due entità erano i processi, attualmente possono essere anche dei threads di uno stesso task o dei threads di tasks diversi. L IPC può essere utile per le seguenti operazioni: Condivisione dei dati Trasferimento dei dati Condivisione delle risorse Sincronizzazione tra entità I primi meccanismi IPC usavano i files come mezzo di comunicazione. In seguito ci fu l approccio della shared memory (memoria condivisa), dove i processi utilizzavano regioni di memoria comunemente accessibili. Infine, il meccanismo di IPC è diventato un astrazione del sistema operativo. Il Mac Os X fornisce un gran numero di meccanismi IPC, alcuni di questi sono: Mach IPC Mach Exceptions Posix IPC In realtà ci sarebbero molti altri meccanismi di IPC, ognuno dei quali ha dei benefici, difetti e rischi. Un programmatore può aver bisogno di usare un particolare meccanismo, o anche diversi, in base alle richieste del programma. 41

3.4.1 Mach IPC Il Mach fornisce una IPC orientata ai messaggi, l implementazione utilizza la Virtual Memory (VM) per trasferire efficientemente grandi quantità di dati. Il kernel Mac OS X usa la primitiva generale del messaggio, fornita dall interfaccia IPC del Mach; le chiamate mach_msg() e mach_msg_overwrite() possono essere utilizzate rispettivamente per inviare ed ricevere messaggi. Come già detto il kernel Mach astrae due oggetti base per la comunicazione IPC: le porte ed i messaggi( par. 3.1.2 e par. 3.1.3). Il messagging è un operazione molto usata sui sistemi Mach. La funzione del kernel fondamentale del messagging è la mach_ms_overwrite_trap(). 3.4.2 Mach exceptions Le eccezioni sono delle interrupt inviate alla CPU che si verificano durante l esecuzione di un thread. Un eccezione comporta l interruzione dell esecuzione del thread, mentre il sistema operativo elabora il suo flusso di esecuzione. L attività riprende successivamente con la normale routine. Quando si verifica un eccezione, il kernel sospende il thread ed invia un messaggio IPC ad una porta speciale che gestisce le eccezioni. La seguente struttura incapsula le eccezioni da inviare alla porta speciale. Figura 3.6 Struct per le exceptions Quando un eccezione è stata inviata, il kernel attende il suo completamento, se ritorna KERN_SUCCESS significa che l eccezione è stata gestita correttamente ed il flusso di controllo potrà riprendere. Quando un processo utilizza la chiamata di sistema fork(), il processo figlio erediterà la stessa porta delle eccezioni del padre. 42