Un bootloader è un'immagine di proprietà del fornitore responsabile dell'avvio del kernel su un dispositivo. Il bootloader protegge lo stato del dispositivo ed è responsabile dell'inizializzazione del Trusted Execution Environment (TEE) e del binding della relativa radice di attendibilità. Il bootloader verifica anche l'integrità delle partizioni boot
e recovery
prima di trasferire l'esecuzione al kernel.
Esempio di flusso del bootloader
Ecco un esempio di flusso del bootloader:
Carica e inizializza la memoria.
Verifica il dispositivo in base alla procedura di Avvio verificato.
Verifica le partizioni di avvio, tra cui
boot
,dtbo
,init_boot
erecovery
, in base al flusso di Avvio verificato. Nell'ambito di questo passaggio, controlla la versione dell'intestazione dell'immagine di avvio e analizza l'intestazione di conseguenza.Se vengono utilizzati gli aggiornamenti A/B, determina lo slot corrente da avviare.
Determina se deve essere avviata la modalità di recupero. Per ulteriori informazioni, consulta la pagina Supportare gli aggiornamenti OTA.
Carica le immagini di avvio, ad esempio
boot.img
,vendor_boot.img
,init_boot.img
e altre immagini di avvio proprietarie del fornitore. Queste immagini di avvio contengono le immagini del kernel e del ramdisk.Carica il kernel in memoria come file binario compresso eseguibile autonomamente. Il kernel si decomprime automaticamente e inizia l'esecuzione nella memoria.
Carica le ramdisk e la sezione bootconfig nella memoria per creare
initramfs
.
Funzionalità aggiuntive relative al bootloader
Di seguito è riportato un elenco di ulteriori funzionalità relative al bootloader che puoi implementare:
Overlay ad albero dei dispositivi (DTO). Un overlay dell'albero del dispositivo consente al bootloader di supportare configurazioni hardware diverse. Un DTO viene compilato in un blob di albero del dispositivo (DTB) utilizzato dal bootloader.
Ransomizzazione dell'indirizzo virtuale dell'immagine del kernel. Il bootloader supporta la randomizzazione dell'indirizzo virtuale in cui viene caricata l'immagine del kernel. Per randomizzare l'indirizzo, imposta
RANDOMIZE_BASE
sutrue
nella configurazione del kernel. Il bootloader deve fornire entropia passando un valore u64 casuale nel nodo ad albero dei dispositivi/chosen/kaslr-seed
.Avvio verificato. L'Avvio verificato consente al bootloader di verificare che tutto il codice eseguito provenga da una fonte attendibile.
Configurazione di avvio Boot config è disponibile in Android 12 e versioni successive ed è un meccanismo per trasmettere i dettagli di configurazione dalla build e dal bootloader al sistema operativo. Prima di Android 12, vengono utilizzati i parametri della riga di comando del kernel con il prefisso
androidboot
.Aggiornamenti over-the-air (OTA). I dispositivi Android sul campo possono ricevere e installare aggiornamenti OTA del sistema, del software delle app e delle regole relative al fuso orario. Questa funzionalità ha implicazioni sull'implementazione del bootloader. Per informazioni generali sull'OTA, consulta Aggiornamenti OTA. Per i dettagli sull'implementazione di OTA specifici per il bootloader, consulta Supporto degli aggiornamenti OTA.
Associazione alla versione. Il collegamento delle versioni associa le chiavi di sicurezza al sistema operativo e alla versione del livello di patch. Il vincolo della versione garantisce che un malintenzionato che scopre una vulnerabilità in una versione precedente del sistema o del software TEE non possa eseguire il rollback di un dispositivo alla versione vulnerabile e utilizzare le chiavi create con la versione più recente. Il bootloader deve fornire determinate informazioni per supportare il binding delle versioni. Per ulteriori informazioni, consulta Informazioni sulla versione nelle proprietà AVB.
Riga di comando kernel
Concatena la riga di comando del kernel dalle seguenti posizioni:
Riga di comando del bootloader: insieme di parametri statici e dinamici determinati dal bootloader
Struttura dei dispositivi: dal nodo
chosen/bootargs
defconfig
: daCONFIG_CMDLINE
boot.img
: dalla riga di comando (per gli offset e le dimensioni, consultasystem/core/mkbootimg/bootimg.h
A partire da Android 12, per i parametri androidboot.*
che dobbiamo passare allo spazio utente di Android, possiamo utilizzare bootconfig anziché la riga di comando del kernel.