বুট ইমেজ হেডার

অ্যান্ড্রয়েড 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 ব্যবহার করবে।
  • অ্যান্ড্রয়েড 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 চিত্রের পথ নির্দিষ্ট করে। A/B ডিভাইসগুলির জন্য ঐচ্ছিক, যেগুলির পুনরুদ্ধার চিত্রের প্রয়োজন নেই৷ header_version ব্যবহার করে নন-এ/বি ডিভাইস:
  • 1 বা 2 এই পথটি নির্দিষ্ট করতে পারে বা একটি পুনরুদ্ধার ACPIO চিত্রের একটি পথ নির্দিষ্ট করতে recovery_acpio বিভাগটি ব্যবহার করতে পারে।
  • 3 একটি রিকভারি DTBO ইমেজ নির্দিষ্ট করতে পারে না।
recovery_acpio DTB এর পরিবর্তে ACPI ব্যবহার করে এমন আর্কিটেকচারের জন্য ব্যবহার করা হয়। পুনরুদ্ধার ACPIO চিত্রের পথ নির্দিষ্ট করে। A/B ডিভাইসগুলির জন্য ঐচ্ছিক, যেগুলির পুনরুদ্ধার চিত্রের প্রয়োজন নেই৷ 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 ব্যবহার করে। অ্যান্ড্রয়েড ওপেন সোর্স প্রজেক্ট (AOSP) পরিবর্তনের বিশদ বিবরণের জন্য, বুট ইমেজ হেডার সংস্করণের জন্য সংশ্লিষ্ট পরিবর্তন তালিকা পর্যালোচনা করুন।

বুট ইমেজ হেডার, সংস্করণ 4

Android 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 ক্ষেত্রগুলি বুট ইমেজ হেডারে আর প্রদর্শিত হবে না।

    • A/B ডিভাইসগুলি একটি আপডেট এবং পুনরুদ্ধার স্কিম ব্যবহার করে যা পুনরুদ্ধারের জন্য একটি DTBO বা ACPIO চিত্র নির্দিষ্ট করা অপ্রয়োজনীয় করে তোলে।

    • নন-A/B ডিভাইসগুলি যেগুলি একটি পুনরুদ্ধার চিত্র নির্দিষ্ট করতে চায় (হয় DTBO বা ACPIO) বুট ইমেজ হেডার সংস্করণ 1 বা 2 ব্যবহার করা উচিত।

  • ডিভাইস ট্রি ব্লব (DTB)। 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 সংস্করণে আপডেট করে, যা পুনরুদ্ধারের জন্য একটি বিভাগ যুক্ত করে 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 ক্ষেত্রটিকে একটি হেডার সংস্করণ ক্ষেত্রে রূপান্তর করে। অ্যান্ড্রয়েড 9 এর সাথে লঞ্চ করা ডিভাইসগুলিকে অবশ্যই বুট ইমেজ হেডার ব্যবহার করতে হবে এবং হেডার সংস্করণ 1 বা তার বেশি সেট করা হবে (এটি VTS দ্বারা যাচাই করা হয়েছে)।

বুট ইমেজ হেডার সংস্করণের সংস্করণ 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 */
};

ওভার-দ্য-এয়ার (OTA) আপডেট ব্যর্থতা প্রশমিত করতে সাহায্য করার জন্য নন-A/B ডিভাইসগুলি পুনরুদ্ধারের জন্য একটি DTB/ACPI ওভারলে চিত্র নির্দিষ্ট করতে পারে। (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 ফিল্ডের বিস্তারিত জানার জন্য, Recovery Images দেখুন।

লিগ্যাসি বুট ইমেজ হেডার, সংস্করণ 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];
};