Bootloader حالا Kernel، ramdisk و Device Tree را در RAM گذاشته و به Kernel entry پریده است. از این لحظه Linux کنترل را می‌گیرد، اما هنوز Android Framework وجود ندارد.

Kernel early boot

Kernel architecture setup، MMU/page tables، memory allocator، scheduler، interrupt subsystem و driver framework را آماده می‌کند. Driverها با کمک Device Tree و firmware interfaces Hardware را probe می‌کنند.

Bootloader → Kernel entry → memory/MMU → scheduler/IRQs → drivers → initial root → /init

Vendor kernel modules

در GKI بسیاری از Driverهای Vendor به شکل Module جدا هستند. Moduleهایی که برای دسترسی به Storage یا filesystemهای اولیه ضروری‌اند باید خیلی زود از vendor ramdisk Load شوند.

initramfs و /init

Kernel filesystem اولیه داخل RAM را mount می‌کند و در نهایت executable مهم /init را اجرا می‌کند. این Process PID 1 می‌شود و نقطه ورود اصلی Android userspace است.

اینجا یک مرز مهم است: Kernel Boot تمام نشده به معنی Android Boot تمام‌شده نیست؛ فقط اولین userspace Android شروع شده است.

First-stage init

  • Load کردن moduleهای early boot
  • خواندن fstab
  • ساخت Device Mapper mappingهای Dynamic Partition
  • برقرار کردن AVB/dm-verity mappingها
  • Mount کردن system/vendor/product و partitionهای لازم
  • آماده‌سازی transition به second-stage init
/init (ramdisk)
  ↓
first-stage init
  ├─ modules
  ├─ logical partitions
  ├─ dm-verity
  └─ mounts
  ↓
second-stage init

SELinux

Android از SELinux به‌عنوان Mandatory Access Control استفاده می‌کند. Early init policy را Load و enforcement environment را برقرار می‌کند تا serviceهای بعدی داخل domainهای محدود اجرا شوند.

Second-stage init

بعد از آماده شدن filesystemها، init فایل‌های rc، propertyها، service classها و triggerها را پردازش می‌کند و daemonهای Android را Start می‌کند.

init.rc Bash نیست

Android init زبان configuration خودش را دارد. serviceها و actionها با triggerهایی مثل early-init، init، late-init یا property changes تعریف می‌شوند.

service example /system/bin/example
    class core
    user system

on property:demo.ready=1
    start example

Property Service

Propertyها key/valueهای مرکزی state/configuration Android هستند. تغییر یک property می‌تواند triggerهای init را فعال کند و service lifecycle را جلو ببرد.

/data و Encryption

باز شدن /data در دستگاه جدید با File-Based Encryption و metadata encryption پیچیده است. Device Encrypted و Credential Encrypted data در زمان‌های متفاوتی قابل‌دسترسی می‌شوند؛ بنابراین Boot کامل سیستم و Unlock کامل داده کاربر یک نقطه زمانی نیستند.

ueventd

ueventd رویدادهای Device از Kernel را مدیریت می‌کند و در ساخت device node، permissionها و firmware loading نقش دارد؛ یکی از پل‌های مهم بین Kernel device model و Android userspace است.

الان کنترل دست کیست؟

Linux Kernel
  ↓ executes
/init PID 1
  ↓
first-stage init
  ↓
mount verified Android partitions
  ↓
second-stage init
  ↓
start native services
  ↓
Zygote / system_server

منابع رسمی برای مطالعه بیشتر

قبلی: Boot Imagesبعدی: init تا Homeبازگشت به مقالاتصفحه اصلی