Um carregador de inicialização é uma imagem proprietária do fornecedor responsável por abrir 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
Veja um exemplo de fluxo do carregador de inicialização:
Carregar e inicializar 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 de Inicialização verificada. Como parte desta etapa, verifique a versão do cabeçalho da imagem de inicialização e analise-o adequadamente.Se as atualizações A/B forem usadas, determine o slot atual para inicialização.
Determine se o modo de recuperação precisa ser inicializado. Para mais informações, consulte Suporte a atualizações OTA.
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.Carregar o kernel na memória como um binário compactado autoexecutável. O kernel é descompactado 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). 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.
Ordem aleatória de endereços virtuais da imagem 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
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. Em versões anteriores ao Android 12, os parâmetros de linha de comando do kernel com o prefixo de
androidboot
são usados.Atualizações over-the-air (OTA). Os dispositivos Android em campo 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 da implementação 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
: deCONFIG_CMDLINE
boot.img
: na linha de comando (para deslocamentos e tamanhos, consultesystem/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.