Bentornati! In questa parte – più avanzata – della rubrica, abbandoniamo per un attimo l’architettura di macOS e iOS, dopo aver parlato di XNU, per concentrarci maggiormente sulle tecnologie utilizzate.
Prefazione
In virtù del fatto di essere un sistema che deriva da BSD, macOS ne eredita la maggior parte delle funzionalità,come le chiamate di sistema POSIX, alcune estensioni BSD e il livello MAC di BSD.
Premesso ciò, è comunque sbagliato classificare macOS o iOS come “dei sistemi BSD” alla pari di FreeBSD o similari. E’ vero che i sistemi Apple sono basati su diversi costrutti elaborati dalla primitiva BSD (ricordo in primo luogo il meccanismo della sandbox per la sicurezza delle app) ma, macOS e iOS migliorano o, in alcuni casi, sostituiscono completamente i componenti BSD.
Ad esempio, i file presenti in /etc, tradizionalmente utilizzati per la configurazione del sistema, vengono completamente sostituiti. Il meccanismo syslog Unix standard viene potenziato dal registro di sistema Apple. Le nuove tecnologie come Apple Events e FSEvents sono totalmente proprietarie.
Discuteremo quindi di queste funzionalità, delle API ispirate a BSD e infine rivolgeremo l’attenzione a quelle di Apple. Discuteremo queste API dal punto di vista dell’utente (usermode) con esempi dettagliati ed esperimenti per capirne l’effettiva l’utilità.
Il richiamo BSD: sysctl, kqueues, BSM
Come abbiamo già ripetuto tante volte, il nucleo di XNU è innegabilmente Mach mentre la sua interfaccia principale modalità utente è quella di BSD. In alcuni comparti, Apple ha anche implementato funzionalità aggiuntive, alcune delle quali sono stati riportate indietro su BSD e OpenDarwin.
Il comando sysctl è un modo standard per accedere allo stato interno del kernel; utilizzando questo comando, un amministratore può eseguire direttamente delle query sul valore di determinate variabili del kernel, operazione che fornisce importanti informazioni di diagnostica in fase di esecuzione. In alcuni casi, è possibile addirittura modificare il valore delle variabili, alterando in tal modo il comportamento del kernel.
Il comando sysctl wrappa la chiamata alla libreria sysctl, che a sua volta wrappa la syscall __sysctl. Abbiamo visto il significato del termine wrappare in un precedente articolo. A questo punto, le variabili che è possibile esportare sono identificabili tramite il MIB (Management Information Base) che sostanzialmente raggruppa e classifica le variabili in base ad un certo namespace, come possiamo vedere.
Come mostrato in tabella, ad un namespace è associato un numero intero: questo significa che le variabili associate ad un namespace possono essere rappresentate come un array di numeri interi! E’ la libreria sysctlnametomib che si occupa di effettuare la traduzione della rappresentazione da testuale ad intero. Questo metodo è usato poco, poiché esiste sysctlby-name che viene usato per cercare direttamente una variabile con il suo nome.
La kqueues è un meccanismo per notificare gli eventi del kernel. In pratica è un metodo che blocca le operazioni fino a quando non si verifica un certo evento: un processo in usermode può quindi attendere, attendere e ancora attendere, fornendo un metodo semplice ma efficace per la sincronizzazione di uno o più processi.
La kqueues, associata con la kevents forma la base per l’I/O asincrono nel kernel; una kqueue può essere ‘costruita’ in usermode semplicemente effettuando la syscall kqueue, senza argomenti. A questo punto, gli eventi di interesse possono essere specificati utilizzando la macro EV_SET, che inizializza una struct di tipo kevent. Per finire quindi, eseguendo la syscall kevent imposteremo i filtri sugli eventi che abbiamo deciso di ‘tenere d’occhio’, che ritorneranno quando sono soddisfatti.
macOS contiene un’implementazione del Basic Security Module (BSM). Questo sistema di controllo è nato in Solaris, ma da allora è stato introdotto in numerose implementazioni Unix, tra cui macOS. Questo sistema è utile per tracciare le azioni dell’utente e dei processi, anche se può risultare costoso in termini di spazio su disco e di prestazioni generali. È quindi utile in macOS, ma meno in un sistema mobile come iOS, motivo per cui in quest’ultimo non è abilitato.
Le operazioni sensibili, sopratutto quelle che riguardano la sicurezza, devono essere eseguite a livello kernel. In BSD e in generale nei sistemi Unix la componente di controllo del kernel con lo userspace tramite uno pseudo-dispositivo speciale, come ad esempio/dev/audit. In macOS, tuttavia, questo controllo che parte dal XNU, viene implementato attraverso l’uso di messaggi Mach.
Anche per questo articolo è tutto. Per eventuali domande, curiosità o feedback potete lasciare un commento qui in basso, a presto!