Visão geral do carregador de inicialização

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

Exemplo de fluxo de bootloader

Aqui está um exemplo de fluxo de bootloader:

  1. Carregar e inicializar a memória.

  2. Verifique o dispositivo de acordo com o fluxo de inicialização verificada .

  3. Verifique as partições de inicialização, incluindo boot , dtbo , init_boot e recovery , de acordo com o fluxo de inicialização verificada. Como parte desta etapa, verifique a versão do cabeçalho da imagem de inicialização e analise o cabeçalho de acordo.

  4. Se forem usadas atualizações A/B , determine o slot atual para inicializar.

  5. Determine se o modo de recuperação deve ser inicializado. Para obter mais informações, consulte Suporte a atualizações OTA .

  6. Carregue as imagens de inicialização, como boot.img , vendor_boot.img , init_boot.img e outras imagens de inicialização proprietárias do fornecedor. Essas imagens de inicialização contêm as imagens do kernel e do ramdisk.

    1. Carregue o kernel na memória como um binário compactado autoexecutável. O kernel se descompacta e começa a executar na memória.

    2. Carregue ramdisks e a seção bootconfig na memória para criar initramfs .

Recursos adicionais relacionados ao bootloader

A seguir está uma lista de recursos adicionais relacionados ao bootloader que você pode implementar:

  • Sobreposição da árvore de dispositivos (DTO). Uma sobreposição de árvore de dispositivos permite que o bootloader suporte diferentes configurações de hardware. Um DTO é compilado em um blob de árvore de dispositivo (DTB) que é usado pelo bootloader.

  • Randomização do endereço virtual da imagem do kernel. O bootloader suporta randomizar o endereço virtual no qual a imagem do kernel é carregada. Para randomizar o endereço, defina RANDOMIZE_BASE como true na configuração do kernel. O bootloader deve fornecer entropia passando um valor u64 aleatório no nó da árvore do dispositivo /chosen/kaslr-seed .

  • Inicialização verificada. A inicialização verificada permite que o carregador de inicialização garanta que todo o código executado venha de uma fonte confiável.

  • Configuração de inicialização. A configuração de inicialização está disponível no Android 12 e superior e é um mecanismo para passar detalhes de configuração da compilação e do carregador de inicialização para o sistema operacional. Antes do Android 12, os parâmetros de linha de comando do kernel com o prefixo androidboot são usados.

  • Atualizações over-the-air (OTA). Dispositivos Android no campo podem receber e instalar atualizações OTA para o sistema, software de aplicativo e regras de fuso horário. Esse recurso tem implicações na implementação do gerenciador de inicialização. Para obter informações gerais sobre OTA, consulte Atualizações OTA . Para obter detalhes de implementação OTA específicos do bootloader, consulte Suporte a atualizações OTA .

  • Ligação de versão . A ligação de versão vincula as chaves de segurança ao sistema operacional e à versão de nível de patch. A ligação de versão garante que um invasor que descubra um ponto fraco em uma versão antiga do sistema ou no software TEE não possa reverter um dispositivo para a versão vulnerável e usar chaves criadas com a versão mais recente. O bootloader deve fornecer certas informações para suportar a ligação da versão. Para obter mais informações, consulte Informações sobre a versão nas propriedades do AVB .

Linha de comando do kernel

Concatene a linha de comando do kernel dos seguintes locais:

  • Linha de comando do bootloader: conjunto de parâmetros estáticos e dinâmicos determinados pelo bootloader

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

  • defconfig : de CONFIG_CMDLINE

  • boot.img : na linha de comando (para compensações e tamanho, consulte system/core/mkbootimg/bootimg.h

A partir do Android 12, para os parâmetros androidboot.* que precisamos passar para o espaço de usuário do Android, podemos usar bootconfig em vez da linha de comando do kernel.