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.