As implementações do Android podem incluir uma imagem de blob de árvore de dispositivo (DTB) para uso pelo carregador de inicialização. A localização da imagem DTB (e as opções para especificar os parâmetros da imagem DTB) difere entre as versões do Android.
No Android 11, os dispositivos que usam a imagem genérica do kernel (GKI) devem ser compatíveis com a 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 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 Incluindo a imagem DTB na imagem de inicialização .
No Android 9 e inferior, a imagem DTB pode existir em sua própria partição ou ser anexada ao kernel
image.gzpara criar a imagem kernel + DTB (que é então passada paramkbootimgpara criarboot.img).
Formato de imagem DTB
No Android 10 e superior, a imagem DTB deve usar um dos seguintes formatos:
Os blobs DT concatenados um após o outro. O bootloader usa o campo
totalsizeem 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 estrutura
dt_table_entry(contémid,reve camposcustom) que pode conter informações de identificação de hardware para a entrada). Para obter detalhes, consulte Partições DTB/DTBO .
Incluindo a imagem DTB na imagem de inicialização
Os dispositivos que executam 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 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 interrompidos. Durante uma OTA, se ocorrer um problema após a atualização da partição 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 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, tornando a imagem de recuperação auto-suficiente (ou seja, não depende de outra partição).
Estrutura da imagem de inicialização
Os dispositivos que executam 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 (l páginas) | l = ( kernel_size + page_size - 1) / page_size |
| Ramdisk (m páginas) | m = ( ramdisk_size + page_size - 1) / page_size |
| Bootloader de segundo estágio (n páginas) | n = ( second_size + page_size - 1) / page_size |
| Recuperação DTBO (o páginas) | 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 que executam o Android 10, você pode usar a ferramenta mkbootimg.py e os argumentos a seguir 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 deve ser usada para especificar o caminho para a imagem DTB. Se mais de um arquivo com extensão *.dtb estiver presente no diretório BOARD_PREBUILT_DTBIMAGE_DIR , o sistema de compilação do Android concatena os arquivos para criar a imagem DTB final usada na criação da imagem de inicialização.
Para passar 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 deve ser definida como true . Por exemplo:
BOARD_INCLUDE_DTB_IN_BOOTIMG := true
Você pode 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 que executam o Android 10, o carregador de inicialização deve oferecer suporte à imagem de inicialização atualizada e deve adicionar o parâmetro de linha de comando do kernel androidboot.dtb_idx para indicar o índice da árvore de dispositivos (DT) selecionada. Você pode 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.