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 boot
e recovery
antes de mover a execução para o kernel.
Exemplo de fluxo do bootloader
Aqui está um exemplo de fluxo do bootloader:
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 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 adequadamente.Se atualizações A/B forem usadas, determine o slot atual para inicializar.
Determine se o modo de recuperação deve ser inicializado. Para obter mais informações, consulte Suporte a atualizações OTA .
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.Carregue o kernel na memória como um binário compactado auto-executá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
.
Recursos adicionais relacionados ao bootloader
A seguir está uma lista de recursos adicionais relacionados ao bootloader que você pode implementar:
Sobreposição de á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 dispositivos (DTB) que é usado pelo bootloader.
Randomização de endereço virtual da imagem do kernel. O bootloader suporta a randomização do endereço virtual no qual a imagem do kernel é carregada. Para randomizar o endereço, defina
RANDOMIZE_BASE
comotrue
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 bootloader 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 posteriores e é um mecanismo para passar detalhes de configuração do build e do carregador de inicialização para o sistema operacional. Antes do Android 12, eram usados parâmetros de linha de comando do kernel com o prefixo
androidboot
.Atualizações over-the-air (OTA). Os dispositivos Android em campo podem receber e instalar atualizações OTA no sistema, software de aplicativo e regras de fuso horário. Este recurso tem implicações na implementação do seu bootloader. 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 .
Vinculação de versão . A vinculação de versão vincula chaves de segurança ao sistema operacional e à versão em nível de patch. A vinculaçã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 vinculação de versão. Para obter mais informações, consulte Informações de versão nas propriedades do AVB .
Linha de comando do kernel
Concatene a linha de comando do kernel nos 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
: deCONFIG_CMDLINE
boot.img
: na linha de comando (para deslocamentos e tamanhos, consultesystem/core/mkbootimg/bootimg.h
A partir do Android 12, para os parâmetros androidboot.*
que precisamos passar para o espaço do usuário do Android, podemos usar bootconfig em vez da linha de comando do kernel.