O Android 9 introduziu um campo de versão na imagem de inicialização , permitindo atualizações no cabeçalho, mantendo a compatibilidade com versões anteriores. O carregador de inicialização deve verificar o campo de versão do cabeçalho e analisar o cabeçalho de maneira adequada. Dispositivos lançados com:
- O Android 13 pode usar a versão 3 ou 4 do cabeçalho de inicialização. Para
de dispositivos com suporte a Imagem genérica do Kernel
(GKI) (em inglês)
a versão 4 é a imagem de inicialização principal e a
os_version
no cabeçalho de inicialização deve ser zero. Espera-se que o carregador de inicialização do dispositivo obtenha as informações da versão na Inicialização verificada do Android (AVB, na sigla em inglês) propriedades. - O Android 12 pode usar a versão 3 ou 4 do cabeçalho de inicialização. Para de dispositivos com suporte a Imagem genérica do Kernel (GKI) (em inglês) a versão 4 é a imagem de inicialização principal.
- O Android 11 pode usar a versão 3 do cabeçalho de inicialização. Para de dispositivos com suporte a Imagem genérica do Kernel (GKI) (em inglês) , essa versão precisa ser usada para a imagem de inicialização principal.
- O Android 10 precisa usar a versão 2 do cabeçalho de inicialização.
- O Android 9 precisa usar a versão 1 do cabeçalho de inicialização.
- O Android 8 e versões anteriores usam a versão 0 do cabeçalho da imagem de inicialização.
Para todos os dispositivos com o Android 9 ou versões mais recentes, o
O Conjunto de testes de fornecedor (VTS, na sigla em inglês) verifica o formato do
boot/recovery
para garantir que o cabeçalho da imagem de inicialização use a
para a versão anterior. Para ver detalhes do AOSP em todas as inicializações compatíveis e de fornecedor
cabeçalhos de imagem, consulte
system/tools/mkbootimg/include/bootimg/bootimg.h
Implementar o controle de versões do cabeçalho da imagem de inicialização
A ferramenta mkbootimg
aceita os argumentos a seguir.
Argumento | Descrição |
---|---|
header_version |
Define a versão do cabeçalho da imagem de inicialização. Uma imagem de inicialização com uma versão de cabeçalho:
|
recovery_dtbo |
Usado para arquiteturas que utilizam DTB. Especifica o caminho para a recuperação
Imagem de DTBO. Opcional para dispositivos A/B, que não precisam de uma imagem de recuperação.
Dispositivos não A/B que usam header_version :
|
recovery_acpio |
Usado para arquiteturas que usam ACPI em vez de DTB. Especifica o caminho
à imagem ACPIO de recuperação. Opcional para dispositivos A/B, que não precisam de uma
imagem de recuperação de desastres. Dispositivos não A/B que usam header_version :
|
dtb |
Caminho para a imagem DTB 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 base
argumento é 0x10000000 , e o argumento dtb_offset
for 0x01000000 , o dtb_addr_field na imagem de inicialização
é preenchido como 0x11000000 . |
O dispositivo BoardConfig.mk
usa a configuração BOARD_MKBOOTIMG_ARGS
para adicionar
header version
para os outros argumentos específicos do quadro de mkbootimg
. Por
exemplo:
BOARD_MKBOOTIMG_ARGS := --ramdisk_offset $(BOARD_RAMDISK_OFFSET) --tags_offset $(BOARD_KERNEL_TAGS_OFFSET) --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
O sistema de build do Android usa a variável BoardConfig
.
BOARD_PREBUILT_DTBOIMAGE
para definir o argumento recovery_dtbo
do
mkbootimg
durante a criação da imagem de recuperação. Para mais detalhes sobre
Mudanças no Android Open Source Project (AOSP), analise as listas de mudanças associadas
para o cabeçalho da imagem de inicialização
controle de versões.
Cabeçalho da imagem de inicialização, versão 4
O Android 12 fornece uma boot_signature
na imagem de inicialização
a versão 4 do cabeçalho, que pode ser usada para verificar a integridade do kernel e da
no ramdisk. A verificação é feita em
VtsSecurityAvbTest (link em inglês)
e é necessário para dispositivos que usam a arquitetura GKI. No entanto,
boot_signature
não está envolvido no processo de inicialização verificada específico do dispositivo
e só é usada no VTS. Consulte a placa boot.img GKI
configuração
e inicialização verificada de GKI
configurações
para mais detalhes.
Imagem de inicialização do fornecedor cabeçalho A versão 4 oferece suporte a vários fragmentos do ramdisk do fornecedor.
A versão 4 da versão do cabeçalho da imagem de inicialização usa o formato a seguir.
struct boot_img_hdr
{
#define BOOT_MAGIC_SIZE 8
uint8_t magic[BOOT_MAGIC_SIZE];
uint32_t kernel_size; /* size in bytes */
uint32_t ramdisk_size; /* size in bytes */
uint32_t os_version;
uint32_t header_size; /* size of boot image header in bytes */
uint32_t reserved[4];
uint32_t header_version; /* offset remains constant for version check */
#define BOOT_ARGS_SIZE 512
#define BOOT_EXTRA_ARGS_SIZE 1024
uint8_t cmdline[BOOT_ARGS_SIZE + BOOT_EXTRA_ARGS_SIZE];
uint32_t signature_size; /* size in bytes */
};
Cabeçalho da imagem de inicialização, versão 3
O Android 11 atualiza o cabeçalho da imagem de inicialização para a versão 3. que remove os seguintes dados:
Carregador de inicialização de segundo estágio. Os campos
second_size
esecond_addr
que não aparecem mais no cabeçalho da imagem de inicialização. Dispositivos com um carregador de inicialização de segundo estágio precisa armazenar esse carregador na própria partição.Imagem de recuperação. O requisito para especificar uma imagem de recuperação foi descontinuados, e os
recovery_dtbo_size
,recovery_dtbo_offset
, Os camposrecovery_acpio_size
erecovery_acpio_offset
não aparecem mais em no cabeçalho da imagem de inicialização.Os dispositivos A/B usam um esquema de atualização e recuperação que torna desnecessária especificar uma imagem DTBO ou ACPIO para recuperação.
Dispositivos não A/B que querem especificar uma imagem de recuperação (DTBO ou ACPIO) devem usar a versão 1 ou 2 do cabeçalho da imagem de inicialização.
blob da árvore de dispositivos (DTB, na sigla em inglês). O DTB é armazenado no sistema de inicialização do fornecedor partição, para que os campos
dtb_size
edtb_addr
não apareçam mais na imagem de inicialização (mas estão presentes no cabeçalho da imagem de inicialização do fornecedor).
Os dispositivos podem usar a versão 3 do cabeçalho da imagem de inicialização para obedecer à Imagem genérica do Kernel
(GKI),
que unifica o kernel principal e move os módulos do fornecedor necessários para
para a partição vendor_boot
, o que significa que a imagem de inicialização contém apenas GKI
componentes). Dispositivos que:
Use GKI (exige o kernel do android-4.19 ou android-5.4), mas não use As atualizações A/B podem especificar uma imagem de recuperação usando a versão 3 da imagem de inicialização para o imagem de inicialização e a imagem de inicialização versão 2 para a imagem de recuperação.
não usar GKI e atualizações A/B podem especificar uma imagem de recuperação usando imagem de inicialização versão 1 ou 2 para imagens de inicialização e de recuperação.
A versão 3 da versão do cabeçalho da imagem de inicialização usa o formato a seguir.
struct boot_img_hdr
{
#define BOOT_MAGIC_SIZE 8
uint8_t magic[BOOT_MAGIC_SIZE];
uint32_t kernel_size; /* size in bytes */
uint32_t ramdisk_size; /* size in bytes */
uint32_t os_version;
uint32_t header_size; /* size of boot image header in bytes */
uint32_t reserved[4];
uint32_t header_version; /* offset remains constant for version check */
#define BOOT_ARGS_SIZE 512
#define BOOT_EXTRA_ARGS_SIZE 1024
uint8_t cmdline[BOOT_ARGS_SIZE + BOOT_EXTRA_ARGS_SIZE];
};
Cabeçalho da imagem de inicialização, versão 2
O Android 10 atualiza o cabeçalho da imagem de inicialização para a versão 2. que adiciona uma seção para recuperação de DTB informações da imagem (tamanho da imagem e endereço físico da carga).
A versão 2 do cabeçalho da imagem de inicialização usa o formato a seguir.
struct boot_img_hdr
{
uint8_t magic[BOOT_MAGIC_SIZE];
uint32_t kernel_size; /* size in bytes */
uint32_t kernel_addr; /* physical load addr */
uint32_t ramdisk_size; /* size in bytes */
uint32_t ramdisk_addr; /* physical load addr */
uint32_t second_size; /* size in bytes */
uint32_t second_addr; /* physical load addr */
uint32_t tags_addr; /* physical addr for kernel tags */
uint32_t page_size; /* flash page size we assume */
uint32_t header_version;
uint32_t os_version;
uint8_t name[BOOT_NAME_SIZE]; /* asciiz product name */
uint8_t cmdline[BOOT_ARGS_SIZE];
uint32_t id[8]; /* timestamp / checksum / sha1 / etc */
uint8_t extra_cmdline[BOOT_EXTRA_ARGS_SIZE];
uint32_t recovery_[dtbo|acpio]_size; /* size of recovery image */
uint64_t recovery_[dtbo|acpio]_offset; /* offset in boot image */
uint32_t header_size; /* size of boot image header in bytes */
uint32_t dtb_size; /* size of dtb image */
uint64_t dtb_addr; /* physical load address */
};
Cabeçalho da imagem de inicialização, versão 1
O Android 9 converte o campo unused
da inicialização
de imagem para um campo de versão do cabeçalho. Dispositivos lançados com o Android
9 precisa usar o cabeçalho da imagem de inicialização com o cabeçalho
versão definida como 1 ou superior (isso é verificado pelo VTS).
A versão 1 do cabeçalho da imagem de inicialização usa o formato abaixo.
struct boot_img_hdr
{
uint8_t magic[BOOT_MAGIC_SIZE];
uint32_t kernel_size; /* size in bytes */
uint32_t kernel_addr; /* physical load addr */
uint32_t ramdisk_size; /* size in bytes */
uint32_t ramdisk_addr; /* physical load addr */
uint32_t second_size; /* size in bytes */
uint32_t second_addr; /* physical load addr */
uint32_t tags_addr; /* physical addr for kernel tags */
uint32_t page_size; /* flash page size we assume */
uint32_t header_version;
uint32_t os_version;
uint8_t name[BOOT_NAME_SIZE]; /* asciiz product name */
uint8_t cmdline[BOOT_ARGS_SIZE];
uint32_t id[8]; /* timestamp / checksum / sha1 / etc */
uint8_t extra_cmdline[BOOT_EXTRA_ARGS_SIZE];
uint32_t recovery_[dtbo|acpio]_size; /* size of recovery image */
uint64_t recovery_[dtbo|acpio]_offset; /* offset in boot image */
uint32_t header_size; /* size of boot image header in bytes */
};
Dispositivos não A/B podem especificar uma imagem de sobreposição DTB/ACPI para recuperação para ajudar a mitigar falhas na atualização over the air (OTA). (Dispositivos A/B não têm esse problema e não é preciso especificar uma imagem de sobreposição. É possível especificar uma imagem de DTBO ou uma imagem ACPIO, mas não ambas (porque são usadas por arquiteturas diferentes). Para configurar o cabeçalho da imagem de inicialização corretamente, use:
uma imagem de DTBO para recuperação, inclua
recovery_dtbo_size
e camposrecovery_dtbo_offset
, sem incluir os camposrecovery_acpio_size
erecovery_acpio_offset
).Uma imagem ACPIO para recuperação, inclua
recovery_acpio_size
e camposrecovery_acpio_offset
, sem incluir os camposrecovery_dtbo_size
erecovery_dtbo_offset
).
O campo header_size
contém o tamanho do cabeçalho da imagem de inicialização. Se a inicialização
versão do cabeçalho da imagem estiver definido como 1, o campo id
conterá o resumo SHA-1 para
a seção recovery_[dtbo|acpio]
da imagem de inicialização, além da seção
kernel
, ramdisk
e second sections
. Para mais detalhes sobre
recovery_[dtbo|acpio]_size
e recovery_[dtbo|acpio]_offset
, consulte
Imagens de recuperação.
Cabeçalho da imagem de inicialização legada, versão 0
Dispositivos lançados antes do Android 9 usando a versão legada cabeçalho da imagem de inicialização usa a versão 0 do cabeçalho da imagem de inicialização.
struct boot_img_hdr
{
uint8_t magic[BOOT_MAGIC_SIZE];
uint32_t kernel_size; /* size in bytes */
uint32_t kernel_addr; /* physical load addr */
uint32_t ramdisk_size; /* size in bytes */
uint32_t ramdisk_addr; /* physical load addr */
uint32_t second_size; /* size in bytes */
uint32_t second_addr; /* physical load addr */
uint32_t tags_addr; /* physical addr for kernel tags */
uint32_t page_size; /* flash page size we assume */
uint32_t unused;
uint32_t os_version;
uint8_t name[BOOT_NAME_SIZE]; /* asciiz product name */
uint8_t cmdline[BOOT_ARGS_SIZE];
uint32_t id[8]; /* timestamp / checksum / sha1 / etc */
uint8_t extra_cmdline[BOOT_EXTRA_ARGS_SIZE];
};