Visão geral do carregador de inicialização

Um bootloader é uma imagem exclusiva do fornecedor responsável por exibir o kernel em um dispositivo. O carregador de inicialização protege o estado do dispositivo e é responsável por inicializar o ambiente de execução confiável (TEE) e vincular a raiz de confiança. O carregador de inicialização também verifica a integridade das partições boot e recovery antes de mover a execução para o kernel.

Exemplo de fluxo do carregador de inicialização

Confira um exemplo de fluxo do carregador de inicialização:

  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 com isso.

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

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

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

    1. Carregar o kernel na memória como um binário comprimido auto-executável. O kernel se descompacta e começa a ser executado na memória.

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

Outros recursos relacionados ao carregador de inicialização

Confira a seguir uma lista de outros recursos relacionados ao carregador de inicialização que você pode implementar:

  • Sobreposição da árvore de dispositivos (DTO). Uma sobreposição de árvore de dispositivos permite que o carregador de inicialização ofereça suporte a diferentes configurações de hardware. Um DTO é compilado em um blob de árvore de dispositivos (DTB, na sigla em inglês), que é usado pelo carregador de inicialização.

  • Randomização de endereços virtuais de imagens do kernel. O carregador de inicialização oferece suporte à geração aleatória do endereço virtual em que a imagem do kernel é carregada. Para gerar o endereço aleatoriamente, defina RANDOMIZE_BASE como true na configuração do kernel. O carregador de inicialização precisa fornecer entropia transmitindo um valor u64 aleatório no nó da árvore de dispositivos /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 versões mais recentes e é um mecanismo para transmitir detalhes de configuração do build 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 eram usados.

  • Atualizações over-the-air (OTA). Os dispositivos Android em uso podem receber e instalar atualizações OTA no sistema, no software do app e nas regras de fuso horário. Esse recurso tem implicações na implementação do carregador de inicialização. Para informações gerais sobre OTA, consulte Atualizações OTA. Para conferir detalhes sobre a implementação de OTA específica do carregador de inicialização, consulte Suporte a atualizações OTA.

  • Vinculação de versão. A vinculação de versão vincula chaves de segurança ao sistema operacional e à versão do nível do patch. A vinculação de versão garante que um invasor que descubra uma vulnerabilidade em uma versão antiga do sistema ou do software do TEE não possa retornar um dispositivo à versão vulnerável e usar chaves criadas com a versão mais recente. O carregador de inicialização precisa fornecer determinadas informações para oferecer suporte à vinculação de versão. Para mais informações, consulte Informações de versão em propriedades AVB.

Linha de comando do kernel

Concatenar 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ó chosen/bootargs

  • defconfig: de CONFIG_CMDLINE

  • boot.img: na linha de comando (para deslocamentos e tamanhos, consulte system/core/mkbootimg/bootimg.h).

No Android 12 e versões mais recentes, para parâmetros androidboot.* que precisamos transmitir ao espaço do usuário do Android, podemos usar bootconfig em vez da linha de comando do kernel.