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 parâmetros de imagem DTB) difere 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, agora ela 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 da 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 ocorrer um problema após a atualização da partição de DTB (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 de 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 (o páginas) | o = (recovery_dtbo_size + page_size -
1) / page_size |
DTB (p páginas) | p = (dtb_size + page_size -
1) / page_size |
Caminho da imagem de 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 de 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 da placa
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. 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 do conjunto de
DTBs presente na imagem de inicialização.