Panoramica del bootloader

Un bootloader è un'immagine proprietaria 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 collegamento della sua radice di attendibilità. Il bootloader verifica anche l'integrità delle partizioni boot e recovery prima di spostare l'esecuzione sul kernel.

Esempio di flusso del bootloader

Ecco un esempio di flusso del bootloader:

  1. Carica e inizializza la memoria.

  2. Verificare il dispositivo in base al flusso di avvio verificato .

  3. Verificare le partizioni di avvio, inclusi boot , dtbo , init_boot e recovery , secondo il flusso di avvio verificato. Come parte di questo passaggio, controlla la versione dell'intestazione dell'immagine di avvio e analizza l'intestazione di conseguenza.

  4. Se vengono utilizzati gli aggiornamenti A/B , determinare lo slot corrente da avviare.

  5. Determina se avviare la modalità di ripristino. Per ulteriori informazioni, consulta Supporto degli aggiornamenti OTA .

  6. Caricare le immagini di avvio, come boot.img , vendor_boot.img , init_boot.img e altre immagini di avvio del fornitore proprietario. Queste immagini di avvio contengono le immagini del kernel e del ramdisk.

    1. Carica il kernel in memoria come binario compresso autoeseguibile. Il kernel si decomprime e inizia l'esecuzione in memoria.

    2. Caricare ramdisk e la sezione bootconfig in memoria per creare initramfs .

Funzionalità aggiuntive relative al bootloader

Di seguito è riportato un elenco di funzionalità aggiuntive relative al bootloader che è possibile implementare:

  • Sovrapposizione dell'albero dei dispositivi (DTO). Una sovrapposizione dell'albero dei dispositivi consente al bootloader di supportare diverse configurazioni hardware. Un DTO viene compilato in un blob dell'albero dei dispositivi (DTB) utilizzato dal bootloader.

  • Randomizzazione 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 su true nella configurazione del kernel. Il bootloader deve fornire entropia passando un valore u64 casuale nel nodo dell'albero del dispositivo /chosen/kaslr-seed .

  • Avvio verificato. L'avvio verificato consente al bootloader di garantire che tutto il codice eseguito provenga da una fonte attendibile.

  • Configurazione di avvio. La configurazione di avvio è disponibile in Android 12 e versioni successive ed è un meccanismo per trasferire i dettagli di configurazione dalla build e dal bootloader al sistema operativo. Prima di Android 12, venivano utilizzati i parametri della riga di comando del kernel con il prefisso androidboot .

  • Aggiornamenti via etere (OTA). I dispositivi Android sul campo possono ricevere e installare aggiornamenti OTA al sistema, al software dell'app e alle regole del fuso orario. Questa funzionalità ha implicazioni sull'implementazione del bootloader. Per informazioni generali sull'OTA, vedere Aggiornamenti OTA . Per i dettagli sull'implementazione OTA specifici del bootloader, consulta Supporto degli aggiornamenti OTA .

  • Rilegatura della versione . L'associazione della versione vincola le chiavi di sicurezza al sistema operativo e alla versione a livello di patch. L'associazione della versione garantisce che un utente malintenzionato che scopre un punto debole in una vecchia versione del sistema o nel software TEE non possa ripristinare un dispositivo alla versione vulnerabile e utilizzare le chiavi create con la versione più recente. Il bootloader deve fornire determinate informazioni per supportare l'associazione della versione. Per ulteriori informazioni, vedere Informazioni sulla versione nelle proprietà AVB .

Riga di comando del 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

  • Albero dei dispositivi: dal nodo chosen/bootargs

  • defconfig : da CONFIG_CMDLINE

  • boot.img : dalla riga di comando (per offset e dimensioni, fare riferimento a system/core/mkbootimg/bootimg.h

A partire da Android 12, per i parametri androidboot.* che dobbiamo passare allo spazio utente di Android, possiamo utilizzare bootconfig invece della riga di comando del kernel.