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 paramkbootimg
para criarboot.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émid
,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 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.