बूट इमेज हैडर

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

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

एंड्रॉइड 9 या उच्चतर पर चलने वाले सभी उपकरणों के लिए, वेंडर टेस्ट सूट (वीटीएस) boot/recovery इमेज के प्रारूप की जांच करता है ताकि यह सुनिश्चित हो सके कि बूट इमेज हेडर सही संस्करण का उपयोग करता है। वर्तमान में समर्थित सभी बूट और विक्रेता बूट छवि हेडर पर AOSP विवरण देखने के लिए, system/tools/mkbootimg/include/bootimg/bootimg.h देखें।

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

mkbootimg टूल निम्नलिखित तर्कों को स्वीकार करता है।

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

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

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

एंड्रॉइड बिल्ड सिस्टम पुनर्प्राप्ति छवि के निर्माण के दौरान mkbootimg टूल के तर्क recovery_dtbo को सेट करने के लिए BoardConfig वैरिएबल BOARD_PREBUILT_DTBOIMAGE का उपयोग करता है। एंड्रॉइड ओपन सोर्स प्रोजेक्ट (एओएसपी) परिवर्तनों के विवरण के लिए, बूट इमेज हेडर वर्जनिंग के लिए संबंधित चेंजलिस्ट की समीक्षा करें।

बूट छवि शीर्षलेख, संस्करण 4

एंड्रॉइड 12 बूट इमेज हेडर संस्करण 4 में एक boot_signature प्रदान करता है, जिसका उपयोग कर्नेल और रैमडिस्क की अखंडता की जांच के लिए किया जा सकता है। जाँच VtsSecurityAvbTest में की जाती है और GKI आर्किटेक्चर का उपयोग करने वाले उपकरणों के लिए आवश्यक है। हालाँकि, boot_signature डिवाइस-विशिष्ट सत्यापित बूट प्रक्रिया में शामिल नहीं है और इसका उपयोग केवल VTS में किया जाता है। विवरण के लिए 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

एंड्रॉइड 11 बूट इमेज हेडर को संस्करण 3 में अपडेट करता है, जो निम्नलिखित डेटा को हटा देता है:

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

  • पुनर्प्राप्ति छवि. पुनर्प्राप्ति छवि निर्दिष्ट करने की आवश्यकता को हटा दिया गया है, और recovery_dtbo_size , recovery_dtbo_offset , recovery_acpio_size , और recovery_acpio_offset फ़ील्ड अब बूट छवि शीर्षलेख में दिखाई नहीं देते हैं।

    • ए/बी डिवाइस एक अद्यतन और पुनर्प्राप्ति योजना का उपयोग करते हैं जो पुनर्प्राप्ति के लिए DTBO या ACPIO छवि निर्दिष्ट करना अनावश्यक बनाता है।

    • गैर-ए/बी डिवाइस जो पुनर्प्राप्ति छवि (या तो डीटीबीओ या एसीपीआईओ) निर्दिष्ट करना चाहते हैं, उन्हें बूट छवि हेडर संस्करण 1 या 2 का उपयोग करना चाहिए।

  • डिवाइस ट्री ब्लॉब (डीटीबी)। DTB को विक्रेता बूट विभाजन में संग्रहीत किया जाता है, इसलिए dtb_size और dtb_addr फ़ील्ड अब बूट छवि शीर्षलेख में दिखाई नहीं देते हैं (लेकिन विक्रेता बूट छवि शीर्षलेख में मौजूद हैं)।

डिवाइस जेनेरिक कर्नेल इमेज (जीकेआई) आर्किटेक्चर का अनुपालन करने के लिए बूट इमेज हेडर संस्करण 3 का उपयोग कर सकते हैं, जो कोर कर्नेल को एकीकृत करता है और विक्रेता मॉड्यूल को vendor_boot विभाजन में ले जाता है जो बूट के लिए आवश्यक होते हैं (जिसका अर्थ है कि बूट छवि में केवल जीकेआई घटक होते हैं)। उपकरण जो:

  • जीकेआई का उपयोग करें (एंड्रॉइड-4.19 या एंड्रॉइड-5.4 कर्नेल की आवश्यकता है) लेकिन ए/बी अपडेट का उपयोग न करें, बूट छवि के लिए बूट छवि संस्करण 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

एंड्रॉइड 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

एंड्रॉइड 9 बूट इमेज हेडर के unused फ़ील्ड को हेडर संस्करण फ़ील्ड में परिवर्तित करता है। एंड्रॉइड 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 */
};

गैर-ए/बी डिवाइस ओवर-द-एयर (ओटीए) अपडेट विफलताओं को कम करने में मदद के लिए पुनर्प्राप्ति के लिए एक डीटीबी/एसीपीआई ओवरले छवि निर्दिष्ट कर सकते हैं। (ए/बी उपकरणों में यह समस्या नहीं है और उन्हें ओवरले छवि निर्दिष्ट करने की आवश्यकता नहीं है।) आप या तो एक डीटीबीओ छवि या एक एसीपीआईओ छवि निर्दिष्ट कर सकते हैं, लेकिन दोनों नहीं (क्योंकि उनका उपयोग विभिन्न आर्किटेक्चर द्वारा किया जाता है)। उपयोग करते समय बूट छवि हेडर को सही ढंग से कॉन्फ़िगर करने के लिए:

  • पुनर्प्राप्ति के लिए एक 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

पुराने बूट इमेज हेडर का उपयोग करके एंड्रॉइड 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];
};