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

Android 9, başlatma görüntüsü başlığında bir sürüm alanı kullanıma sundu. Böylece, geriye dönük uyumluluğu korurken üstbilginin güncellenmesine olanak tanıdı. Bootloader, başlık sürümü alanını kontrol etmeli ve başlığı buna uygun olarak ayrıştırmalıdır. Kullanıma sunulacak cihazlar:

  • Android 13, başlatma başlığı sürüm 3 veya 4'ü 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 bunun yerine sürüm bilgilerini Android Doğrulanmış Başlatma (AVB) özelliklerinden alması beklenir.
  • Android 12, başlatma başlığı sürüm 3 veya 4'ü kullanabilir. Genel Kernel Görüntüsü (GKI) mimarisini destekleyen cihazlarda sürüm 4, birincil başlatma görüntüsüdür.
  • Android 11, başlatma başlığı sürüm 3'ü kullanabilir. Genel Çekirdek Görüntü (GKI) mimarisini destekleyen cihazlarda birincil başlatma görüntüsü için bu sürüm kullanılmalıdır.
  • Android 10, başlatma başlığı sürüm 2'yi kullanmalıdır.
  • Android 9, başlatma başlığı sürüm 1'i kullanmalıdır.
  • Android 8 ve önceki sürümler, önyükleme görüntüsü üst bilgisi sürüm 0'ı kullanıyor olarak kabul edilir.

Tedarikçi Test Paketi (VTS), Android 9 veya sonraki sürümleri çalıştıran tüm cihazlarda, 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 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ıkta 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ü üstbilgi sürümünü ayarlar. Üstbilgi sürümü olan bir başlatma görüntüsü:
  • 1 veya 2, bir kurtarma DTBO görüntüsünü veya kurtarma ACPIO görüntüsünü destekler.
  • 3, kurtarma görüntülerini desteklemiyor.
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 veya kurtarma ACPIO görüntüsüne giden yolu belirtmek için recovery_acpio bölümünü kullanabilir.
  • 3, kurtarma DTBO görüntüsü belirtemiyor.
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 veya kurtarma DTBO görüntüsüne giden yolu 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, son cihaz ağacı için fiziksel yük 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.

BoardConfig.mk cihazı, mkbootimg öğesinin diğer tahtaya özel bağımsız değişkenlerine header version eklemek için BOARD_MKBOOTIMG_ARGS yapılandırmasını kullanıyor. Ö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 mkbootimg aracının recovery_dtbo bağımsız değişkenini ayarlamak için BOARD_PREBUILT_DTBOIMAGE BoardConfig değişkenini kullanır. Android Açık Kaynak Projesi (AOSP) değişiklikleriyle ilgili ayrıntılar için önyükleme görüntüsü başlık sürümü oluşturma ile ilişkili değişiklik listelerini inceleyin.

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

Android 12, başlatma görüntüsü başlık sürümü 4'te, çekirdek ve RAM diskinin bütünlüğünü kontrol etmek için kullanılabilen bir boot_signature sağlar. Kontrol, VtsSecurityAvbTest içinde yapılır ve GKI mimarisini kullanan cihazlar için gereklidir. Bununla birlikte 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 yapılandırması ve GKI onaylı başlatma ayarlarına göz atın.

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

Başlatma görüntüsü 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 */
};

Başlatma görüntüsü üstbilgisi, sürüm 3

Android 11, başlatma görüntüsü başlığını sürüm 3'e günceller ve böylece 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ü başlığında görünmüyor. İkinci aşama bootloader'ı olan cihazlar bu bootloader'ı kendi bölümünde depolamalıdır.

  • Kurtarma görüntüsü. Kurtarma görüntüsü belirtme gereksinimi kullanımdan kaldırılmıştır ve recovery_dtbo_size, recovery_dtbo_offset, recovery_acpio_size ve recovery_acpio_offset alanları artık başlatma görüntüsü başlığında görünmemektedir.

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

    • Kurtarma görüntüsü belirtmek isteyen A/B olmayan cihazlar (DTBO veya ACPIO) 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, tedarikçi firma başlatma bölümünde depolanır. Bu nedenle dtb_size ve dtb_addr alanları artık başlatma görüntüsü başlığında görünmez (ancak tedarikçi firma başlatma görüntüsü başlığında bulunur).

Cihazlar, çekirdek çekirdeği birleştiren ve başlatma için gereken tedarikçi modüllerini vendor_boot bölümüne taşıyan (yani başlatma görüntüsünde yalnızca GKI bileşenleri bulunan) Genel Kernel Görüntüsü (GKI) mimarisine uymak için başlatma görüntüsü başlık sürümü 3'ü kullanabilir. Şu durumda 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, 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 bir kurtarma görüntüsü belirtebilir.

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, başlatma görüntüsü başlığını sürüm 2'ye 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ık sürümü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ü üstbilgisi, sürüm 1

Android 9, başlatma görüntüsü başlığının unused alanını bir üstbilgi sürümü alanına dönüştürür. Android 9 ile başlatılan cihazlar, başlık sürümü 1 veya sonraki bir sürüme ayarlanmış başlatma görüntüsü başlığını kullanmalıdır (VTS tarafından doğrulanır).

Başlatma görüntüsü başlık 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 cihazlarında bu sorun bulunmaz ve bindirme görüntüsü belirtmesi gerekmez.) DTBO görüntüsü veya ACPIO görüntüsü belirtebilirsiniz ancak ikisini birden kullanamazsınız (çünkü bunlar farklı mimariler tarafından kullanılır). Başlatma görüntüsü üstbilgisini doğru şekilde yapılandırmak için:

  • Kurtarma için bir DTBO görüntüsü, recovery_dtbo_size ve recovery_dtbo_offset alanlarını dahil edin (recovery_acpio_size ve recovery_acpio_offset alanlarını eklemeyin).

  • Kurtarma için bir ACPIO görüntüsü. recovery_acpio_size ve recovery_acpio_offset alanlarını dahil edin (recovery_dtbo_size ve recovery_dtbo_offset alanlarını da dahil etmeyin).

header_size alanı, başlatma görüntüsü başlığının boyutunu içerir. Başlatma görüntüsü üst bilgi sürümü 1 olarak ayarlanırsa id alanı kernel, ramdisk ve second sections'nin yanı sıra başlatma 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'ne göz atın.

Eski başlatma görüntüsü üstbilgisi, 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];
};