در مقاله قبل مسیر را تا Boot ROM دنبال کردیم، یعنی همان کد کوچک و ثابتی که داخل خود SoC قرار دارد. Boot ROM نمی تواند به تنهایی تمام سخت افزار گوشی را آماده کند و قرار هم نیست Android را مستقیما اجرا کند. بعد از انجام کارهای اولیه، باید کنترل را به کد کامل تری بدهد که از حافظه دستگاه بارگذاری می شود.
از همین نقطه نام هایی مثل PBL، XBL، BROM و Preloader وارد داستان می شوند. این نام ها در نگاه اول ممکن است شبیه مجموعه ای از اصطلاحات نامرتبط به نظر برسند، اما بیشترشان نقش هایی مشابه را در پیاده سازی های مختلف بازی می کنند.
یک مسیر مشترک با نام های متفاوت
اگر اسم Vendorها را برای لحظه ای کنار بگذاریم، ساختار کلی بسیار ساده است. یک کد ثابت داخل SoC اجرا می شود، یک Bootloader اولیه را از حافظه پیدا می کند و بعد مرحله به مرحله محیط کامل تری برای اجرای Linux ساخته می شود.
ROM code inside SoC
↓
Early Bootloader
↓
DRAM / Storage / Platform initialization
↓
Main Bootloader
↓
Linux Kernel
Qualcomm و MediaTek هر دو همین مسیر کلی را دارند، اما نام Stageها، جزئیات امنیتی و نحوه پیاده سازی بین نسل های مختلف آنها فرق می کند.
| نقش کلی | Qualcomm | MediaTek |
|---|---|---|
| کد ثابت داخل SoC | PBL | BROM / BootROM |
| Bootloader اولیه رایج | XBL یا در نسل های قدیمی تر SBL | Preloader در بسیاری از محصولات Android، یا BL2 در بعضی پلتفرم ها |
| مسیر Recovery سطح پایین | EDL | BROM Download Mode |
| کد کمکی برای Flash | Programmer / Firehose | Download Agent |
این جدول یک نقشه برای فهم موضوع است، نه قانون ثابت تمام چیپ ها. Boot chain می تواند با نسل SoC و طراحی سازنده گوشی تغییر کند.
مسیر Qualcomm، از PBL به XBL
در بسیاری از SoCهای Qualcomm اولین کد Boot داخل ROM با نام PBL شناخته می شود. PBL همان نقطه شروع غیرقابل تغییر زنجیره Boot است.
PBL امکانات محدودی دارد. مرحله بعد را پیدا می کند، در دستگاهی که بوت امن فعال است اعتبار آن را بررسی می کند و سپس آن را داخل حافظه Load می کند. در نسل های جدید Qualcomm معمولا نام XBL را در این قسمت می بینیم. در نسل های قدیمی تر اصطلاح SBL هم رایج بوده است.
Qualcomm
PBL in ROM
↓
XBL / SBL
↓
More hardware becomes usable
↓
Higher level boot environment
↓
Linux
مرحله ای مثل XBL دیگر محدودیت شدید PBL را ندارد. کد آن از Storage بارگذاری شده و می تواند کارهای بیشتری انجام دهد، برای نمونه DRAM را آماده کند، بخش هایی از سخت افزار پلتفرم را راه اندازی کند و Imageهای بعدی را از حافظه بخواند.
🔍 عمیق تر بشویم، XBL در Qualcomm جدید دقیقا یک Image ساده نیست
در مستندات جدید Qualcomm ساختار Boot از مدل ساده قدیمی PBL و SBL پیچیده تر شده است. برای نمونه PBL می تواند اجزایی مانند XBL-SC و Runtime مربوط به Trust Management Engine را بارگذاری و Authenticate کند.
دانستن این جزئیات برای فهم مسیر عمومی Boot ضروری نیست. نکته اصلی این است که PBL داخل ROM فقط حداقل کار ممکن را انجام می دهد و بخش بزرگ تر راه اندازی پلتفرم به Stageهای قابل بارگذاری بعدی منتقل شده است.
EDL، مسیر نجات سطح پایین در Qualcomm
همان PBL و محیط ابتدایی Qualcomm یک مسیر جدا برای Download و Recovery هم در اختیار دارد که با نام EDL شناخته می شود. این Mode قبل از Bootloader اصلی Android قرار دارد و به همین دلیل می تواند زمانی هم قابل استفاده باشد که Fastboot یا خود Android دیگر بالا نمی آیند.
در Windows این حالت معمولا با نامی شبیه
Qualcomm HS-USB QDLoader 9008
دیده می شود.
عدد 9008 برای تعمیرکارها آشناست، چون نشان می دهد هنوز راه ارتباطی بسیار پایینی با SoC وجود دارد.
ارتباط EDL معمولا دو مرحله اصلی دارد. در ابتدا پروتکل Sahara برای برقراری ارتباط و فرستادن یک Programmer مناسب استفاده می شود. بعد از اجرای Programmer، ارتباط وارد مرحله Firehose می شود که امکاناتی مثل خواندن، نوشتن یا پاک کردن بخش های Storage را فراهم می کند.
PC
↓ USB
EDL
↓
Sahara
↓
Load Programmer
↓
Firehose
↓
UFS / eMMC operations
دیده شدن دستگاه در EDL به این معنی نیست که Android یا Bootloader اصلی سالم است. فقط می دانیم بخش بسیار ابتدایی Qualcomm هنوز توانسته مسیر EDL را فعال کند و با PC ارتباط برقرار کند. همین موضوع برای گوشی Brick شده می تواند بسیار ارزشمند باشد.
در دستگاه های امن، EDL هم لزوما اجازه اجرای هر Programmer دلخواهی را نمی دهد. بسته به پلتفرم و سیاست سازنده، Programmer ممکن است نیاز به امضای معتبر داشته باشد.
مسیر MediaTek، از BROM به Preloader
در MediaTek اولین کد داخل SoC معمولا با نام BROM یا BootROM شناخته می شود. از نظر جایگاه، BROM همان نقش پایه ای را دارد که PBL در Qualcomm بازی می کند.
در بسیاری از محصولات Android مبتنی بر MediaTek، مرحله بعد با نام Preloader شناخته می شود. Preloader یک Early Bootloader است که از Storage بارگذاری می شود و یکی از کارهای مهم آن آماده سازی سخت افزار اولیه، مخصوصا DRAM، برای Stageهای بعدی است.
MediaTek
BROM in SoC
↓
Preloader
↓
DRAM / Platform initialization
↓
Later boot stages
↓
Linux
اینجا یک تفاوت مهم در نام گذاری وجود دارد. Preloader اصطلاح عمومی برای تمام معماری های ARM یا تمام Androidها نیست. این نام را بیشتر در مسیر Boot محصولات MediaTek می بینیم. در پلتفرم های دیگر MediaTek ممکن است همان نقش با نام BL2 یا Stageهای دیگری دیده شود.
🔍 عمیق تر بشویم، Preloader تنها مدل Boot در MediaTek نیست
حتی داخل خانواده MediaTek هم Boot stack یکسان نیست. مستندات Android بعضی پلتفرم های MediaTek مسیر Preloader به عنوان BL2 و سپس LK را نشان می دهند. در مقابل بعضی پلتفرم های جدیدتر و محصولات غیر موبایلی می توانند از TF-A، BL2 و U-Boot استفاده کنند.
بنابراین در این مجموعه وقتی از Preloader صحبت می کنیم منظور یک Stage بسیار رایج در دستگاه های Android مبتنی بر MediaTek است، نه یک قانون همیشگی برای تمام SoCهای این شرکت.
BROM و Download Agent، مسیر Download در MediaTek
BROM در MediaTek علاوه بر Boot عادی می تواند با Host از طریق USB وارد مسیر Download شود. در این حالت ابزار روی PC یک Download Agent (DA) را برای دستگاه می فرستد.
Download Agent بعد از اجرا امکانات بیشتری در اختیار ابزار Flash قرار می دهد. برای نمونه می تواند DRAM یا Storage را آماده کند و امکان کار با eMMC یا UFS را فراهم کند.
PC / Flash Tool
↓ USB
BROM
↓
Download Agent
↓
DRAM / Storage initialization
↓
Flash operations
این مسیر هم می تواند تحت کنترل Secure Boot باشد. MediaTek قابلیتی برای DAA دارد که در صورت فعال بودن، BROM قبل از اجرای Download Agent اعتبار آن را بررسی می کند. پس ورود به BROM به معنی کنار رفتن امنیت دستگاه نیست.
BROM Mode و Preloader Mode، دو نقطه متفاوت از مسیر
در ابزارهای تعمیر و Flash دستگاه های MediaTek ممکن است اصطلاح BROM Mode و Preloader Mode را ببینیم. این دو نام سرنخ خوبی درباره جایی هستند که دستگاه در زنجیره Boot به آن رسیده است.
- BROM Mode، ارتباط هنوز در سطح Boot ROM داخل خود SoC برقرار شده است.
- Preloader Mode، سیستم حداقل تا جایی پیش رفته که Preloader اجرا شده و رابط مربوط به آن در دسترس قرار گرفته است.
به همین دلیل وقتی یک گوشی فقط در BROM دیده می شود، شرایط با دستگاهی که Preloader آن اجرا می شود یکسان نیست. برای عیب یابی همین تفاوت می تواند اطلاعات مهمی درباره محل توقف Boot بدهد.
از روی Mode دستگاه می توان حدس زد Boot تا کجا پیش رفته است
| وضعیتی که روی PC می بینیم | برداشت کلی |
|---|---|
| Qualcomm EDL / 9008 | مسیر بسیار ابتدایی Qualcomm و EDL هنوز در دسترس است |
| MediaTek BROM | Boot ROM فعال است، Stage بعدی ممکن است هنوز اجرا نشده باشد |
| MediaTek Preloader | Boot تا اجرای Preloader پیش رفته است |
| Fastboot | Boot chain از Stageهای اولیه عبور کرده و به Bootloader سطح بالاتری رسیده است |
این نگاه در تعمیرات بسیار کاربردی است. اگر دستگاه فقط در یک Mode بسیار پایین دیده شود، انتظار داشتن Fastboot منطقی نیست، چون هنوز Boot chain به آن مرحله نرسیده است. برعکس، اگر Fastboot در دسترس باشد می دانیم چند مرحله قبلی با موفقیت اجرا شده اند.
Qualcomm MediaTek
PBL BROM
↓ ↓
XBL / SBL Preloader / BL2
↓ ↓
Higher boot stages Higher boot stages
↓ ↓
Main Bootloader Main Bootloader
↓ ↓
Linux Linux
Recovery:
EDL → Sahara → Programmer BROM → Download Agent
↓ ↓
Firehose Flash
پس تفاوت اصلی فقط در چند اسم نیست. هر Vendor Boot stack، سیاست امنیتی و ابزارهای Recovery خودش را دارد. اما اگر نقش هر Stage را بشناسیم، اصطلاحات مختلف دیگر آن قدر پراکنده و گیج کننده به نظر نمی رسند.
بعد از کد ثابت داخل SoC، کنترل به Bootloaderهای قابل بارگذاری منتقل می شود. در Qualcomm معمولا با PBL و بعد XBL یا SBL روبه رو می شویم، در بسیاری از دستگاه های MediaTek مسیر از BROM به Preloader می رسد. در کنار Boot عادی، هر دو خانواده مسیرهای سطح پایین برای Recovery و Flash هم دارند.
واژه نامه کوتاه
- PBL
- Primary Boot Loader، اولین کد Boot داخل ROM در بسیاری از Qualcommها.
- XBL
- eXtensible Boot Loader، یکی از Bootloaderهای اولیه رایج در Qualcommهای جدیدتر.
- SBL
- Secondary Boot Loader، نام مرحله دوم Boot در بعضی نسل های قدیمی Qualcomm.
- EDL
- Emergency Download Mode، مسیر Recovery و Download سطح پایین Qualcomm.
- BROM
- BootROM، کد ثابت اولیه داخل SoCهای MediaTek.
- Preloader
- Early Bootloader رایج در بسیاری از دستگاه های Android مبتنی بر MediaTek.
- DA
- Download Agent، کدی که BROM برای عملیات Download و Flash بارگذاری می کند.
- DAA
- Download Agent Authentication، بررسی اعتبار DA پیش از اجرای آن.