Visão geral

Um bootloader é uma imagem proprietária do fornecedor responsável por trazer o kernel em um dispositivo. Ele protege o estado do dispositivo e é responsável por inicializar o Trusted Execution Environment e vincular sua raiz de confiança. O carregador de inicialização também verifica a integridade das partições de boot e recovery antes de mover a execução para o kernel e exibe avisos de estado de inicialização .

Operações de inicialização

Para iniciar a inicialização, o bootloader pode fazer o flash de uma nova imagem diretamente em uma partição apropriada ou usar a recovery para iniciar o processo de reflash usado para uma atualização over-the-air (OTA). Alguns fabricantes de dispositivos criam carregadores de inicialização com várias partes e os combinam em um único arquivo bootloader.img ; na hora do flash, o bootloader extrai e exibe todos os bootloaders individuais.

Exemplo de fluxo de bootloader:

  1. O bootloader é carregado primeiro e inicializa a memória.

  2. Se as atualizações A/B forem usadas, o carregador de inicialização determinará o slot atual para inicializar.

  3. O carregador de inicialização determina se o modo de recuperação deve ser inicializado (consulte Atualizações de suporte ).

  4. O bootloader carrega a imagem de inicialização, que contém as imagens do kernel e do ramdisk.

  5. O bootloader carrega o kernel na memória como um binário compactado auto-executável. O kernel então se descompacta e começa a ser executado na memória.

  6. O carregador de inicialização carrega o init , seja da partição ramdisk (em dispositivos mais antigos) ou da partição do sistema (em dispositivos mais recentes).

  7. A partir da partição do sistema, o init inicia e monta todas as outras partições (como vendor , oem e odm ) e então começa a executar o código para iniciar o dispositivo.

Linha de comando do kernel

Concatene a linha de comando do kernel dos seguintes locais:

  • Linha de comando do carregador de inicialização: conjunto de parâmetros estáticos e dinâmicos determinados pelo carregador de inicialização

  • Árvore de dispositivos: do nó escolhido/bootargs

  • defconfig : de CONFIG_CMDLINE

  • boot.img : de cmdline (para deslocamentos e tamanhos, consulte system/core/mkbootimg/bootimg.h

  • Um motivo de reinicialização ou desligamento canônico compatível com o Documento de Definição de Compatibilidade do Android , conforme determinado a partir do circuito integrado de gerenciamento de energia (PMIC), outros recursos de hardware e mensagens de argumentos mágicos de reinicialização ( LINUX_REBOOT_CMD_RESTART2 ). Sintaxe é:

    androidboot.bootreason=reason
    

Suporte para árvores de dispositivos e sobreposições de árvores de dispositivos

O bootloader pode suportar diferentes configurações identificando a revisão do produto/hardware do dispositivo e, em seguida, carregando o conjunto correto de sobreposições de árvore de dispositivos.

Suporte para randomização de layout de espaço de endereço do kernel

Para suportar a randomização do endereço virtual no qual a imagem do kernel é carregada (habilitada pela configuração do kernel RANDOMIZE_BASE ), o carregador de inicialização deve fornecer entropia passando um valor u64 aleatório no nó da árvore do dispositivo /chosen/kaslr-seed .

Suporte para inicialização verificada

Para obter detalhes sobre como usar o bootloader para implementar a inicialização verificada, consulte Verifying Boot .