बूट इमेज हैडर

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

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

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

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

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

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

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

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

recovery_dtbo छवि के निर्माण के दौरान mkbootimg टूल के रिकवरी_dtbo तर्क को सेट करने के लिए Android बिल्ड सिस्टम 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 dtbo_size , recovery_dtbo_offset , recovery_acpio_size , और recovery_acpio_offset फ़ील्ड अब बूट छवि शीर्षलेख में प्रकट नहीं होते हैं।

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

    • गैर-A/B डिवाइस जो पुनर्प्राप्ति छवि निर्दिष्ट करना चाहते हैं (या तो DTBO या ACPIO) को बूट छवि शीर्षलेख संस्करण 1 या 2 का उपयोग करना चाहिए।

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

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

  • GKI का उपयोग करें (Android-4.19 या android-5.4 कर्नेल की आवश्यकता है) लेकिन 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

एंड्रॉइड 10 बूट इमेज हेडर को संस्करण 2 में अपडेट करता है, जो पुनर्प्राप्ति डीटीबी छवि जानकारी (छवि आकार और भौतिक लोड पता) के लिए एक अनुभाग जोड़ता है।

बूट छवि शीर्षलेख संस्करण का संस्करण 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 छवि, पुनर्प्राप्ति_dtbo_size और recovery_dtbo_size dtbo_offset फ़ील्ड शामिल करें (और recovery_dtbo_offset acpio_size और recovery_acpio_size recovery_acpio_offset फ़ील्ड शामिल न करें)।

  • पुनर्प्राप्ति के लिए एक ACPIO छवि, पुनर्प्राप्ति_acpio_size और recovery_acpio_size acpio_offset फ़ील्ड शामिल करें (और recovery_acpio_offset dtbo_size और 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];
};