Imagens em DTB

As implementações do Android podem incluir uma imagem de blob da árvore de dispositivos (DTB, na sigla em inglês) para uso dos pelo carregador de inicialização. O local da imagem DTB (e as opções para especificar parâmetros de imagem de DTB) difere entre as versões do Android.

  • No Android 11, os dispositivos que usam a biblioteca Kernel genérico A imagem (GKI) precisa ofereça suporte à inicialização do fornecedor partição, que inclui todas as informações específicas do fornecedor que foram realocadas do 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 os parâmetros de imagem DTB, consulte Como incluir os parâmetros de 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 para mkbootimg para criar boot.img.

Formato de imagem DTB

No Android 10 e versões mais recentes, a imagem DTB precisa usar um um dos seguintes formatos:

  • blobs da DT concatenados um após o outro. O carregador de inicialização usa totalsize em cada cabeçalho FDT para ler e analisar o blob correspondente.

  • Partições DTB/DTBO. O carregador de inicialização tem uma forma eficiente de selecionar correto do DT examinando a estrutura dt_table_entry (contém id, rev e custom) 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 em a 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 do 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 atualizado (mas antes de concluir a atualização completa), o dispositivo tenta inicializar o modo de recuperação para concluir a atualização OTA; No entanto, como a partição DTB tem já tiver sido atualizada, pode ocorrer uma incompatibilidade com a imagem de recuperação (que ainda não foi atualizado). 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

Dispositivos com o 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 (páginas L) 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 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 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 a ser incluída nas imagens de inicialização/recuperação.
dtb_offset Quando adicionado ao argumento base, fornece a 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 O valor BOARD_INCLUDE_DTB_IN_BOOTIMG precisa ser definido como true. Exemplo:

BOARD_INCLUDE_DTB_IN_BOOTIMG := true

É possível anexar o argumento dtb_offset à variável de configuração do tabuleiro 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 ao carregador de inicialização

Para que o VTS seja executado corretamente em dispositivos com Android 10, o carregador de inicialização precisa ser compatível com a imagem de inicialização atualizada e precisa 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 1 (uma) í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.