बूट इमेज का हेडर

Android 9 में, बूट इमेज हेडर में वर्शन फ़ील्ड जोड़ा गया था. इससे पुराने सिस्टम के साथ काम करने की सुविधा को बनाए रखते हुए, हेडर को अपडेट किया जा सकता है. बूटलोडर को हेडर वर्शन फ़ील्ड की जांच करनी होगी और उसके मुताबिक हेडर को पार्स करना होगा. इन वर्शन के साथ लॉन्च होने वाले डिवाइस:

  • Android 13, बूट हेडर के वर्शन 3 या 4 का इस्तेमाल कर सकता है. सामान्य कर्नेल इमेज (जीकेआई) आर्किटेक्चर के साथ काम करने वाले डिवाइसों के लिए, वर्शन 4 मुख्य बूट इमेज है. साथ ही, बूट हेडर में os_version फ़ील्ड की वैल्यू शून्य होनी चाहिए. डिवाइस के बूटलोडर को Android Verified Boot (AVB) की प्रॉपर्टी से वर्शन की जानकारी मिलनी चाहिए.
  • Android 12 में बूट हेडर के वर्शन 3 या 4 का इस्तेमाल किया जा सकता है. सामान्य कर्नेल इमेज (जीकेआई) आर्किटेक्चर के साथ काम करने वाले डिवाइसों के लिए, वर्शन 4 मुख्य बूट इमेज है.
  • Android 11, बूट हेडर के वर्शन 3 का इस्तेमाल कर सकता है. जेनेरिक कर्नल इमेज (जीकेआई) आर्किटेक्चर के साथ काम करने वाले डिवाइसों के लिए, मुख्य बूट इमेज के तौर पर इस वर्शन का इस्तेमाल करना ज़रूरी है.
  • Android 10 में बूट हेडर के वर्शन 2 का इस्तेमाल करना ज़रूरी है.
  • Android 9 में बूट हेडर के वर्शन 1 का इस्तेमाल करना ज़रूरी है.
  • Android 8 और इससे पहले के वर्शन में, बूट इमेज हेडर के वर्शन 0 का इस्तेमाल किया जाता है.

Android 9 या इसके बाद के वर्शन पर काम करने वाले सभी डिवाइसों के लिए, Vendor Test Suite (VTS), boot/recovery इमेज के फ़ॉर्मैट की जांच करता है. इससे यह पक्का किया जाता है कि बूट इमेज हेडर, सही वर्शन का इस्तेमाल कर रहा है. जिन बूट और वेंडर बूट इमेज हेडर के साथ AOSP काम करता है उनके बारे में जानने के लिए, system/tools/mkbootimg/include/bootimg/bootimg.h पर जाएं.

बूट इमेज हेडर वर्शनिंग लागू करना

mkbootimg टूल, इन तर्कों को स्वीकार करता है.

आर्ग्युमेंट ब्यौरा
header_version इससे बूट इमेज हेडर का वर्शन सेट होता है. हेडर वर्शन वाली बूट इमेज:
  • 1 या 2, रिकवरी डीटीबीओ इमेज या रिकवरी एसीपीआईओ इमेज के साथ काम करता है.
  • 3 में रिकवरी इमेज की सुविधा काम नहीं करती.
recovery_dtbo इसका इस्तेमाल उन आर्किटेक्चर के लिए किया जाता है जो DTB का इस्तेमाल करते हैं. यह रिकवरी डीटीबीओ इमेज का पाथ तय करता है. यह A/B डिवाइसों के लिए ज़रूरी नहीं है. इन डिवाइसों के लिए, रिकवरी इमेज की ज़रूरत नहीं होती. header_version का इस्तेमाल करने वाले नॉन-ए/बी डिवाइस:
  • एक या दो, इस पाथ की जानकारी दे सकते हैं या रिकवरी ACPIO इमेज के पाथ की जानकारी देने के लिए, recovery_acpio सेक्शन का इस्तेमाल कर सकते हैं.
  • 3 में रिकवरी डीटीबीओ इमेज के बारे में नहीं बताया जा सकता.
recovery_acpio इस कुकी का इस्तेमाल उन आर्किटेक्चर के लिए किया जाता है जो डीटीबी के बजाय ACPI का इस्तेमाल करते हैं. इससे, ACPIO इमेज को वापस लाने का पाथ तय होता है. यह A/B डिवाइसों के लिए ज़रूरी नहीं है. इन डिवाइसों के लिए, रिकवरी इमेज की ज़रूरत नहीं होती. header_version का इस्तेमाल करने वाले नॉन-ए/बी डिवाइस:
  • एक या दो, इस पाथ की जानकारी दे सकते हैं. इसके अलावा, रिकवरी डीटीबीओ इमेज के पाथ की जानकारी देने के लिए, recovery_dtbo सेक्शन का इस्तेमाल किया जा सकता है.
  • 3 में, रिकवरी ACPIO इमेज के बारे में नहीं बताया जा सकता.
dtb बूट/रिकवरी इमेज में शामिल की गई डीटीबी इमेज का पाथ.
dtb_offset इसे base आर्ग्युमेंट में जोड़ने पर, यह फ़ाइनल डिवाइस ट्री के लिए फ़िज़िकल लोड एड्रेस देता है. उदाहरण के लिए, अगर base आर्ग्युमेंट 0x10000000 है और dtb_offset आर्ग्युमेंट 0x01000000 है, तो बूट इमेज के हेडर में मौजूद dtb_addr_field की वैल्यू 0x11000000 के तौर पर सेट हो जाएगी.

डिवाइस BoardConfig.mk, कॉन्फ़िगरेशन BOARD_MKBOOTIMG_ARGS का इस्तेमाल करके, mkbootimg के बोर्ड के हिसाब से तय किए गए अन्य आर्ग्युमेंट में header version जोड़ता है. उदाहरण के लिए:

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

Android बिल्ड सिस्टम, रिकवरी इमेज बनाते समय mkbootimg टूल के recovery_dtbo आर्ग्युमेंट को सेट करने के लिए, BoardConfig वैरिएबल BOARD_PREBUILT_DTBOIMAGE का इस्तेमाल करता है. Android ओपन सोर्स प्रोजेक्ट (AOSP) में हुए बदलावों के बारे में जानने के लिए, बूट इमेज हेडर वर्शनिंग से जुड़ी बदलावों की सूची देखें.

बूट इमेज हेडर, वर्शन 4

Android 12, बूट इमेज हेडर के वर्शन 4 में boot_signature उपलब्ध कराता है. इसका इस्तेमाल, कर्नल और रैमडिस्क की पुष्टि करने के लिए किया जा सकता है. यह जांच VtsSecurityAvbTest में की जाती है. यह जांच, GKI आर्किटेक्चर का इस्तेमाल करने वाले डिवाइसों के लिए ज़रूरी है. हालांकि, boot_signature को डिवाइस के हिसाब से पुष्टि किए गए बूट प्रोसेस में शामिल नहीं किया जाता. इसका इस्तेमाल सिर्फ़ वीटीएस में किया जाता है. ज़्यादा जानकारी के लिए, GKI boot.img बोर्ड कॉन्फ़िगरेशन और GKI के लिए वेरिफ़ाइड बूट की सेटिंग देखें.

वेंडर बूट इमेज हेडर के वर्शन 4 में, एक से ज़्यादा वेंडर रैमडिस्क फ़्रैगमेंट इस्तेमाल किए जा सकते हैं.

बूट इमेज हेडर के वर्शन 4 में इस फ़ॉर्मैट का इस्तेमाल किया जाता है.

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

बूट इमेज हेडर, वर्शन 3

Android 11, बूट इमेज हेडर को वर्शन 3 पर अपडेट करता है. इससे यह डेटा हट जाता है:

  • सेकंड-स्टेज बूटलोडर. second_size और second_addr फ़ील्ड अब बूट इमेज हेडर में नहीं दिखते. दूसरे चरण के बूटलोडर वाले डिवाइसों को, उस बूटलोडर को अपने पार्टिशन में सेव करना होगा.

  • रिकवरी इमेज. रिकवरी इमेज के बारे में जानकारी देने की ज़रूरी शर्त अब लागू नहीं होती. साथ ही, recovery_dtbo_size, recovery_dtbo_offset, recovery_acpio_size, और recovery_acpio_offset फ़ील्ड अब बूट इमेज हेडर में नहीं दिखते.

    • A/B डिवाइसों में अपडेट और रिकवरी की ऐसी स्कीम का इस्तेमाल किया जाता है जिसकी वजह से, रिकवरी के लिए DTBO या ACPIO इमेज के बारे में बताना ज़रूरी नहीं होता.

    • नॉन-A/B डिवाइसों के लिए, रिकवरी इमेज (डीटीबीओ या एसीपीआईओ) तय करने के लिए, बूट इमेज हेडर के वर्शन 1 या 2 का इस्तेमाल करना चाहिए.

  • डिवाइस ट्री ब्लॉब (डीटीबी). DTB को vendor boot partition में सेव किया जाता है. इसलिए, dtb_size और dtb_addr फ़ील्ड अब बूट इमेज हेडर में नहीं दिखते. हालांकि, ये vendor boot इमेज हेडर में मौजूद होते हैं.

डिवाइस, सामान्य कर्नेल इमेज (जीकेआई) आर्किटेक्चर के मुताबिक काम करने के लिए, बूट इमेज हेडर के वर्शन 3 का इस्तेमाल कर सकते हैं. इससे कोर कर्नेल को एक साथ लाया जाता है और बूट के लिए ज़रूरी वेंडर मॉड्यूल को vendor_boot पार्टिशन में ले जाया जाता है. इसका मतलब है कि बूट इमेज में सिर्फ़ जीकेआई कॉम्पोनेंट होते हैं. ऐसे डिवाइस जो:

  • GKI का इस्तेमाल करें. इसके लिए, android-4.19 या android-5.4 कर्नल की ज़रूरत होती है. हालांकि, A/B अपडेट का इस्तेमाल न करें. A/B अपडेट, बूट इमेज के लिए बूट इमेज के वर्शन 3 और रिकवरी इमेज के लिए बूट इमेज के वर्शन 2 का इस्तेमाल करके, रिकवरी इमेज तय कर सकते हैं.

  • GKI का इस्तेमाल न करने वाले और A/B अपडेट का इस्तेमाल न करने वाले डिवाइस, बूट और रिकवरी इमेज, दोनों के लिए बूट इमेज के वर्शन 1 या 2 का इस्तेमाल करके रिकवरी इमेज तय कर सकते हैं.

बूट इमेज हेडर के वर्शन 3 का फ़ॉर्मैट यह है.

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

बूट इमेज हेडर, वर्शन 2

Android 10, बूट इमेज हेडर को वर्शन 2 में अपडेट करता है. इससे रिकवरी DTB इमेज की जानकारी (इमेज का साइज़ और फ़िज़िकल लोड पता) के लिए एक सेक्शन जुड़ जाता है.

बूट इमेज हेडर के वर्शन 2 का फ़ॉर्मैट यहां दिया गया है.

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

बूट इमेज हेडर, वर्शन 1

Android 9, बूट इमेज हेडर के unused फ़ील्ड को हेडर वर्शन फ़ील्ड में बदलता है. Android 9 के साथ लॉन्च होने वाले डिवाइसों को, बूट इमेज हेडर का इस्तेमाल करना होगा. साथ ही, हेडर वर्शन को 1 या इससे ज़्यादा पर सेट करना होगा. इसकी पुष्टि वीटीएस करता है.

बूट इमेज हेडर का वर्शन 1, इस फ़ॉर्मैट का इस्तेमाल करता है.

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 डिवाइस, रिकवरी के लिए डीटीबी/एसीपीआई ओवरले इमेज तय कर सकते हैं. इससे, ओवर-द-एयर (OTA) अपडेट के फ़ेल होने की समस्या को कम करने में मदद मिलती है. (A/B डिवाइसों में यह समस्या नहीं होती और उन्हें ओवरले इमेज के बारे में बताने की ज़रूरत नहीं होती.) DTBO इमेज या ACPIO इमेज में से किसी एक को तय किया जा सकता है. हालांकि, दोनों को तय नहीं किया जा सकता, क्योंकि इनका इस्तेमाल अलग-अलग आर्किटेक्चर में किया जाता है. बूट इमेज हेडर को सही तरीके से कॉन्फ़िगर करने के लिए, इनका इस्तेमाल करते समय:

  • रिकवरी के लिए DTBO इमेज. इसमें recovery_dtbo_size और recovery_dtbo_offset फ़ील्ड शामिल करें. साथ ही, recovery_acpio_size और recovery_acpio_offset फ़ील्ड शामिल न करें.

  • रिकवरी के लिए ACPIO इमेज. इसमें recovery_acpio_size और recovery_acpio_offset फ़ील्ड शामिल करें. साथ ही, recovery_dtbo_size और recovery_dtbo_offset फ़ील्ड शामिल न करें.

header_size फ़ील्ड में बूट इमेज हेडर का साइज़ होता है. अगर बूट इमेज हेडर का वर्शन 1 पर सेट है, तो id फ़ील्ड में kernel, ramdisk, और second sections के अलावा, बूट इमेज के recovery_[dtbo|acpio] सेक्शन के लिए SHA-1 डाइजेस्ट शामिल होता है. recovery_[dtbo|acpio]_size और recovery_[dtbo|acpio]_offset फ़ील्ड के बारे में जानकारी के लिए, रिकवरी इमेज देखें.

लेगसी बूट इमेज हेडर, वर्शन 0

Android 9 से पहले लॉन्च किए गए ऐसे डिवाइस जो लेगसी बूट इमेज हेडर का इस्तेमाल करते हैं उन्हें बूट इमेज हेडर के वर्शन 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];
};