Android 启动流程
一 Bootloader 阶段
在嵌入式系统中,Bootloader的引导过程与传统的PC环境有所不同,主要是因为嵌入式系统的硬件配置和应用场景更加多样化。以下是嵌入式系统中Bootloader被引导的一般流程:
1. 硬件复位
当嵌入式设备上电或复位时,处理器会执行一个预定义的启动序列。通常,这包括设置CPU寄存器到默认状态,并开始从一个固定的内存地址(通常是ROM或者Flash)读取指令。
2. 初始Bootloader阶段
- 直接固件加载:某些嵌入式处理器设计为直接从特定位置(如内部ROM)运行代码。这段代码非常小且简单,其主要任务是初始化一些关键的硬件组件(如内存控制器),以便后续可以从外部存储器(如NOR Flash、NAND Flash、SD卡等)加载更复杂的Bootloader程序。
- Boot ROM:许多现代嵌入式处理器包含一个小型的Boot ROM,它知道如何处理不同类型的启动介质(比如SPI Flash、eMMC、USB等)。这个Boot ROM负责定位并加载第一个真正的Bootloader映像到内存中。
3. 主Bootloader阶段
- 硬件初始化始化
- 环境变量设置
- 加载操作系统内核和文件系统
- 传递控制给操作系统
第一阶段:
1、硬件设备初始化:
关闭看门狗、关中断、启动ICACHE、关闭DCACHE和TLB,关闭MMU、设置时钟频率、RAM初始化等。
2、为加载BootLoader的第二阶段准备RAM空间
3、复制BootLoader的第二阶段代码到RAM空间中
4、设置好栈
5、跳转到第二阶段代码的C入口处
第二阶段:
1、初始化本阶段要使用的硬件设备
2、检查系统内存映射(memory map):就是确定板子使用了多少内存,他们的地址空间是什么。
3、将内核映象和根文件映象从flash上读到RAM空间中
4、为内核映象设置启动参数
5、调用内核
二 kernel 阶段
1. 内核启动
当内核映像被加载到内存后,内核开始执行:
初始化硬件:例如内存管理、中断、定时器等。
加载 init 进程:这是 Linux 系统中的第一个用户空间进程,通常在 Android 中是 init 进程。
2. init 进程启动
init 进程是 Android 系统中非常重要的一个组件,它负责:
挂载文件系统:例如 /system 和 /data。
启动关键服务:如 zygote、SurfaceFlinger、InputManager 等。
执行 rc 文件:这些文件定义了系统启动时需要运行的脚本和服务。
3. Zygote 进程
在 init 进程中,会启动 Zygote 进程,这是 Java 虚拟机(JVM)的一个实例,用于孵化其他 Java 应用进程。Zygote 负责:
预加载类:减少后续应用启动时间。
孵化应用进程:如 Android 应用和系统服务。