O Google tem o compromisso de promover a igualdade racial para as comunidades negras. Saiba como.

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:

  • Android 12 pode usar bota cabeçalho versão 3 ou 4. Para dispositivos que suportam o kernel genérico Imagem (GKI) arquitetura, versão 4 é a imagem de inicialização principal.
  • Android 11 pode usar cabeçalho de inicialização versão 3. Para dispositivos que suportam kernel genérico Imagem (GKI) arquitetura, esta versão deve ser utilizado para a imagem de inicialização principal.
  • 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 que funcionam com Android 9 ou superior, o Vendor Test Suite (VTS) verifica o formato do boot/recovery de imagem para assegurar que o cabeçalho de imagem de arranque utiliza a versão correta. Para ver os detalhes AOSP em todos os cabeçalhos de imagem de inicialização de inicialização e de fornecedor atualmente suportados, consulte o system/tools/mkbootimg/include/bootimg/bootimg.h .

Implementando controle de versão do cabeçalho da imagem de inicialização

O mkbootimg ferramenta 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. Não-A / B, utilizando dispositivos header_version :
  • 1 ou 2 pode especificar este caminho ou usar o recovery_acpio seção para especificar um caminho para a imagem ACPIO uma 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. Não-A / B, utilizando dispositivos header_version :
  • 1 ou 2 pode especificar este caminho ou usar o recovery_dtbo seção para especificar um caminho para uma imagem de recuperação DTBO.
  • 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 à base argumento, fornece o endereço de carga física para a árvore do dispositivo final. Por exemplo, se a base argumento é 0x10000000 eo dtb_offset argumento é 0x01000000 , o dtb_addr_field no cabeçalho da imagem de inicialização é preenchida como 0x11000000 .

O dispositivo BoardConfig.mk usa os configuração BOARD_MKBOOTIMG_ARGS para adicionar header version aos outros argumentos específicos a bordo 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 detalhes sobre o Projeto de Código Aberto Android (AOSP) mudanças, reveja os changelists associados para inicialização cabeçalho da imagem versionamento .

Cabeçalho da imagem de inicialização, versão 4

Android 12 fornece uma boot_signature no arranque cabeçalho de imagem versão 4, que pode ser usado para verificar a integridade do kernel eo ramdisk. A verificação é feita em VtsSecurityAvbTest e é necessária para os dispositivos que utilizam a arquitectura GKI 2.0. No entanto, o boot_signature não está envolvido no processo de arranque específico do dispositivo verificado e é utilizado apenas em VTS. Veja GKI integração 2.0 boot.img para mais detalhes.

Vendor imagem de inicialização do cabeçalho versão 4 suporta fragmentos ramdisk de fornecedores múltiplos.

A versão 4 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];

    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 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 substituído, e os recovery_dtbo_size , recovery_dtbo_offset , recovery_acpio_size e recovery_acpio_offset campos não aparecem 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.

    • Os 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 fornecedor de inicialização , de modo que o dtb_size e dtb_addr campos não aparecem no cabeçalho da imagem de inicialização (mas estão presentes na inicialização cabeçalho da imagem do fornecedor).

Os dispositivos podem usar a imagem de inicialização do cabeçalho versão 3 para cumprir kernel genérico Imagem (GKI) arquitetura, que unifica o kernel do núcleo e se move fornecedor módulos que são necessários para inicialização para o vendor_boot partição (ou seja, 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

Android 10 atualizações o cabeçalho de imagem de inicialização para a versão 2, que adiciona uma seção para a recuperação de imagem DTB informações (tamanho da imagem e endereço de carga física).

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

Android 9 convertidos a unused campo do cabeçalho imagem de inicialização para um campo versão cabeçalho. Os dispositivos que iniciam com o 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 */
};

Non-A / dispositivos B pode especificar uma imagem de sobreposição DTB / ACPI para a recuperação para ajudar a mitigar over-the-air (OTA) falhas de atualização. (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 header_size campo contém o tamanho do cabeçalho de imagem de inicialização. Se a versão do cabeçalho da imagem de inicialização é definido como 1, o id campo contém o SHA-1 digerir para o recovery_[dtbo|acpio] seção da imagem de inicialização, além do kernel , ramdisk , e second sections . Para detalhes sobre o recovery_[dtbo|acpio]_size e recovery_[dtbo|acpio]_offset campos, consulte Recuperação de Imagens .

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