Android 9, বুট ইমেজ হেডারে একটি ভার্সন ফিল্ড যোগ করেছে, এর ফলে পুরনো মানানসইতা বজায় রেখেও হেডার আপডেট করা যায়। বুটলোডারকে অবশ্যই হেডার ভার্সন ফিল্ড চেক করতে হবে এবং সেই অনুযায়ী হেডার পার্স করতে হবে। এইসব ডিভাইস লঞ্চ করা হচ্ছে:
- Android 13, বুট হেডার ভার্সন ৩ বা ৪ ব্যবহার করতে পারে। Generic Kernel Image
(GKI)
আর্কিটেকচার কাজ করে এমন ডিভাইসের ক্ষেত্রে, ভার্সন ৪ হল প্রাথমিক বুট ইমেজ এবং বুট হেডারে
os_versionফিল্ডের মান শূন্য হতে হবে। ডিভাইস বুটলোডারকে এর পরিবর্তে Android Verified Boot (AVB) প্রপার্টি থেকে ভার্সন সংক্রান্ত তথ্য পেতে হবে। - Android 12, বুট হেডার ভার্সন ৩ বা ৪ ব্যবহার করতে পারে। জেনেরিক কার্নেল ইমেজ (GKI) আর্কিটেকচার সাপোর্ট করে এমন ডিভাইসের জন্য, ভার্সন ৪ হল প্রাথমিক বুট ইমেজ।
- Android 11, বুট হেডার ভার্সন ৩ ব্যবহার করতে পারে। জেনেরিক কার্নেল ইমেজ (GKI) আর্কিটেকচার সাপোর্ট করে এমন ডিভাইসের জন্য, প্রাথমিক বুট ইমেজের ক্ষেত্রে এই ভার্সন ব্যবহার করতে হবে।
- Android 10-এ অবশ্যই বুট হেডার ভার্সন ২ ব্যবহার করতে হবে।
- Android 9-এ অবশ্যই বুট হেডার ভার্সন ১ ব্যবহার করতে হবে।
- Android 8 ও তার আগের ভার্সনগুলি বুট ইমেজ হেডার ভার্সন ০ ব্যবহার করে বলে ধরে নেওয়া হয়।
Android 9 বা তার পরবর্তী যেকোনও ভার্সনে চলে এমন সব ডিভাইসের জন্য, ভেন্ডর টেস্ট স্যুট (VTS)
boot/recovery ইমেজের ফর্ম্যাট চেক করে যাতে বুট ইমেজ হেডার সঠিক
ভার্সন ব্যবহার করে তা নিশ্চিত করা যায়। সব কাজ করে এমন বুট ও ভেন্ডর বুট
ইমেজ হেডারে AOSP বিবরণ দেখতে, system/tools/mkbootimg/include/bootimg/bootimg.h দেখুন।
বুট ইমেজ হেডার ভার্সনিং প্রয়োগ করা
mkbootimg টুলে নিম্নলিখিত আর্গুমেন্ট ব্যবহার করা যায়।
| আর্গুমেন্ট | বর্ণনা |
|---|---|
header_version |
বুট ইমেজ হেডার ভার্সন সেট করে। হেডার ভার্সন সহ বুট ইমেজ:
|
recovery_dtbo |
DTB ব্যবহার করে এমন আর্কিটেকচারের জন্য ব্যবহার করা হয়। রিকভারি
DTBO ইমেজের পাথ নির্দিষ্ট করে। A/B ডিভাইসের জন্য ঐচ্ছিক, যার জন্য রিকভারি ইমেজের প্রয়োজন নেই।
header_version ব্যবহার করা নন-A/B ডিভাইস:
|
recovery_acpio |
DTB-র পরিবর্তে ACPI ব্যবহার করে এমন আর্কিটেকচারের জন্য ব্যবহার করা হয়। রিকভারি ACPIO ইমেজের
পাথ নির্দিষ্ট করে। A/B ডিভাইসের জন্য ঐচ্ছিক, যার জন্য রিকভারি ইমেজের
প্রয়োজন নেই। header_version ব্যবহার করা নন-A/B ডিভাইস:
|
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)
রিকভারি ইমেজ তৈরি করার সময় Android বিল্ড সিস্টেম BoardConfig ভেরিয়েবল ব্যবহার করে
BOARD_PREBUILT_DTBOIMAGE mkbootimg টুলের
recovery_dtbo আর্গুমেন্ট সেট করে।
Android ওপেন সোর্স প্রোজেক্ট (AOSP) সংক্রান্ত পরিবর্তনের ব্যাপারে বিস্তারিত জানতে, বুট ইমেজ হেডার
ভার্সনিংয়ের জন্য
সম্পর্কিত পরিবর্তন তালিকা পর্যালোচনা করুন।
বুট ইমেজ হেডার, ভার্সন ৪
Android 12-এ বুট ইমেজ
হেডার ভার্সন ৪-এ একটি boot_signature দেওয়া আছে, যা কার্নেল ও
ramdisk-এর অখণ্ডতা চেক করার জন্য ব্যবহার করা যেতে পারে। এই চেকটি
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 */
};
বুট ইমেজ হেডার, ভার্সন ৩
Android 11 বুট ইমেজ হেডারকে ভার্সন ৩-এ আপডেট করে, যা নিম্নলিখিত ডেটা সরিয়ে দেয়:
সেকেন্ড-স্টেজ বুটলোডার।
second_sizeওsecond_addrফিল্ড আর বুট ইমেজ হেডারে দেখা যায় না। সেকেন্ড-স্টেজ বুটলোডার সহ ডিভাইসকে অবশ্যই সেই বুটলোডারকে নিজস্ব পার্টিশনে স্টোর করতে হবে।রিকভারি ইমেজ। অ্যাকাউন্ট ফিরিয়ে আনার ছবি নির্দিষ্ট করার প্রয়োজনীয়তা বন্ধ করে দেওয়া হয়েছে এবং
recovery_dtbo_size,recovery_dtbo_offset,recovery_acpio_sizeওrecovery_acpio_offsetফিল্ড আর বুট ইমেজ হেডারে দেখা যায় না।A/B ডিভাইসগুলি একটি আপডেট এবং রিকভারি স্কিম ব্যবহার করে যা রিকভারির জন্য DTBO বা ACPIO ইমেজ নির্দিষ্ট করার প্রয়োজনীয়তা দূর করে।
যেসব নন-A/B ডিভাইস রিকভারি ইমেজ (DTBO বা ACPIO) নির্দিষ্ট করতে চায়, সেগুলিকে বুট ইমেজ হেডার ভার্সন ১ বা ২ ব্যবহার করতে হবে।
ডিভাইস ট্রি ব্লব (DTB)। DTB ভেন্ডর বুট পার্টিশনে স্টোর করা হয়, তাই
dtb_sizeএবংdtb_addrফিল্ড বুট ইমেজ হেডারে আর দেখা যায় না (তবে ভেন্ডর বুট ইমেজ হেডারে থাকে)।
জেনেরিক কার্নেল ইমেজ
(GKI) আর্কিটেকচার মেনে চলার জন্য ডিভাইস বুট ইমেজ হেডার ভার্সন ৩ ব্যবহার করতে পারে,
যা মূল কার্নেলকে একত্রিত করে এবং বুট করার জন্য প্রয়োজনীয় ভেন্ডর মডিউলকে
vendor_boot পার্টিশনে সরিয়ে দেয় (অর্থাৎ, বুট ইমেজে শুধুমাত্র GKI
কম্পোনেন্ট থাকে)। যেসব ডিভাইস:
GKI ব্যবহার করুন (এর জন্য android-4.19 বা android-5.4 কার্নেল প্রয়োজন) কিন্তু 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];
};
বুট ইমেজ হেডার, ভার্সন ২
Android 10, বুট ইমেজ হেডারকে ভার্সন ২-এ আপডেট করে, যা রিকভারি DTB ইমেজ সংক্রান্ত তথ্য (ইমেজের সাইজ ও ফিজিক্যাল লোড অ্যাড্রেস) যোগ করে।
বুট ইমেজ হেডার ভার্সনের ভার্সন ২ নিম্নলিখিত ফর্ম্যাট ব্যবহার করে।
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 */
};
বুট ইমেজ হেডার, ভার্সন ১
Android 9, বুট
ইমেজ হেডারের unused ফিল্ডকে হেডার ভার্সন ফিল্ডে কনভার্ট করে। Android 9-এর সাথে লঞ্চ হওয়া ডিভাইসে অবশ্যই বুট ইমেজ হেডার ব্যবহার করতে হবে, যার হেডার ভার্সন ১ বা তার বেশি হতে হবে (এটি 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 */
};
A/B নয় এমন ডিভাইস, রিকভারির জন্য DTB/ACPI ওভারলে ইমেজ নির্দিষ্ট করতে পারে, এর ফলে ওভার-দ্য-এয়ার (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 ফিল্ডে বুট ইমেজ হেডারের সাইজ থাকে। বুট ইমেজ
হেডার ভার্সন ১-এ সেট করা থাকলে, id ফিল্ডে বুট ইমেজের recovery_[dtbo|acpio] বিভাগের জন্য SHA-1 ডাইজেস্ট থাকে, এর সাথে kernel, ramdisk এবং second sections-ও থাকে। recovery_[dtbo|acpio]_size এবং recovery_[dtbo|acpio]_offset ফিল্ড সম্পর্কে
বিস্তারিত জানতে, রিকভারি ইমেজ দেখুন।
লিগ্যাসি বুট ইমেজ হেডার, ভার্সন ০
Android 9-এর আগে লঞ্চ করা ডিভাইস, যেগুলি লেগ্যাসি বুট ইমেজ হেডার ব্যবহার করে, সেগুলিকে বুট ইমেজ হেডার ভার্সন ০ ব্যবহার করা হচ্ছে বলে বিবেচনা করা হয়।
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];
};