Um bootloader é uma imagem proprietária do fornecedor responsável por iniciar 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 dele. 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:
Carregue e inicialize a memória.
Verifique o dispositivo de acordo com o fluxo de inicialização verificada.
Verifique as partições de inicialização, incluindo
boot
,dtbo
,init_boot
erecovery
, de acordo com o fluxo da Inicialização verificada. Como parte dessa etapa, verifique a versão do cabeçalho da imagem de inicialização e analise o cabeçalho de acordo com ela.Se atualizações A/B forem usadas, determine o slot atual para inicialização.
Determina se o modo de recuperação deve ser inicializado. Para mais informações, consulte Suporte para atualizações OTA.
Carregue as imagens de inicialização, como
boot.img
,vendor_boot.img
,init_boot.img
e outras imagens de inicialização de fornecedores proprietários. Essas imagens de inicialização contêm as imagens do kernel e do ramdisk.Carregue o kernel na memória como um binário compactado autoexecutável. O kernel se descompacta e começa a ser executado na memória.
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, na sigla em inglês). Uma sobreposição da á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 da árvore de dispositivos (DTB), que é usado pelo carregador de inicialização.
Randomização de endereço virtual da imagem do kernel. O carregador de inicialização é compatível com a aleatorização do endereço virtual em que a imagem do kernel é carregada. Para randomizar o endereço, defina
RANDOMIZE_BASE
comotrue
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, eram usados parâmetros da linha de comando do kernel com o prefixo
androidboot
.Atualizações over-the-air (OTA). Os dispositivos Android em uso podem receber e instalar atualizações OTA no sistema, softwares de app e 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 detalhes específicos da implementação de OTA 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 de patch. A vinculação de versão garante que um invasor que descobre uma falha em uma versão antiga do sistema ou do 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 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
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ó
chosen/bootargs
defconfig
: deCONFIG_CMDLINE
boot.img
: na linha de comando (para offsets e tamanhos, consultesystem/core/mkbootimg/bootimg.h
No Android 12, 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.