Önyükleme resmi başlığı

Android 9, başlatma görüntüsü başlığında bir sürüm alanı sunarak geriye dönük uyumluluğu korurken başlığın güncellenmesini sağladı. Önyükleyici, başlık sürümü alanını kontrol etmeli ve başlığı buna göre ayrıştırmalıdır. Aşağıdaki özelliklerle kullanıma sunulan cihazlar:

  • Android 13, önyükleme başlığı sürümü 3 veya 4'ü kullanabilir. Genel Çekirdek Görüntüsü (GKI) mimarisini destekleyen cihazlarda 4. sürüm birincil başlatma görüntüsüdür ve önyükleme başlığındaki os_version alanı sıfır olmalıdır. Cihazın bootloader'ının bunun yerine Android Doğrulanmış Başlatma (AVB) özelliklerinden sürüm bilgilerini alması beklenir.
  • Android 12, önyükleme başlığı sürümü 3 veya 4'ü kullanabilir. Genel Çekirdek Görüntüsü (GKI) mimarisini destekleyen cihazlarda birincil başlatma görüntüsü sürüm 4'tür.
  • Android 11, önyükleme başlığı sürüm 3'ü kullanabilir. Genel Çekirdek Görüntüsü (GKI) mimarisini destekleyen cihazlarda bu sürüm, birincil başlatma görüntüsü için kullanılmalıdır.
  • Android 10'da önyükleme üstbilgi sürümü 2 kullanılmalıdır.
  • Android 9, önyükleme üstbilgi sürümü 1'i kullanmalıdır.
  • Android 8 ve önceki sürümler, başlatma görüntüsü üstbilgi sürümü 0'ı kullanıyor olarak kabul edilir.

Android 9 veya sonraki sürümlerin yüklü olduğu tüm cihazlarda Vendor Test Suite (VTS), başlatma görüntüsü başlığının doğru sürümü kullandığından emin olmak için boot/recovery görüntüsünün biçimini kontrol eder. Desteklenen tüm önyükleme ve satıcı önyükleme görüntüsü üstbilgilerindeki AOSP ayrıntılarını görüntülemek için system/tools/mkbootimg/include/bootimg/bootimg.h başlıklı makaleye bakın.

Başlatma görüntüsü üstbilgi sürümü oluşturmayı uygulama

mkbootimg aracı aşağıdaki bağımsız değişkenleri kabul eder.

Bağımsız değişken Açıklama
header_version Başlatma görüntüsü başlık sürümünü ayarlar. Başlık sürümü içeren bir önyükleme görüntüsü:
  • 1 veya 2, kurtarma DTBO görüntüsünü ya da kurtarma ACPIO görüntüsünü destekler.
  • 3, kurtarma görüntülerini desteklemez.
recovery_dtbo DTB kullanan mimariler için kullanılır. Kurtarma DTBO görüntüsünün yolunu belirtir. Kurtarma görüntüsü gerektirmeyen A/B cihazlar için isteğe bağlıdır. header_version kullanan A/B olmayan cihazlar:
  • 1 veya 2, bu yolu belirtebilir ya da kurtarma ACPIO görüntüsünün yolunu belirtmek için recovery_acpio bölümünü kullanabilir.
  • 3. Kurtarma DTBO görüntüsü belirtilemez.
recovery_acpio DTB yerine ACPI kullanan mimariler için kullanılır. Kurtarma ACPIO görüntüsünün yolunu belirtir. Kurtarma görüntüsü gerektirmeyen A/B cihazlar için isteğe bağlıdır. header_version kullanan A/B olmayan cihazlar:
  • 1 veya 2, bu yolu belirtebilir ya da kurtarma DTBO görüntüsünün yolunu belirtmek için recovery_dtbo bölümünü kullanabilir.
  • 3. Kurtarma ACPIO görüntüsü belirtilemez.
dtb Önyükleme/kurtarma görüntülerine dahil edilen DTB görüntüsünün yolu.
dtb_offset base bağımsız değişkenine eklendiğinde nihai cihaz ağacının fiziksel yükleme adresini sağlar. Örneğin, base bağımsız değişkeni 0x10000000 ve dtb_offset bağımsız değişkeni 0x01000000 ise başlatma görüntüsü başlığındaki dtb_addr_field, 0x11000000 olarak doldurulur.

Cihaz BoardConfig.mk, header version öğesini mkbootimg öğesinin diğer kartla ilgili bağımsız değişkenlerine eklemek için BOARD_MKBOOTIMG_ARGS yapılandırmasını kullanır. Örneğin:

BOARD_MKBOOTIMG_ARGS := --ramdisk_offset $(BOARD_RAMDISK_OFFSET) --tags_offset $(BOARD_KERNEL_TAGS_OFFSET) --header_version $(BOARD_BOOTIMG_HEADER_VERSION)

Android derleme sistemi, kurtarma görüntüsü oluşturulurken BoardConfig değişkenini BOARD_PREBUILT_DTBOIMAGE kullanarak mkbootimg aracının recovery_dtbo bağımsız değişkenini ayarlar. Android Açık Kaynak Projesi (AOSP) değişiklikleriyle ilgili ayrıntılar için başlatma görüntüsü üstbilgi sürümü oluşturmayla ilgili ilişkili değişiklik listelerini inceleyin.

Başlatma görüntüsü başlığı, sürüm 4

Android 12, çekirdeğin ve ramdiskin bütünlüğünü kontrol etmek için kullanılabilecek, başlatma görüntüsü başlığı sürüm 4'te boot_signature sağlar. Kontrol VtsSecurityAvbTest'te yapılır ve GKI mimarisini kullanan cihazlar için gereklidir. Ancak boot_signature, cihaza özel doğrulanmış başlatma işlemine dahil değildir ve yalnızca VTS'de kullanılır. Ayrıntılar için GKI boot.img board configuration ve GKI verified boot settings başlıklı makalelere bakın.

Tedarikçi başlatma görüntüsü başlığı sürüm 4, birden fazla tedarikçi ramdisk parçasını destekler.

Başlatma görüntüsü başlığının 4. sürümünde aşağıdaki biçim kullanılır.

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 */
};

Başlatma görüntüsü başlığı, sürüm 3

Android 11, başlatma görüntüsü üstbilgisini 3. sürüme günceller. Bu sürümde aşağıdaki veriler kaldırılır:

  • İkinci aşama bootloader. second_size ve second_addr alanları artık başlatma görüntüsü üstbilgisinde görünmüyor. İkinci aşama bootloader'ı olan cihazlar, bu bootloader'ı kendi bölümünde saklamalıdır.

  • Kurtarma görüntüsü. Kurtarma görüntüsü belirtme şartı kaldırıldı. recovery_dtbo_size, recovery_dtbo_offset, recovery_acpio_size ve recovery_acpio_offset alanları artık önyükleme görüntüsü başlığında görünmüyor.

    • A/B cihazlar, kurtarma için bir DTBO veya ACPIO görüntüsü belirtmeyi gereksiz kılan bir güncelleme ve kurtarma şeması kullanır.

    • Kurtarma görüntüsü (DTBO veya ACPIO) belirtmek isteyen A/B olmayan cihazlar, başlatma görüntüsü başlığı sürüm 1 veya 2'yi kullanmalıdır.

  • Cihaz ağacı blob'u (DTB). DTB, vendor boot partition'da depolandığından dtb_size ve dtb_addr alanları artık başlatma görüntüsü üstbilgisinde görünmüyor (ancak vendor boot image üstbilgisinde mevcut).

Cihazlar, Genel Çekirdek Görüntüsü (GKI) mimarisine uymak için başlatma görüntüsü başlığı sürüm 3'ü kullanabilir. Bu mimari, çekirdeği birleştirir ve önyükleme için gereken satıcı modüllerini vendor_boot bölümüne taşır (yani başlatma görüntüsü yalnızca GKI bileşenlerini içerir). Aşağıdaki özelliklere sahip cihazlar:

  • GKI'yı kullanın (android-4.19 veya android-5.4 çekirdeği gerekir) ancak A/B güncellemelerini kullanmayın. A/B güncellemeleri, önyükleme görüntüsü için önyükleme görüntüsü sürüm 3'ü, kurtarma görüntüsü için ise önyükleme görüntüsü sürüm 2'yi kullanarak kurtarma görüntüsü belirtebilir.

  • GKI kullanmayın ve A/B güncellemelerini kullanmayın. Hem başlatma hem de kurtarma görüntüleri için başlatma görüntüsü sürüm 1 veya 2'yi kullanarak kurtarma görüntüsü belirtebilirsiniz.

Başlatma görüntüsü başlığının 3. sürümünde aşağıdaki biçim kullanılır.

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

Başlatma görüntüsü başlığı, sürüm 2

Android 10, önyükleme görüntüsü üstbilgisini 2. sürüme günceller. Bu sürümde, kurtarma DTB görüntüsü bilgileri (görüntü boyutu ve fiziksel yükleme adresi) için bir bölüm eklenir.

Başlatma görüntüsü başlığının 2. sürümünde aşağıdaki biçim kullanılır.

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 */
};

Başlatma görüntüsü başlığı, sürüm 1

Android 9, önyükleme görüntüsü başlığının unused alanını başlık sürümü alanına dönüştürür. Android 9 ile kullanıma sunulan cihazlarda, başlık sürümü 1 veya daha yüksek bir değere ayarlanmış başlatma görüntüsü başlığı kullanılmalıdır (bu, VTS tarafından doğrulanır).

Başlatma görüntüsü başlığının 1. sürümünde aşağıdaki biçim kullanılır.

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 */
};

A/B olmayan cihazlar, kablosuz (OTA) güncelleme hatalarını azaltmaya yardımcı olmak için kurtarma amaçlı bir DTB/ACPI yer paylaşımı görüntüsü belirtebilir. (A/B cihazlarda bu sorun yoktur ve yer paylaşımı resmi belirtilmesi gerekmez.) DTBO resmi veya ACPIO resmi belirtebilirsiniz ancak ikisini birden belirtemezsiniz (çünkü farklı mimariler tarafından kullanılırlar). Aşağıdaki durumlarda başlatma görüntüsü başlığını doğru şekilde yapılandırmak için:

  • Kurtarma için bir DTBO resmi, recovery_dtbo_size ve recovery_dtbo_offset alanlarını içerir (recovery_acpio_size ve recovery_acpio_offset alanlarını içermez).

  • Kurtarma için bir ACPIO görüntüsü, recovery_acpio_size ve recovery_acpio_offset alanlarını içerir (recovery_dtbo_size ve recovery_dtbo_offset alanlarını içermez).

header_size alanı, başlatma görüntüsü başlığının boyutunu içerir. Önyükleme görüntüsü başlık sürümü 1 olarak ayarlanmışsa id alanı, kernel, ramdisk ve second sections'ye ek olarak önyükleme görüntüsünün recovery_[dtbo|acpio] bölümü için SHA-1 özetini içerir. recovery_[dtbo|acpio]_size ve recovery_[dtbo|acpio]_offset alanlarıyla ilgili ayrıntılar için Kurtarma Görüntüleri başlıklı makaleyi inceleyin.

Eski başlatma görüntüsü başlığı, sürüm 0

Eski başlatma görüntüsü başlığını kullanarak Android 9'dan önce kullanıma sunulan cihazlar, başlatma görüntüsü başlığı sürüm 0'ı kullanıyor olarak kabul edilir.

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