As implementações do Android podem incluir uma imagem de blob da árvore de dispositivos (DTB) para uso pelo bootloader. O local da imagem DTB (e as opções para especificar parâmetros de imagem DTB) varia entre as versões do Android.
No Android 11, os dispositivos que usam a Imagem genérica do kernel (GKI) 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 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 DTB, consulte Incluir a imagem DTB na imagem de inicialização.
No Android 9 e versões anteriores, a imagem DTB pode existir em uma partição própria ou ser anexada ao kernel
image.gz
para criar a imagem kernel + DTB (que é transmitida paramkbootimg
para criarboot.img
).
Formato de imagem DTB
No Android 10 e versões mais recentes, a imagem DTB precisa usar um dos seguintes formatos:
Blobs de DT concatenados um após o outro. O carregador de inicialização usa o campo
totalsize
em cada cabeçalho 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 struct
dt_table_entry
(contém camposid
,rev
ecustom
) que pode conter informações de identificação de hardware para a entrada. Para mais detalhes, consulte Partições DTB/DTBO.
Inclua a imagem DTB na imagem de inicialização.
Os dispositivos com Android 10 podem incluir a imagem DTB na imagem de inicialização. Isso elimina a necessidade de o Android oferecer suporte a scripts que anexem
a imagem DTB a image.gz
no kernel e permite o uso do teste Vendor Test
Suite (VTS) 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 em uma partição separada para evitar problemas causados por OTAs interrompidas. Durante uma OTA, se um problema ocorrer depois que a partição DTB for 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 Android 10 podem incluir uma imagem DTB usando a seguinte estrutura de imagem de inicialização.
Seção de imagem de inicialização | Número de páginas |
---|---|
Cabeçalho de inicialização (1 página) | 1 |
Kernel (l páginas) | 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 segundo estágio (n páginas) | n = (second_size + page_size -
1) / page_size |
DTBO de recuperação (o pages) | o = (recovery_dtbo_size + page_size -
1) / page_size |
DTB (páginas p) | p = (dtb_size + page_size -
1) / page_size |
Caminho da imagem DTB
Para dispositivos com Android 10, use a ferramenta
mkbootimg.py
e os seguintes argumentos para especificar o caminho da imagem
DTB.
Argumento | Descrição |
---|---|
dtb |
Caminho para a imagem DTB a 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 da imagem 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
vai 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 BOARD_MKBOOTIMG_ARGS
board
config 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 ao carregador de inicialização
Para que o VTS seja executado corretamente em dispositivos com 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) selecionada. Só é possível especificar um (1) índice. Por exemplo, o parâmetro androidboot.dtb_idx=N
informa N
como o índice de base zero da árvore de dispositivos selecionada pelo carregador de inicialização no conjunto de DTBs presentes na imagem de inicialização.