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

Android 9, önyükleme resmi başlığında bir sürüm alanı sundu. Bu alan, geriye dönük uyumluluğu korurken başlıkta güncelleme yapılmasına olanak tanır. Bootloader, başlık sürümü alanını kontrol etmeli ve başlığı buna uygun olarak ayrıştırmalıdır. Aşağıdaki sürümlerle kullanıma sunulan cihazlar:

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

Android 9 veya sonraki sürümleri çalıştıran tüm cihazlarda Satıcı Testi Paketi (VTS), başlatma resmi başlığında doğru sürümün kullanılmasını sağlamak için boot/recovery resminin biçimini kontrol eder. Desteklenen tüm başlatma ve satıcı başlatma görüntüsü üstbilgilerinde AOSP ayrıntılarını görüntülemek için system/tools/mkbootimg/include/bootimg/bootimg.h bölümüne bakın.

Başlatma görüntüsü başlığı sürüm oluşturma özelliğini uygulama

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

Bağımsız değişken Açıklama
header_version Önyükleme resmi üstbilgi sürümünü ayarlar. Başlık sürümü içeren bir önyükleme resmi:
  • 1 veya 2, bir kurtarma DTBO görüntüsünü veya kurtarma ACPIO görüntüsünü destekler.
  • 3, kurtarma resimlerini 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 dışı cihazlar:
  • 1 veya 2, bu yolu belirtebilir veya kurtarma ACPIO görüntüsüne giden yolu belirtmek için recovery_acpio bölümünü kullanabilir.
  • 3, kurtarma DTBO resmini belirtemez.
recovery_acpio DTB yerine ACPI kullanan mimariler için kullanılır. Kurtarma ACPIO resminin yolunu belirtir. Kurtarma resmi 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 resminin yolunu belirtmek için recovery_dtbo bölümünü kullanabilir.
  • 3, bir kurtarma ACPIO görüntüsü belirtemez.
dtb Başlatma/kurtarma görüntülerinde bulunan 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 önyükleme resmi başlığındaki dtb_addr_field 0x11000000 olarak doldurulur.

BoardConfig.mk cihazı, mkbootimg'ın kart özelindeki diğer bağımsız değişkenlerine header version 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ünün oluşturulması sırasında mkbootimg aracının recovery_dtbo bağımsız değişkenini ayarlamak için BoardConfig değişkenini BOARD_PREBUILT_DTBOIMAGE kullanır. Android Open Source Project (AOSP) değişiklikleri hakkında ayrıntılı bilgi için önyükleme resmi üstbilgi sürümlendirmesi ile ilişkili değişiklik listelerini inceleyin.

Önyükleme resmi başlığı, sürüm 4

Android 12, önyükleme resmi başlık sürüm 4'te çekirdeğin ve ramdisk'in bütünlüğünü kontrol etmek için kullanılabilecek bir boot_signature sağlar. Kontrol, VtsSecurityAvbTest'te yapılır ve GKI mimarisini kullanan cihazlar için gereklidir. Ancak boot_signature, cihaza özgü doğrulanmış başlatma işleminde yer almaz ve yalnızca VTS'de kullanılır. Ayrıntılar için GKI boot.img board yapılandırması ve GKI onaylı başlatma ayarlarına göz atın.

Tedarikçi firma önyükleme resmi başlığı 4. sürümü, birden fazla tedarikçi firma ramdiski parçasını destekler.

Önyükleme resmi başlık sürümünün 4. sürümü aşağıdaki biçimi kullanı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 */
};

Önyükleme resmi başlığı, sürüm 3

Android 11, önyükleme resmi üst bilgisini 3. sürüme günceller. Bu güncellemeyle aşağıdaki veriler kaldırılır:

  • İkinci aşama bootloader. second_size ve second_addr alanları artık önyükleme resmi üstbilgisinde görünmez. İkinci aşamalı bir önyükleyiciye sahip cihazlar, bu önyükleyiciyi kendi bölümlerinde saklamalıdır.

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

    • A/B cihazlar, güncelleme ve kurtarma şeması kullanır. Bu şema, kurtarma için DTBO veya ACPIO resmi belirtmeyi gereksiz kılar.

    • Kurtarma resmi (DTBO veya ACPIO) belirtmek isteyen A/B olmayan cihazlar, önyükleme resmi başlığı 1 veya 2 sürümünü kullanmalıdır.

  • Cihaz ağacı blob'u (DTB). DTB, tedarikçi önyükleme bölümünde depolandığından dtb_size ve dtb_addr alanları artık önyükleme resmi üstbilgisinde görünmez (ancak tedarikçi önyükleme resmi üstbilgisinde bulunur).

Cihazlar, çekirdek çekirdeği birleştiren ve önyükleme için gereken tedarikçi modüllerini vendor_boot bölümüne taşıyan Genel Çekirdek Görüntüsü (GKI) mimarisine uymak için önyükleme resmi üstbilgisi 3. sürümünü kullanabilir (yani önyükleme resmi yalnızca GKI bileşenlerini içerir). Aşağıdaki durumlarda olan cihazlar:

  • GKI kullanın (android-4.19 veya android-5.4 çekirdeği gerektirir) ancak A/B güncellemeleri, başlatma görüntüsü için başlatma görüntüsü sürüm 3'ü, kurtarma görüntüsü için ise başlatma görüntüsü sürüm 2'yi kullanarak bir kurtarma görüntüsü belirtebilir.

  • GKI kullanmayın ve A/B güncellemeleri kullanmayın. Hem önyükleme hem de kurtarma resimleri için önyükleme resmi 1 veya 2 sürümünü kullanarak bir kurtarma resmi belirtebilirsiniz.

Başlatma görüntüsü başlık sürümünün 3. sürümü aşağıdaki biçimi kullanı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ü üstbilgisi, sürüm 2

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

Önyükleme resmi başlığı sürümünün 2. sürümü aşağıdaki biçimi kullanı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 resmi başlığının unused alanını bir başlık sürümü alanına dönüştürür. Android 9 ile kullanıma sunulan cihazlar, başlık sürümü 1 veya daha yüksek olacak şekilde önyükleme resmi başlığını kullanmalıdır (bu, VTS tarafından doğrulanır).

Önyükleme resmi başlığı sürümünün 1. sürümü aşağıdaki biçimi kullanı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 amacıyla kurtarma için bir DTB/ACPI yer paylaşımlı görüntüsü belirtebilir. (A/B cihazlarda bu sorun yaşanmaz ve yer paylaşımlı resim belirtmeniz gerekmez.) DTBO resmi veya ACPIO resmi belirtebilirsiniz ancak ikisini birden belirtemezsiniz (çünkü bunlar farklı mimariler tarafından kullanılır). Aşağıdakileri kullanırken önyükleme resmi başlığını doğru şekilde yapılandırmak için:

  • Kurtarma için DTBO resmi. recovery_dtbo_size ve recovery_dtbo_offset alanlarını ekleyin (recovery_acpio_size ve recovery_acpio_offset alanlarını eklemeyin).

  • Kurtarma için bir ACPIO resmi. recovery_acpio_size ve recovery_acpio_offset alanlarını ekleyin (recovery_dtbo_size ve recovery_dtbo_offset alanlarını eklemeyin).

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

Eski önyükleme resmi başlığı, sürüm 0

Android 9'dan önce eski başlatma görüntüsü başlığını kullanan cihazların, başlatma görüntüsü başlık sürümü 0'ı kullandığı 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];
};