As implementações do Android podem incluir uma imagem de blob da árvore de dispositivos (DTB, na sigla em inglês) para uso pelo carregador de inicialização. O local da imagem DTB (e as opções para especificar os parâmetros da imagem DTB) variam entre as versões do Android.
No Android 11, os dispositivos que usam a imagem genérica do kernel (GKI, na sigla em inglês) precisam oferecer suporte à partição de inicialização do fornecedor, que inclui todas as informações específicas do fornecedor que foram realocadas da partição de inicialização. Como a imagem DTB contém dados específicos do fornecedor, ela agora faz parte da partição de inicialização do fornecedor. Para especificar parâmetros de imagem do DTB, consulte Cabeçalho de inicialização do fornecedor.
No Android 10, os dispositivos podem incluir a imagem DTB na partição de inicialização. Para especificar parâmetros de imagem da DTB, consulte Como incluir a imagem da DTB na imagem de inicialização.
No Android 9 e versões anteriores, a imagem DTB pode existir na própria partição ou ser anexada ao
image.gz
do kernel para criar o kernel + imagem DTB, que é transmitida paramkbootimg
para criarboot.img
.
Formato de imagem DTB
No Android 10 e versões mais recentes, a imagem do DTB precisa usar um destes formatos:
Blobs de DT concatenados um após o outro. O carregador de inicialização usa o campo
totalsize
em cada cabeçalho do FDT para ler e analisar o blob correspondente.Partições DTB/DTBO. O carregador de inicialização tem uma maneira eficiente de selecionar o blob DT correto examinando a estrutura
dt_table_entry
(que contém os camposid
,rev
ecustom
) que podem conter informações de identificação de hardware para a entrada. Para mais detalhes, consulte Partições DTB/DTBO.
Incluir a imagem DTB na imagem de inicialização
Dispositivos com o Android 10 podem incluir a imagem DTB na
imagem de inicialização. Isso elimina a necessidade de o Android oferecer suporte a scripts que anexam
a imagem DTB a image.gz
no kernel e permite o uso do teste Conjunto de teste
de fornecedor (VTS, na sigla em inglês) para verificar (e padronizar) o posicionamento
do DTB.
Além disso, para dispositivos não A/B, é mais seguro ter o DTB como parte da imagem de recuperação em vez de uma partição separada para evitar problemas causados por OTAs interrompidos. Durante uma OTA, se um problema ocorrer após a partição DTB ser atualizada (mas antes de concluir a atualização completa), o dispositivo tentará inicializar no modo de recuperação para concluir a OTA. No entanto, como a partição DTB já foi atualizada, pode ocorrer uma incompatibilidade com a imagem de recuperação (que ainda não foi atualizada). Ter a imagem DTB como parte do formato da imagem de inicialização evita esses problemas, tornando a imagem de recuperação autossuficiente, ou seja, ela não depende de outra partição.
Estrutura da imagem de inicialização
Os dispositivos com o Android 10 podem incluir uma imagem DTB usando a estrutura de imagem de inicialização abaixo.
Seção de imagem de inicialização | Número de páginas |
---|---|
Cabeçalho de inicialização (1 página) | 1 |
Kernel (páginas L) | l = (kernel_size + page_size -
1) / page_size |
Ramdisk (páginas m) | m = (ramdisk_size + page_size -
1) / page_size |
Carregador de inicialização de segunda fase (n páginas) | n = (second_size + page_size -
1) / page_size |
DTBO de recuperação (páginas o) | o = (recovery_dtbo_size + page_size -
1) / page_size |
DTB (páginas p) | p = (dtb_size + page_size -
1) / page_size |
Caminho da imagem do DTB
Para dispositivos com o Android 10, use a
ferramenta mkbootimg.py
e os seguintes argumentos para especificar o caminho para a imagem
DTB.
Argumento | Descrição |
---|---|
dtb |
Caminho para a imagem DTB que será incluída nas imagens de inicialização/recuperação. |
dtb_offset |
Quando adicionado ao argumento base , fornece o endereço de carga
física para a árvore de dispositivos final. Por exemplo, se o argumento base
for 0x10000000 e o argumento dtb_offset
for 0x01000000 , o dtb_addr_field no cabeçalho da imagem de inicialização
será preenchido como 0x11000000 . |
A variável de configuração da placa BOARD_PREBUILT_DTBIMAGE_DIR
precisa ser usada para especificar
o caminho para a imagem do DTB. Se mais de um arquivo com a extensão *.dtb
estiver
presente no diretório BOARD_PREBUILT_DTBIMAGE_DIR
, o sistema de build do Android
concatenará os arquivos para criar a imagem DTB final usada na criação da imagem
de inicialização.
Para transmitir o argumento dtb
para mkbootimg.py
com a imagem DTB do
diretório especificado por BOARD_PREBUILT_DTBIMAGE_DIR
, a variável de configuração da placa
BOARD_INCLUDE_DTB_IN_BOOTIMG
precisa ser definida como true
. Exemplo:
BOARD_INCLUDE_DTB_IN_BOOTIMG := true
É possível anexar o argumento dtb_offset
à variável de configuração
do dispositivo BOARD_MKBOOTIMG_ARGS
com os outros deslocamentos e a versão do cabeçalho. Exemplo:
BOARD_MKBOOTIMG_ARGS := --ramdisk_offset $(BOARD_RAMDISK_OFFSET) --dtb_offset $(BOARD_DTB_OFFSET) --tags_offset $(BOARD_KERNEL_TAGS_OFFSET) --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
Suporte a carregador de inicialização
Para que o VTS seja executado com sucesso em dispositivos com o Android
10, o carregador de inicialização precisa oferecer suporte à imagem de inicialização atualizada
e adicionar o parâmetro de linha de comando do kernel androidboot.dtb_idx
para indicar
o índice da árvore de dispositivos (DT, na sigla em inglês) selecionada. É possível especificar apenas um (1)
índice. Por exemplo, o parâmetro androidboot.dtb_idx=N
informa N
como o
índice baseado em zero da árvore de dispositivos selecionada pelo carregador de inicialização do conjunto de
DTBs presentes na imagem de inicialização.