Önyükleme Görüntü Başlığı

Android 9, önyükleme görüntüsü başlığında bir sürüm alanı sunarak, geriye dönük uyumluluğu korurken üstbilgide güncellemeleri mümkün kıldı. Önyükleyici, başlık sürümü alanını kontrol etmeli ve başlığı buna göre ayrıştırmalıdır. Şununla başlatılan cihazlar:

  • Android 13, önyükleme başlığı sürüm 3 veya 4'ü kullanabilir. Genel Çekirdek Görüntüsü (GKI) mimarisini destekleyen aygıtlar için sürüm 4, birincil önyükleme görüntüsüdür ve önyükleme başlığındaki os_version alanı sıfır olmalıdır. Aygıt önyükleyicisinin bunun yerine sürüm bilgilerini Android Verified Boot (AVB) özelliklerinden alması beklenir.
  • Android 12, önyükleme başlığı sürüm 3 veya 4'ü kullanabilir. Genel Çekirdek Görüntüsü (GKI) mimarisini destekleyen aygıtlar için sürüm 4, birincil önyükleme görüntüsüdür.
  • Android 11, önyükleme üstbilgisi sürüm 3'ü kullanabilir. Genel Çekirdek Görüntüsü (GKI) mimarisini destekleyen aygıtlarda, birincil önyükleme görüntüsü için bu sürüm kullanılmalıdır.
  • Android 10, önyükleme başlığı sürüm 2'yi kullanmalıdır.
  • Android 9, önyükleme başlığı sürüm 1'i kullanmalıdır.
  • Android 8 ve daha düşük sürümler, bir önyükleme görüntüsü üstbilgisi sürüm 0 kullanıyor olarak kabul edilir.

Vendor Test Suite (VTS) , Android 9 veya sonraki sürümlerle çalışan tüm cihazlar için, önyükleme 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. Şu anda desteklenen tüm önyükleme ve satıcı önyükleme görüntüsü başlıklarında AOSP ayrıntılarını görüntülemek için system/tools/mkbootimg/include/bootimg/bootimg.h .

Önyükleme görüntüsü üstbilgisi sürüm oluşturmayı uygulama

mkbootimg aracı aşağıdaki argümanları kabul eder.

Argüman Tanım
header_version Önyükleme görüntüsü başlık sürümünü ayarlar. Başlık sürümüne sahip bir önyükleme görüntüsü:
  • 1 veya 2, bir kurtarma DTBO görüntüsünü veya bir 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üne ihtiyaç duymayan 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ünün yolunu belirtmek için recovery_acpio bölümünü kullanabilir.
  • 3 bir kurtarma DTBO görüntüsü belirtemez.
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üne ihtiyaç duymayan 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 Önyükleme/kurtarma görüntülerine dahil olan DTB görüntüsünün yolu.
dtb_offset base bağımsız değişkene eklendiğinde, son aygıt ağacı için fiziksel yük adresini sağlar. Örneğin, base bağımsız değişken 0x10000000 ve dtb_offset bağımsız değişkeni 0x01000000 ise, önyükleme görüntüsü başlığındaki dtb_addr_field 0x11000000 olarak doldurulur.

BoardConfig.mk aygıtı, BoardConfig.mk öğesinin diğer panoya özgü bağımsız değişkenlerine header version eklemek için BOARD_MKBOOTIMG_ARGS yapılandırmasını mkbootimg . Ö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 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ü üstbilgisi sürüm oluşturmayla ilgili değişiklik listelerini inceleyin.

Önyükleme görüntüsü başlığı, sürüm 4

Android 12, önyükleme görüntüsü üstbilgisi sürüm 4'te, çekirdeğin ve ramdisk'in bütünlüğünü kontrol etmek için kullanılabilen bir boot_signature sağlar. Kontrol VtsSecurityAvbTest'te yapılır ve GKI mimarisini kullanan cihazlar için gereklidir. Ancak, boot_signature aygıta özel doğrulanmış önyükleme işlemine dahil değildir ve yalnızca VTS'de kullanılır. Ayrıntılar için GKI boot.img kartı yapılandırmasına ve GKI onaylı önyükleme ayarlarına bakın.

Satıcı önyükleme görüntüsü üstbilgisi sürüm 4, birden çok satıcı ramdisk parçasını destekler.

Önyükleme 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 */
};

Önyükleme görüntüsü başlığı, sürüm 3

Android 11, önyükleme görüntüsü üstbilgisini aşağıdaki verileri kaldıran sürüm 3'e günceller:

  • İkinci aşama önyükleyici. second_size ve second_addr alanları artık önyükleme görüntüsü başlığında görünmüyor. İkinci aşama önyükleyicisi olan aygıtlar, bu önyükleyiciyi kendi bölümünde depolamalıdır.

  • Kurtarma görüntüsü. Bir kurtarma görüntüsü belirtme gereksinimi kullanımdan kaldırıldı ve 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.

    • Bir kurtarma görüntüsü (DTBO veya ACPIO) belirtmek isteyen A/B olmayan aygıtlar, önyükleme görüntüsü üstbilgisi sürüm 1 veya 2'yi kullanmalıdır.

  • Cihaz ağacı bloğu (DTB). DTB, satıcı önyükleme bölümünde depolanır, bu nedenle dtb_size ve dtb_addr alanları artık önyükleme görüntüsü başlığında görünmez (ancak satıcı önyükleme görüntüsü başlığında bulunur).

Cihazlar, çekirdek çekirdeği birleştiren ve önyükleme için gerekli satıcı modüllerini vendor_boot bölümüne taşıyan Genel Çekirdek Görüntüsü (GKI) mimarisine uymak için önyükleme görüntüsü üstbilgisi sürüm 3'ü kullanabilir (yani, önyükleme görüntüsü yalnızca GKI bileşenlerini içerir). Cihazlar:

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

  • GKI kullanmayın ve A/B güncellemeleri kullanmayın, hem önyükleme hem de kurtarma görüntüleri için önyükleme görüntüsü sürüm 1 veya 2'yi kullanarak bir kurtarma görüntüsü belirtebilirsiniz.

Önyükleme 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];
};

Önyükleme görüntüsü başlığı, sürüm 2

Android 10, önyükleme görüntüsü başlığını, kurtarma DTB görüntü bilgileri (görüntü boyutu ve fiziksel yükleme adresi) için bir bölüm ekleyen sürüm 2'ye günceller.

Önyükleme görüntüsü başlık 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 */
};

Önyükleme 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ı bir başlık 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 daha yükseğine ayarlanmış olarak önyükleme görüntüsü başlığını kullanmalıdır (bu, VTS tarafından doğrulanır).

Önyükleme 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 için kurtarma için bir DTB/ACPI yer paylaşımı görüntüsü belirtebilir. (A/B aygıtlarında bu sorun yoktur ve bir bindirme görüntüsü belirtmeleri gerekmez.) Bir DTBO görüntüsü veya bir ACPIO görüntüsü belirtebilirsiniz, ancak ikisini birden belirleyemezsiniz (çünkü farklı mimariler tarafından kullanılırlar). Önyükleme görüntüsü başlığını doğru şekilde yapılandırmak için aşağıdakileri kullanırken:

  • Kurtarma için bir DTBO görüntüsü, recovery_dtbo_size ve recovery_dtbo_offset alanlarını içerir (ve 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 (ve recovery_dtbo_size ve recovery_dtbo_offset alanlarını içermez).

header_size alanı, önyükleme görüntüsü başlığının boyutunu içerir. Önyükleme görüntüsü başlık sürümü 1'e ayarlanırsa, id alanı, kernel , ramdisk ve second sections 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, bkz. Kurtarma Görüntüleri .

Eski önyükleme görüntüsü üstbilgisi, sürüm 0

Eski önyükleme görüntüsü üstbilgisi kullanılarak Android 9'dan önce başlatılan aygıtlar, önyükleme görüntüsü üstbilgisi 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];
};