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

অ্যান্ড্রয়েড ৯ বুট ইমেজ হেডারে একটি ভার্সন ফিল্ড চালু করেছে, যা ব্যাকওয়ার্ড কম্প্যাটিবিলিটি বজায় রেখে হেডার আপডেট করার সুযোগ দেয়। বুটলোডারকে অবশ্যই হেডার ভার্সন ফিল্ডটি পরীক্ষা করতে হবে এবং সেই অনুযায়ী হেডারটি পার্স করতে হবে। যেসব ডিভাইস নিম্নলিখিত ভার্সন দিয়ে লঞ্চ হচ্ছে:

  • অ্যান্ড্রয়েড ১৩ বুট হেডার ভার্সন ৩ বা ৪ ব্যবহার করতে পারে । জেনেরিক কার্নেল ইমেজ (GKI) আর্কিটেকচার সমর্থনকারী ডিভাইসগুলোর জন্য, ভার্সন ৪ হলো প্রাথমিক বুট ইমেজ এবং বুট হেডারের os_version ফিল্ডটি অবশ্যই শূন্য হতে হবে। এর পরিবর্তে, ডিভাইস বুটলোডারটি অ্যান্ড্রয়েড ভেরিফাইড বুট (AVB) প্রোপার্টিজ থেকে ভার্সনের তথ্য সংগ্রহ করবে বলে আশা করা হয়।
  • অ্যান্ড্রয়েড ১২ বুট হেডার ভার্সন ৩ বা ৪ ব্যবহার করতে পারে। জেনেরিক কার্নেল ইমেজ (GKI) আর্কিটেকচার সমর্থনকারী ডিভাইসগুলোর জন্য ভার্সন ৪ হলো প্রাথমিক বুট ইমেজ।
  • অ্যান্ড্রয়েড ১১ বুট হেডার সংস্করণ ৩ ব্যবহার করতে পারে। জেনেরিক কার্নেল ইমেজ (GKI) আর্কিটেকচার সমর্থনকারী ডিভাইসগুলোর প্রাথমিক বুট ইমেজের জন্য এই সংস্করণটি অবশ্যই ব্যবহার করতে হবে।
  • অ্যান্ড্রয়েড ১০-এ অবশ্যই বুট হেডার ভার্সন ২ ব্যবহার করতে হবে।
  • অ্যান্ড্রয়েড ৯-কে অবশ্যই বুট হেডার ভার্সন ১ ব্যবহার করতে হবে।
  • অ্যান্ড্রয়েড ৮ এবং এর পূর্ববর্তী সংস্করণগুলো বুট ইমেজ হেডার ভার্সন ০ ব্যবহার করে বলে গণ্য করা হয়।

অ্যান্ড্রয়েড ৯ বা তার উচ্চতর সংস্করণে চালিত সমস্ত ডিভাইসের জন্য, ভেন্ডর টেস্ট স্যুট (VTS) boot/recovery ইমেজের ফরম্যাট পরীক্ষা করে নিশ্চিত করে যে বুট ইমেজ হেডারটি সঠিক সংস্করণ ব্যবহার করছে। সমস্ত সমর্থিত বুট এবং ভেন্ডর বুট ইমেজ হেডারের AOSP বিবরণ দেখতে, system/tools/mkbootimg/include/bootimg/bootimg.h দেখুন।

বুট ইমেজ হেডার ভার্সনিং বাস্তবায়ন করুন

mkbootimg টুলটি নিম্নলিখিত আর্গুমেন্টগুলো গ্রহণ করে।

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

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

অ্যান্ড্রয়েড ১২ তার বুট ইমেজ হেডার সংস্করণ ৪-এ একটি boot_signature প্রদান করে, যা কার্নেল এবং র‍্যামডিস্কের অখণ্ডতা পরীক্ষা করতে ব্যবহার করা যেতে পারে। এই পরীক্ষাটি VtsSecurityAvbTest- এ করা হয় এবং GKI আর্কিটেকচার ব্যবহারকারী ডিভাইসগুলির জন্য এটি আবশ্যক। তবে, boot_signature ডিভাইস-নির্দিষ্ট যাচাইকৃত বুট প্রক্রিয়ার সাথে জড়িত নয় এবং এটি শুধুমাত্র VTS-এ ব্যবহৃত হয়। বিস্তারিত জানার জন্য GKI boot.img বোর্ড কনফিগারেশন এবং GKI যাচাইকৃত বুট সেটিংস দেখুন।

ভেন্ডর বুট ইমেজ হেডার সংস্করণ ৪ একাধিক ভেন্ডর র‍্যামডিস্ক ফ্র্যাগমেন্ট সমর্থন করে।

বুট ইমেজ হেডারের সংস্করণ ৪ নিম্নলিখিত বিন্যাস ব্যবহার করে।

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

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

অ্যান্ড্রয়েড ১১ বুট ইমেজ হেডারকে সংস্করণ ৩-এ আপডেট করে, যা নিম্নলিখিত ডেটা মুছে ফেলে:

  • দ্বিতীয়-পর্যায়ের বুটলোডার। বুট ইমেজ হেডারে second_size এবং second_addr ফিল্ডগুলো আর দেখা যায় না। দ্বিতীয়-পর্যায়ের বুটলোডারযুক্ত ডিভাইসগুলোকে অবশ্যই সেই বুটলোডারটি তার নিজস্ব পার্টিশনে সংরক্ষণ করতে হবে।

  • রিকভারি ইমেজ। রিকভারি ইমেজ নির্দিষ্ট করার প্রয়োজনীয়তা বাতিল করা হয়েছে, এবং recovery_dtbo_size , recovery_dtbo_offset , recovery_acpio_size , ও recovery_acpio_offset ফিল্ডগুলো এখন আর বুট ইমেজ হেডারে দেখা যায় না।

    • A/B ডিভাইসগুলো এমন একটি আপডেট ও রিকভারি স্কিম ব্যবহার করে, যার ফলে রিকভারির জন্য DTBO বা ACPIO ইমেজ নির্দিষ্ট করার প্রয়োজন হয় না।

    • যেসব নন-এ/বি ডিভাইস রিকভারি ইমেজ (DTBO অথবা ACPIO) নির্দিষ্ট করতে চায়, তাদের বুট ইমেজ হেডার ভার্সন ১ বা ২ ব্যবহার করা উচিত।

  • ডিভাইস ট্রি ব্লব (DTB)। DTB ভেন্ডর বুট পার্টিশনে সংরক্ষিত থাকে, তাই dtb_size এবং dtb_addr ফিল্ডগুলো আর বুট ইমেজ হেডারে দেখা যায় না (কিন্তু ভেন্ডর বুট ইমেজ হেডারে উপস্থিত থাকে)।

ডিভাইসগুলো জেনেরিক কার্নেল ইমেজ (GKI) আর্কিটেকচারের সাথে সামঞ্জস্য রাখতে বুট ইমেজ হেডার ভার্সন ৩ ব্যবহার করতে পারে, যা কোর কার্নেলকে একীভূত করে এবং বুটের জন্য প্রয়োজনীয় ভেন্ডর মডিউলগুলোকে vendor_boot পার্টিশনে সরিয়ে দেয় (অর্থাৎ বুট ইমেজে শুধুমাত্র GKI উপাদান থাকে)। যে ডিভাইসগুলো:

  • GKI ব্যবহার করুন (এর জন্য অ্যান্ড্রয়েড-৪.১৯ অথবা অ্যান্ড্রয়েড-৫.৪ কার্নেল প্রয়োজন), কিন্তু A/B আপডেট ব্যবহার করবেন না। বুট ইমেজের জন্য বুট ইমেজ ভার্সন ৩ এবং রিকভারি ইমেজের জন্য বুট ইমেজ ভার্সন ২ ব্যবহার করে একটি রিকভারি ইমেজ নির্দিষ্ট করা যেতে পারে।

  • GKI এবং A/B আপডেট ব্যবহার করবেন না; বুট এবং রিকভারি উভয় ইমেজের জন্য বুট ইমেজ ভার্সন ১ বা ২ ব্যবহার করে একটি রিকভারি ইমেজ নির্দিষ্ট করা যেতে পারে।

বুট ইমেজ হেডারের সংস্করণ ৩ নিম্নলিখিত বিন্যাস ব্যবহার করে।

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

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

অ্যান্ড্রয়েড ১০ বুট ইমেজ হেডারকে ভার্সন ২-এ আপডেট করে, যা রিকভারি ডিটিবি ইমেজ তথ্যের (ইমেজ সাইজ এবং ফিজিক্যাল লোড অ্যাড্রেস) জন্য একটি সেকশন যোগ করে।

বুট ইমেজ হেডারের সংস্করণ ২ নিম্নলিখিত বিন্যাস ব্যবহার করে।

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

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

অ্যান্ড্রয়েড ৯ বুট ইমেজ হেডারের unused ফিল্ডটিকে একটি হেডার ভার্সন ফিল্ডে রূপান্তরিত করে। অ্যান্ড্রয়েড ৯ সহ চালু হওয়া ডিভাইসগুলিতে অবশ্যই হেডার ভার্সন ১ বা তার বেশি সেট করা বুট ইমেজ হেডার ব্যবহার করতে হবে (এটি VTS দ্বারা যাচাইকৃত)।

বুট ইমেজ হেডারের সংস্করণ ১ নিম্নলিখিত বিন্যাস ব্যবহার করে।

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) আপডেট ব্যর্থতা প্রশমিত করতে রিকভারির জন্য একটি DTB/ACPI ওভারলে ইমেজ নির্দিষ্ট করতে পারে। (এ/বি ডিভাইসগুলোতে এই সমস্যা নেই এবং তাদের ওভারলে ইমেজ নির্দিষ্ট করার প্রয়োজন হয় না।) আপনি একটি DTBO ইমেজ অথবা একটি ACPIO ইমেজ নির্দিষ্ট করতে পারেন, কিন্তু উভয়ই নয় (কারণ এগুলো ভিন্ন ভিন্ন আর্কিটেকচারে ব্যবহৃত হয়)। বুট ইমেজ হেডারটি সঠিকভাবে কনফিগার করতে, যখন ব্যবহার করছেন:

  • রিকভারির জন্য একটি DTBO ইমেজে recovery_dtbo_size এবং recovery_dtbo_offset ফিল্ডগুলো অন্তর্ভুক্ত করুন (এবং recovery_acpio_sizerecovery_acpio_offset ফিল্ডগুলো অন্তর্ভুক্ত করবেন না)।

  • রিকভারির জন্য একটি ACPIO ইমেজে recovery_acpio_size এবং recovery_acpio_offset ফিল্ডগুলো অন্তর্ভুক্ত করুন (এবং recovery_dtbo_sizerecovery_dtbo_offset ফিল্ডগুলো অন্তর্ভুক্ত করবেন না)।

` header_size ফিল্ডটিতে বুট ইমেজ হেডারের সাইজ থাকে। যদি বুট ইমেজ হেডার ভার্সন ১-এ সেট করা থাকে, তাহলে id ফিল্ডটিতে kernel , ramdisk , এবং second sections পাশাপাশি বুট ইমেজের recovery_[dtbo|acpio] ` সেকশনের SHA-1 ডাইজেস্ট থাকে। recovery_[dtbo|acpio]_size এবং recovery_[dtbo|acpio]_offset ফিল্ডগুলো সম্পর্কে বিস্তারিত জানতে, `Recovery Images` দেখুন।

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