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 → /initVendor 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 initSELinux
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 exampleProperty 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