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 de 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 Como incluir a imagem 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 kernel
image.gz
para criar o kernel + DTB, que é transmitido 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 da 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 de DTB/DTBO. O carregador de inicialização tem uma maneira eficiente de selecionar o blob de DT correto examinando a estrutura
dt_table_entry
(contém os camposid
,rev
ecustom
) que pode conter informações de identificação de hardware para a entrada. Para 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 de DTB a image.gz
no kernel e permite o uso do teste do conjunto de testes de
fornecedor (VTS, na sigla em inglês) para verificar (e padronizar) o posicionamento
de DTB.
Além disso, para dispositivos não A/B, é mais seguro ter o DTB como parte da imagem de recuperação do que em uma partição separada para evitar problemas causados por OTAs interrompidas. 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 de imagem de inicialização evita esses problemas, fazendo com que a imagem de recuperação seja autossuficiente (ou seja, não depende de outra partição).
Estrutura da imagem de inicialização
Dispositivos com o Android 10 podem incluir uma imagem DTB usando a estrutura de imagem de inicialização a seguir.
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 (m páginas) | 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 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, você pode usar 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 a ser incluída nas imagens de inicialização/recuperação. |
dtb_offset |
Quando adicionado ao argumento base , fornece o endereço de carregamento físico 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 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 de 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
. Por 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. Por 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 com sucesso em dispositivos com o Android
10, o carregador de inicialização precisa ser compatível com a 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 do conjunto de
DTBs presente na imagem de inicialização.