0. 总体启动过程
BootRom->Boot Loader
kernel
Init
Zygote
System Server
1. 加电和boot Rom的执行
最初上电时,时钟还未设置,没有任何初始化,只有Memory可用;
供电稳定后,从固化在CPU ASIC中的Boot ROM代码开始执行。这段代码会检测启动设备,并找到boot loader的第一阶段。然后,加载第一阶段的boot loader到internal RAM并jump执行boot loader。
2. boot loader阶段
GPL的boot loader uboot. 一般硬件厂商会出OEM的boot loader,不公开。
第一阶段的boot loader会检测并建立external RAM,然后会将第二阶段的boot loader(boot loader的主要部分)加载到external RAM,第二阶段的boot loader。
第二阶段的boot loader是第一个run起来的主要程序,可能包括:建立文件系统, 额外的内存管理、网络支持和其他功能。在移动设备或手机上,也负责加载modem CPU的代码并且设置内存保护和一些安全选项。boot loader执行完这些后,就要加载内核扔到RAM里,并会传递一些参数给内核(传递方式是把内核参数写入内存等内核启动时读取)。
这些都做好后,就跳至内核执行,通常是解压内核的代码。内核阶段会假设系统一切都正常。
3. 内核
内核启动就和PC机上的差不多了,这里就不详细写了。
等MMU可用(Mips没有MMU, ARM有 -_-b),cache初始化后,虚存就可用了,这时候也就能启动用户态进程了。init从此开始(system/core/init)。
4. Init
找init.rc(system/core/rootdir)
5. Zygote & Dalvik
init进程加载了zygote,zygote初始化Dalvik
6. system server
第一个java程序,它负责启动Android服务,frameworks/base/services/java/com/android/server/SystemServer.java
7.启动完成
广播ACTION_BOOT_COMPLETED.
阅读(1149) | 评论(0) | 转发(0) |