Perché la modalità di avvio sicuro di Mac sarebbe più lenta dell’avvio standard?

Nel normale processo di avvio al primo avvio di Mac OS X (o macOS, ora) o iOS, il boot loader carica il kernel, e poi carica un certo numero di KEXT.

Questi KEXT sono un insieme di estensioni del kernel, che consistono principalmente in driver e altro codice che implementa le classi IOKit e le estensioni del kernel, comprese le estensioni usate per la firma del codice, il KEXT DontStealMacOS che verifica che la piattaforma su cui viene eseguito sia un "Genuine Macintosh" (hardware prodotto da Apple), e così via.

Come parte di questo processo di avvio iniziale, viene creata un'immagine del kernel con tutte le estensioni che sondano true come presenti, e tutte le estensioni che sondano false come non presenti.

Per esempio, poiché lo stesso kernel può girare su diverse piattaforme Apple con diversi set di driver per diversi hardware.

Non ha senso caricare un driver UHCI o EHCI per USB, se l'hardware supporta solo l'XHCI avanzato; allo stesso modo non ha senso caricare il driver nVidia per un particolare MacBook Pro, se l'hardware attuale non ha quel chip perché è un MacBook Air.

Un altro componente è il supporto diretto della scheda madre per lo stepping della CPU, le velocità di clock della RAM supportate, il chipset di supporto (Haswell, ecc.), e così via; quel particolare codice vive nel PE o PlatformExpert, che è unico per ogni SKU della piattaforma hardware del computer Apple.

Quindi alla fine, ci sono molti componenti opzionali che vengono caricati, ma un sacco di altri che non vengono caricati.

Ma deve provare ognuno di essi per vedere se si adatta.

Dopo che tutto è stato impostato, una delle prime cose che accade dopo l'avvio è che viene creata una versione post-linked del kernel con tutti i KEXT che sono caricati per quella piattaforma.

Questo è conosciuto come "kextcache" - che ha lo stesso nome del programma che viene eseguito per generare l'immagine.

Dopo di che, il computer, quando si avvia, carica direttamente la kextcache, e si avvia in modo fantasticamente veloce (in realtà, si potrebbe fare più velocemente ordinando le pagine delle immagini nell'ordine in cui saranno richieste, e iniziare immediatamente ad eseguire il codice; kextcache non lo fa).

Quando si avvia in "Modalità provvisoria", quello che succede è che i driver opzionali (non strettamente necessari, e non di terze parti) non vengono caricati - ma salta la kextcache - che teme possa essere corrotta, perché si avvia in "Modalità provvisoria" per una ragione.

Così deve andare a caricare mach_kernel, e poi deve caricare i KEXT potenzialmente necessari.

Il che significa che deve rifare tutti i passaggi, il che è sostanzialmente più lento del caricamento della kextcache.

Le persone generalmente non notano questo al primo avvio, perché mentre il sistema si avvia la prima volta, fa la "Happy First Time Boot Greeting Dance™", che è abbastanza distraente da nascondere il ritardo di avvio all'osservazione dell'utente.

Praticamente, parte del lavoro viene fatto in fabbrica durante la finalizzazione dell'avvio come parte del burn-in, ma di solito c'è un'installazione tardiva in modo che i nuovi computer Apple arrivino con la versione più recente del sistema operativo (nel qual caso, quando l'utente lo avvia, farà la creazione della kextcache).

Per iOS e altri dispositivi che non sono Mac OS X/macOS, la kextcache è pre-generata, e inclusa come parte dell'immagine di sistema ("No User Serviceable Parts Inside™"), poiché la configurazione hardware non cambierà, e il fattore non farà un'installazione late-binding del nuovo OS.

Per questi dispositivi, è anche consuetudine disabilitare certe interfacce del kernel che sono usate per caricare o scaricare moduli, collegare moduli al kernel, e così via, per evitare che siano facilmente violabili.

Nota che poiché le API interne ed esposte sono le stesse, è possibile hackerare la tabella sysent[] su un dispositivo iOS come parte del jailbreak per riattivarle, se sei uno sviluppatore del kernel molto esperto, e hai accesso a un exploit di memoria del kernel che non comporta l'accesso alla prima porta Mach per lo spazio di indirizzi virtuale del kernel.

In ogni caso, la risposta molto breve è:

Quando si avvia in "Modalità provvisoria", si caricano i componenti del kernel individualmente, e si testano molti componenti non necessari per la vostra particolare piattaforma e successivamente li si scarica, invece di usare l'immagine kextcache preottimizzata.