این صفحه نحوهی پیادهسازی فایل باینری Generic Bootloader (GBL) را توضیح میدهد.
الزامات بوت سیستم عامل
برای استفاده از GBL، سیستم عامل بوت باید شرایط زیر را داشته باشد:
انطباق با رابط یکپارچه توسعهپذیر میانافزار (UEFI). میانافزار باید پروتکلهای مورد نیاز UEFI را پیادهسازی و استفاده کند. همچنین باید امکان توسعههای خاص فروشنده را با استفاده از پروتکلهای تعریفشده UEFI فراهم کند.
امنیت. این میانافزار باید تمام الزامات مربوط به Android Verified Boot (AVB) را پیادهسازی کند و GBL را قادر به تأیید اعتبار تصاویر بوت کند.
حالتهای بوت. فایل باینری باید بتواند حالتهای مختلف بوت مانند بوت معمولی، بوت ریکاوری و فست بوت را مدیریت کند.
پارتیشنبندی پویا. فریمور بوت باید منطق انتخاب اسلات را پیادهسازی کند تا از خواندن اسلات بوت A/B صحیح پشتیبانی کند و با پارتیشنهای پویا و دادههای کاربر در super سازگار باشد.
پیکربندی سیستم عامل. میانافزار باید بتواند خط فرمان هسته، درخت دستگاه (DTB) و پیکربندی بوت را با سفارشیسازیهای OEM مورد نیاز برای بوت شدن دستگاه تغییر دهد.
بارگذاری ماشین مجازی محافظتشده. فایل باینری باید در حضور ماشینهای مجازی محافظتشده، قبل از هسته اندروید، به درستی میانافزار ماشین مجازی محافظتشده از پیش تأییدشده را بارگذاری کند. برای اطلاعات بیشتر، به توالی بوت میکرودروید مراجعه کنید.
مدیریت حافظه. میانافزار بوت باید از API تخصیص حافظه UEFI پشتیبانی کند.
الزامات پیادهسازی
برای اینکه GBL به درستی روی دستگاه شما اجرا شود، باید شرایط زیر را داشته باشید:
دستگاه شما باید شامل دو پارتیشن FAT32 با حجم ۴ مگابایت (یا بیشتر) به نامهای
android_esp_aوandroid_esp_bروی یک دستگاه بلوکی باشد که توسط SOC قابل دسترسی باشد.- یک دستگاه بلوکی، یک دستگاه ذخیرهسازی است که میتوان اطلاعات را از آن خواند یا در واحدهای بلوکی روی آن نوشت. نمونههایی از این دستگاهها شامل دستگاههای UFS، eMMC و کارت SD هستند.
- FAT32 به این دلیل استفاده میشود که یک سیستم فایل فراگیر و سرراست است.
- هر دو پارتیشن برای بهروزرسانیها و بازگرداندن نسخههای قدیمی به نسخههای قدیمیتر (OTA) در طول مدت پشتیبانی از این نسخه اندروید مورد نیاز هستند.
- حجم GBL در حالت فشرده نشده تقریباً ۲ مگابایت است. ۴ مگابایت برای محاسبهی هرگونه رشد ناشی از ویژگیهای اضافی در طول هفت سال آینده کافی است.
- در صورت بهروزرسانی GBL، باید کل پارتیشن
android_esp_${SLOT_SUFFIX}را بهروزرسانی کنید. بهروزرسانی فقط GBL توسط اندروید OTA پشتیبانی نمیشود.
نسخه GBL مستقر شده باید آخرین نسخه تولیدی دارای گواهی از شاخه انتشار GBL مربوطه باشد. توصیه میکنیم نسخه GBL دارای گواهی گوگل را با استفاده از راهکار امضای دلخواه خود امضا کنید و فرادادههای ساخت و امضای حاصل را در پارتیشن
android_esp_${SLOT_SUFFIX}ذخیره کنید.- گواهی GBL باید با امضای OEM دست نخورده باقی بماند و هیچ هدری به فایل باینری اعمال نشود.
- نسخه GBL توسعهدهندگان صرفاً برای اهداف توسعه و اشکالزدایی استفاده میشود. این نسخه قابل ارسال نیست و توسط گوگل تأیید نخواهد شد.
GBL باید در مسیر
/EFI/BOOT/BOOTAA64.EFIدر پارتیشن FAT32 ذخیره شود.پروتکلهای UEFI و UEFI اندروید مورد نیاز را برای پشتیبانی از GBL پیادهسازی کنید. در صورت عدم پشتیبانی از این رابطها، نسخه تولیدی GBL بوت نمیشود.
-
EFI_BLOCK_IO_PROTOCOLیاEFI_BLOCK_IO2_PROTOCOLتصاویر بوت و تصاویر pvmfw را از دیسک دریافت میکند. -
EFI_RNG_PROTOCOLبرای قناریهای پشته، دانههای KASLR و دانههای RNG - سرویسهای تخصیص حافظه برای تخصیص حافظه اولیه برای انجام محاسبات AVB و DICE
-
EFI_SIMPLE_TEXT_OUTPUT_PROTOCOLگزینهای برای پیادهسازیهای بدون عملیات ارائه میدهد، اما GBL بهطور پیشفرض از طریق این پروتکل لاگها را ثبت میکند. -
GBL_EFI_AVB_PROTOCOLبرای تأیید تصاویر بوت به کلیدهای عمومی و شاخصهای عقبگرد دسترسی پیدا میکند. -
GBL_EFI_BOOT_CONTROL_PROTOCOLفرادادههای اسلات و دلایل بوت را از میانافزار دریافت میکند. -
GBL_EFI_AVF_PROTOCOLدادههای پیکربندی AVF را از زنجیره DICE تولید میکند.
-
پروتکلهای UEFI که اکیداً هنگام ادغام GBL توصیه میشوند، در GBL UEFI Protocols مستند شدهاند.
پشتیبانی از سیستم عامل بوت
با اصلاحات لازم برای پشتیبانی از الزامات بخش قبلی، پیادهسازیهای میانافزار UEFI زیر با GBL کار میکنند:
- EDK2 (Tianocore) . EDK2 یک پیادهسازی متنباز محبوب UEFI است. پشتیبانی GBL برای بوتلودرهای مبتنی بر EDK2 مورد نیاز است و پشتیبانی UEFI از قبل وجود دارد.
- یو-بوت . یک پروژه بوتلودر متنباز انعطافپذیر و پرکاربرد که در حال کسب سازگاری UEFI برای استفاده از GBL است.
- LittleKernel (LK) . یک بوت لودر متن باز که توسط برخی از فروشندگان استفاده میشود.
GBL را اجرا کنید
شما میتوانید یک فایل باینری GBL از پیش ساخته شده را برای اجرا تهیه کنید یا فایل باینری خودتان را بسازید و آن را اجرا کنید.
دریافت و اجرای فایل باینری GBL
GBL به صورت یک فایل باینری برنامه UEFI واحد توزیع شده است. شما میتوانید این فایل باینری را مستقل از میانافزار پایه دستگاه با استفاده از مکانیزم بهروزرسانی استاندارد اندروید بهروزرسانی کنید.
با شروع اندروید ۱۶، اگر دستگاهی مبتنی بر چیپست ARM-64 دارید، اکیداً توصیه میکنیم که آخرین نسخه GBL مورد تأیید گوگل را نصب کرده و آن را در زنجیره بوت خود ادغام کنید.
ساخت GBL
برای ساخت GBL:
تأیید کنید که ابزار repo و بوتاسترپ Bazel را نصب کردهاید:
sudo apt install repo bazel-bootstrapبا استفاده از فایل manifest
uefi-gbl-mainlineدایرکتوری فعلی خود را برای کنترل منبع مقداردهی اولیه کنید:repo init -u https://android.googlesource.com/kernel/manifest -b uefi-gbl-mainline repo sync -j16ساخت برنامه UEFI:
tools/bazel run //bootable/libbootloader:gbl_efi_dist
GBL را روی دستگاه مجازی اندروید آزمایش کنید
اجرای GBL درون Cuttlefish:
cvd start --android_efi_loader=path_to_the_UEFI_app ...به جای بوت کردن مستقیم اندروید، این دستور
cvd startاز برنامه UEFI برای بوت کردن اندروید استفاده میکند.
باگها را گزارش دهید و با تیم بوت لودر تماس بگیرید
برای گزارش یک اشکال برای GBL، به کامپوننت Android Generic Bootloader در Buganizer بروید.
برای سوالات، با تیم GBL تماس بگیرید، یا به android-gbl@google.com ایمیل ارسال کنید.