O Google tem o compromisso de promover a igualdade racial para as comunidades negras. Saiba como.
Esta página foi traduzida pela API Cloud Translation.
Switch to English

Cabeçalho da imagem de inicialização

O Android 9 introduziu um campo de versão no cabeçalho da 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 acordo. Dispositivos lançando com:

  • O Android 11 pode usar a versão 3 do cabeçalho de inicialização. Para dispositivos com suporte à arquitetura de imagem genérica do kernel (GKI) , esta versão deve ser usada para a imagem de inicialização primária.
  • O Android 10 deve usar a versão 2 do cabeçalho de inicialização.
  • O Android 9 deve usar a versão 1 do cabeçalho de inicialização.
  • O Android 8 e inferior são considerados como usando um cabeçalho de imagem de inicialização versão 0.

Para todos os dispositivos rodando com Android 9 ou superior, o Vendor Test Suite (VTS) verifica o formato da imagem de boot/recovery para garantir que o cabeçalho da imagem de inicialização usa a versão correta. Para ver os detalhes do AOSP em todos os cabeçalhos de boot e de imagem de boot do fornecedor atualmente suportados, consulte system/tools/mkbootimg/include/bootimg/bootimg.h .

Implementar versão do cabeçalho da imagem de inicialização

A ferramenta mkbootimg aceita os seguintes argumentos.

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:
  • 1 ou 2 suporta uma imagem DTBO de recuperação ou uma imagem ACPIO de recuperação.
  • 3 não suporta imagens de recuperação.
recovery_dtbo Usado para arquiteturas que usam DTB. Especifica o caminho para a imagem DTBO de recuperação. Opcional para dispositivos A / B, que não precisam de imagem de recuperação. Dispositivos não A / B usando header_version :
  • 1 ou 2 pode especificar este caminho ou usar a seção recovery_acpio para especificar um caminho para uma imagem ACPIO de recuperação.
  • 3 não pode especificar uma imagem DTBO de recuperação.
recovery_acpio Usado para arquiteturas que usam ACPI em vez de DTB. Especifica o caminho para a imagem ACPIO de recuperação. Opcional para dispositivos A / B, que não precisam de imagem de recuperação. Dispositivos não A / B usando header_version :
  • 1 ou 2 pode especificar este caminho ou usar a seção recovery_dtbo para especificar um caminho para uma imagem DTBO de recuperação.
  • 3 não pode especificar uma imagem ACPIO de recuperação.
dtb Caminho para a imagem DTB 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 dispositivo final. Por exemplo, se a base argumento é 0x10000000 eo dtb_offset argumento é 0x01000000 , o dtb_addr_field no cabeçalho da imagem boot é preenchida como 0x11000000 .

O dispositivo BoardConfig.mk usa a configuração BOARD_MKBOOTIMG_ARGS para adicionar a header version a outros argumentos específicos da mkbootimg 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 construção Android usa o BoardConfig variável BOARD_PREBUILT_DTBOIMAGE para definir o argumento recovery_dtbo do mkbootimg ferramenta durante a criação da imagem de recuperação. Para obter detalhes sobre as alterações do Android Open Source Project (AOSP), revise as changelists associadas para controle de versão do cabeçalho da imagem de inicialização .

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 second_size e second_addr campos não aparecem no cabeçalho da imagem de inicialização. Dispositivos com um bootloader de segundo estágio devem armazenar esse bootloader em sua própria partição.

  • Imagem de recuperação. O requisito para especificar uma imagem de recuperação foi descontinuado e os campos recovery_dtbo_size , recovery_dtbo_offset , recovery_acpio_size e recovery_acpio_offset não aparecem mais no cabeçalho da imagem de inicialização.

    • Os dispositivos A / B usam um esquema de atualização e recuperação que torna desnecessário especificar uma imagem DTBO ou ACPIO para recuperação.

    • Dispositivos não A / B que desejam 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). O DTB é armazenado na partição de boot fornecedor , de modo que o dtb_size e dtb_addr campos não aparecem no cabeçalho da imagem boot (mas estão presentes no boot cabeçalho da imagem do fornecedor).

Os dispositivos podem usar a versão 3 do cabeçalho da imagem de inicialização para cumprir a arquitetura Generic Kernel Image (GKI) , que unifica o núcleo do kernel e move os módulos do fornecedor necessários para a inicialização na partição vendor_boot (o que significa que a imagem de inicialização contém apenas componentes GKI). Dispositivos que:

  • Use GKI (requer o kernel android-4.19 ou android-5.4), mas não use atualizações A / B, pode especificar uma imagem de recuperação usando a imagem de inicialização versão 3 para a imagem de inicialização e a imagem de inicialização versão 2 para a imagem de recuperação.

  • Não use GKI e não use atualizações A / B pode especificar uma imagem de recuperação usando a versão 1 ou 2 da imagem de inicialização para as imagens de inicialização e recuperação.

A versão 3 da versão do cabeçalho da imagem de inicialização usa o seguinte formato.

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 informações de imagem DTB de recuperação (tamanho da imagem e endereço físico de carga).

A versão 2 da versão do cabeçalho da imagem de inicialização usa o seguinte formato.

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 do cabeçalho da imagem de inicialização em um campo de versão do cabeçalho. Dispositivos iniciados com Android 9 devem usar o cabeçalho da imagem de inicialização com a versão do cabeçalho definida como 1 ou superior (isso é verificado pelo VTS).

A versão 1 da versão do cabeçalho da imagem de inicialização usa o seguinte formato.

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 de atualização over-the-air (OTA). (Os dispositivos A / B não têm esse problema e não precisam especificar uma imagem de sobreposição.) Você pode especificar uma imagem 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, ao usar:

  • Image A DTBO para a recuperação, incluem os recovery_dtbo_size e recovery_dtbo_offset campos (e não incluem o recovery_acpio_size e recovery_acpio_offset campos).

  • Uma imagem do ACPIO para a recuperação, incluem os recovery_acpio_size e recovery_acpio_offset campos (e não incluem o recovery_dtbo_size e recovery_dtbo_offset campos).

O campo header_size contém o tamanho do cabeçalho da imagem de inicialização. Se a versão do cabeçalho da imagem de inicialização for definida como 1, o campo id conterá o resumo SHA-1 para a seção recovery_[dtbo|acpio] da imagem de inicialização, além do kernel , ramdisk e second sections . Para obter detalhes sobre os recovery_[dtbo|acpio]_size e recovery_[dtbo|acpio]_offset , consulte Imagens de recuperação .

Cabeçalho de imagem de inicialização legado, versão 0

Dispositivos lançados antes do Android 9 usando o cabeçalho de imagem de inicialização legado são considerados como usando um cabeçalho de imagem de inicialização versão 0.

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];
};