pe Vers
r i io
l W ne
eb
!
Il Kernel di Mac OS X:
una breve panoramica.
Relatori:
D@nselm
eldino
Seminario | 09.06.2008
Pagina 2/14
Mac OS X è il termine commerciale che indica la versione 10.0 di Mac OS
sul mercato dal 2001 ed è la prima ad avere un kernel Unix-like, noto
come XNU ("XNU is Not Unix"), ottenuto dall'unione del kernel Mach e del
kernel FreeBSD.
Il kernel XNU è alla base anche di un sistema operativo open-source e
standalone di nome Darwin, le cui tecnologie sono alla base di Mac OS X
e di iPhone OS, e che viene sviluppato da Apple in collaborazione con una
comunità mondiale di sviluppatori. XNU è costituito da:
Mach:
- è nato da un progetto di ricerca del Carnegie Mellon University di
Pittsburgh (Pennsylvania) a metà degli anni ‘80;
- in origine si trattava di un kernel monolitico, ma con la versione 3.0
(quella attuale) è diventato un microkernel;
- è stato esteso da Apple per raggiungere la funzionalità e le prestazioni
per cui è noto Mac OS X;
- si occupa delle funzioni primitive e dei servizi fondamentali del sistema.
BSD:
- è parte del nucleo Mach;
- si occupa dei permessi, dei filesystems, dello stack TCP/IP etc;
I/O Kit.
- permette di scrivere i drivers facilmente.
- Hexley, la mascot di Darwin Introduzione
Pagina 3/14
- Darwin con desktop environment Gnome (Fonte: Wikipedia) -
Pagina 4/14
XNU è un kernel ibrido, ovvero è una via di mezzo tra un microkernel
e un kernel monolitico.
Vantaggi:
- il sistema operativo è più reattivo e più veloce, ed è meno sensibile ai
fallimenti dei driver.
Svantaggi:
- il sistema operativo è più sensibile agli errori di programmazione del
kernel.
Altri esempi di kernel ibrido:
- BeOS kernel, Haiku kernel;
- NT kernel (Windows NT, 2000,
XP, 2003, Vista, ReactOS);
- NetWare kernel;
- Plan 9;
- DragonFly BSD.
In un kernel ibrido:
- la maggior parte del codice viene eseguita fuori dal kernel;
- quasi tutti i servizi sono eseguiti nel kernel space;
- i componenti vengono scritti e testati in modo indipendente;
- approccio “elegante” (no codice di un modulo immerso in migliaia di
righe di codice di altri moduli);
- non c’è un overhead di performance nel passaggio dei messaggi tra
kernel e user mode.
Secondo alcuni (es. Torvalds), il concetto di kernel ibrido è solo un fatto
di marketing ideato per far sembrare più “avanzato” un microkernel.
- Kernel ibrido: schema XNU
Pagina 5/14
Un microkernel è un kernel per sistemi operativi, che
nella sua forma più pura, non fornisce nessun servizio,
ma soltanto i meccanismi per implementarli, come:
- gestione a basso livello dell’address space
(intervallo discreto di indirizzi che corrispondono a
memoria
virtuale/fisica,
settori
del
disco,
periferiche...);
- gestione dei thread (capacità di un software di
dividersi in due o più tasks simultanei o quasi);
- gestione della comunicazione e dello scambio dei
dati tra processi (IPC).
Se nel microkernel esiste la distinzione tra kernel e
user mode, il microkernel è l’unica parte di sistema
che viene eseguita nel primo dei due.
I servizi (driver, protocol stacks,
funzioneranno nell’user mode.
file
systems...)
Esempi: Mach, L4, QNX.
- Microkernel: schema -
XNU
Pagina 6/14
Un kernel monolitico è un kernel inteso come
un’interfaccia virtuale di alto livello sull’hardware
sottostante, che, tramite l’uso di chiamate di sistema
(system calls), implementa i servizi necessari in
diversi moduli che “girano” in supervisor mode (è una
sorta di flag che viene assegnata al software di sistema
per differenziarlo dall’user mode).
Vantaggi:
- efficiente se viene ben ottimizzato (difficile!).
Svantaggi:
-tutti i moduli operano nello stesso spazio, per cui un
bug in uno qualsiasi di essi può bloccare l’intero
sistema;
- non puoi aggiungere un nuovo dispositivo hardware
senza aggiungere il relativo modulo al kernel (=
ricompilazione).
Esempi: Linux, BSD (solo nelle versioni open-source).
- Kernel monolitico: schema -
XNU
Pagina 7/14
kernel monolitico
microkernel
- Dal punto di vista del sistema operativo: kernel monolitico e microkernel a confronto -
Pagina 8/14
Il kernel Mach è il primo componente di XNU. Vediamolo in dettaglio.
In Mach:
- un address space corrisponde ad un task;
- un task contiene zero o più threads (of executions);
- ogni task porta con sè una quantità minima di informazioni (approccio
“policy-free”) (es. no directory corrente o environment);
- ogni task ha un certo numero di “porte” che servono da punto di partenza/
arrivo dei messaggi: il kernel Mach si occupa della sicurezza della
comunicazione, del queueing etc;
- grazie al Mach Interface Generator (“MIG”), un programmatore può far
dialogare due processi implementando semplicemente delle chiamate di
funzione, che internamente saranno convertite in messaggi Mach.
Mach si occupa:
- del preemptive multitasking e dei threads del kernel (come i threads
POSIX);
- della gestione della memoria protetta e della memoria virtuale;
- dell’inter-process communication (“IPC”);
- della gestione dell’interrupt;
- del supporto ai processi real-time e al debugging del kernel;
- della console I/O.
Mach, infine, è capace di gestire nativamente più architetture hardware
profondamente differenti tra loro, come i processori PowerPC e gli x86.
Mach
Un task (“compito”) è un
insieme di istruzioni che
vengono
caricate
in
memoria.
L’address
space
(“spazio
degli indirizzi”) è un intervallo
di indirizzi discreti, ognuno
dei quali corrisponde:
- ad un registro di memoria
fisico o virtuale;
- un network host;
- una periferica;
- un settore di un disco;
etc..
Pagina 9/14
Il multitasking è la capacità di un sistema operativo
di eseguire più programmi contemporaneamente.
Se stiamo eseguendo due processi A e B allo stesso
tempo, la CPU eseguirà per qualche instante A e poi B,
per poi tornare di nuovo ad A e via dicendo.
Il passaggio tra A e B è detto
context switch
(“passaggio di contesto”); il componente del sistema
operativo che decide quando effettuarlo si chiama
scheduler, mentre quello che lo esegue effettivamente
si chiama dispatcher.
Il preemptive multitasking (“con prelazione”) , al
contrario del cooperative multitasking, permette al
sistema operativo di interrompere un programma a
prescindere dalla volontà del programma stesso,
grazie al supporto di particolari soluzioni hardware
implementate nella CPU.
Pagina 10/14
Tempo
Processo
- Processo multithreaded -
- Monitoraggio Attività: relazioni tra processi e threads -
Pagina 11/14
Il kernel BSD è il secondo componente di XNU. Vediamolo in dettaglio.
BSD implementa:
- i processi UNIX al di sopra dei tasks di Mach;
- i segnali UNIX al di sopra delle eccezioni e dell’IPC di Mach;
- le semantiche del filesystem e il protocollo TCP/IP;
- le API POSIX, per cui risponde alle chiamate di sistema BSD.
BSD gestisce:
- l’user id;
- i permessi;
- il Virtual File System (“VFS”) e il relativo strato di journaling.
La versione 10.3 di Mac OS X (nota come “Panther”) si basa sul codebase
di FreeBSD 5.x.
La sigla BSD sta per “Berkeley Software Distribution” ed originariamente
indicava il codice sorgente sviluppato dall’Università della California,
Berkeley, della loro estensione del sistema operativo Unix di AT&T.
Il kernel BSD non presenta sostanziali differenze da quello di Linux, a parte
forse una maggiore affidabilità in alcuni settori, dovuta ad un codice più
maturo.
Sistemi operativi BSD open-source: FreeBSD, NetBSD, DragonFlyBSD.
Sistemi operativi BSD commerciali: Mac OS X, SunOS.
BSD
- Mascotte di FreeBSD -
Pagina 12/14
I/O Kit è il terzo e ultimo componente di XNU.
Vediamolo in dettaglio.
I/O Kit:
- è un framework per la scrittura di driver, progettato con un
sottoinsieme (“subset”) del linguaggio C++;
- permette la scrittura di driver con poco codice;
- permette il caricamento dinamico dei driver;
- gestisce il SMP (multiprocessore simmetrico), il multithreading e
la sicurezza;
- gestisce l’hot plug delle periferiche;
- supporta il power management;
- supporta una grande quantità di dispositivi.
La maggior parte dei driver vengono eseguiti nell’user space, in
modo tale che un bug al loro interno non possa in nessun modo
bloccare il sistema.
I/O Kit è una reimplementazione ad alte
performance del “DriverKit” del sistema
operativo NextSTEP ed è basato sulla
creazione di sotto-classi specifiche a partire
da
un
driver
generico
pre-esistente,
includendo però la sovrascrittura di alcuni
metodi.
Esempio:
Ipotizziamo di avere a disposizione all’interno
dell’I/O Kit un driver IDE/ATA generico che
permette la scrittura e la lettura dei blocchi
sul bus IDE.
Per scrivere un driver per un CD-ROM o Hard
Disk, basterà creare una sotto-classe
(“subclassing”) del driver IDE/ATA generico.
I/O Kit
Pagina 13/14
XNU: The Kernel: http://www.kernelthread.com/mac/osx/arch_xnu.html
Microkernel: http://en.wikipedia.org/wiki/Microkernel
Kernel ibrido: http://en.wikipedia.org/wiki/Hybrid_kernel
Apple Darwin: http://en.wikipedia.org/wiki/Darwin_(operating_system)
Apple Darwin (IT): http://it.wikipedia.org/wiki/Apple_Darwin
Address Space: http://en.wikipedia.org/wiki/Address_space
Thread: http://en.wikipedia.org/wiki/Thread_(computer_science)
IPC: http://en.wikipedia.org/wiki/Inter-process_communication
Monolithic Kernel: http://en.wikipedia.org/wiki/Monolithic_kernel
Kernel (IT): http://it.wikipedia.org/wiki/Kernel
Mach: http://en.wikipedia.org/wiki/Mach_(kernel)
Mac OS X kernel: http://events.ccc.de/congress/2007/Fahrplan/attachments/
986_inside_the_mac_osx_kernel.pdf
What's a "kernel panic"?: http://docs.info.apple.com/article.html?artnum=106227
Unraveling The Mac OS X Linux Kernel Myth: Part 2:
http://www.roughlydrafted.com/0506.linuxmyth2.1.html
Multitasking: http://it.wikipedia.org/wiki/Multitasking
Panoramica su BSD (IT):
http://community.gufi.org/~alex/articles/explaining-bsd/article.html
Autori:
D@nselm
[email protected]
danselm.netsons.org
eldino
[email protected]
eldino.wordpress.com
Bibliografia
e Autori
Questo lavoro è stato svolto per il corso di Sistemi Operativi (AA. 2007-2008) ed è rilasciato
sotto licenza Creative Commons Attribuzione-Non Commerciale-Condividi allo stesso modo 2.5.