Android系统板子上电启动流程

本文详细介绍了Android系统从上电到启动完成的整个过程,包括boot Rom加载preloader、ATF执行、LK初始化DRAM、kernel启动、init进程与zygote进程的创建。此外,还探讨了DRAM初始化的时序、LK的主要功能如线程池初始化、平台设备初始化以及Init进程在文件系统、属性服务和启动Zygote等方面的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android整体上电启动流程

在这里插入图片描述
具体流程图如下:

在这里插入图片描述

流程分析

1-3: 板子上电时,就跳转到boot Rom中去执行boot code,之后boot code中去加载preloader到ISRAM中去执行
4-6: 接着preloader跳转到EL3去执行ATF(Arm Trust firmware), ATF为ARM芯片的底层固驱动,将触发LK
7-8: 将LK从flash中copy到DRAM中去初始化,为进行启动linux kernel做准备
9-10: 解压bootimage成ramdisk跟kernel,并加载到DRAM中进行初始化dtb,开始做kernel初始化.
11-13: LK跳转到kernel初始化,kernel初始化完成,会fork出init进程, 然后, 拉起ramdisk中的init进程进入用户空间初始化验,
init进程fork出zygote进程,直到整个Android系统自动完成.
到此,整个Android系统就启动完毕,可以看Android的logo启动,最后进入桌面.

DRAM在哪得到初始化的?

由于硬件DRAM的颗粒不同,访问的timing也不同,因此,要知道DRAM如何运行,首先得知道DRAM的时序如何?DRAM的初始化是在preloader中做的,而preloader的加载地址

Linux 板子后的启动流程是一个由多个阶段组成的复杂过程,涉及到硬件初始化、引导程序加载、内核启动以及用户空间的初始化。以下是典型的 **Linux 嵌入式系统(如 ARM 架构)板子后的完整启动流程**。 --- ## ✅ Linux 板子后完整启动流程详解 ### 🔹 第一阶段:上复位 → BootROM - **BootROM** 是芯片厂商固化在芯片内部的一段代码,是系统后执行的第一段程序。 - **主要功能:** - 初始化基本的时钟和内存控制器 - 判断启动设备(如 SD 卡、NAND、SPI Flash、USB 等) - 从启动设备加载第一阶段引导程序(通常是 SPL 或 U-Boot 的前一部分) --- ### 🔹 第二阶段:加载并执行 SPL(Secondary Program Loader) - **SPL** 是 U-Boot 的一部分,体积非常小,用于加载完整的 U-Boot。 - **主要功能:** - 初始化 DDR 内存控制器 - 加载 U-Boot 主体到内存 - 跳转执行 U-Boot > 注:有些平台可能没有 SPL,而是直接加载完整的 U-Boot。 --- ### 🔹 第三阶段:U-Boot(Universal Boot Loader) - U-Boot 是一个功能强大的引导程序,负责进一步初始化硬件并加载 Linux 内核。 - **主要功能包括:** - 初始化串口、网络、NAND、SD/MMC 等外设 - 加载设备树(.dtb)和 Linux 内核镜像(zImage/Image/uImage) - 设置启动参数(bootargs) - 跳转执行 Linux 内核 --- ### 🔹 第四阶段:加载并启动 Linux 内核 1. **加载内核镜像到内存** - U-Boot 将内核镜像从存储介质(如 SD 卡、NAND、网络)加载到内存中(如 0x80000000) 2. **加载设备树(Device Tree)** - 设备树描述了硬件信息,内核根据设备树初始化硬件驱动 3. **启动内核** - U-Boot 调用 `bootm` 或 `bootz` 命令跳转到内核入口函数 --- ### 🔹 第五阶段:Linux 内核启动流程 1. **start_kernel()** - 内核入口函数,相当于内核的 main() 函数 - 初始化内存管理、进程调度、中断、时钟、调度器等核心组件 2. **setup_arch()** - 架构相关的初始化(如 ARM 架构) 3. **rest_init()** - 创建 0 号进程(idle 进程)和 1 号进程(init 进程) 4. **启动 init 进程** - 加载 initramfs(如果有) - 挂载根文件系统 - 执行 `/sbin/init`(或 `/init`)启动用户空间初始化程序 --- ### 🔹 第六阶段:用户空间初始化(init 进程) 1. **sysvinit / systemd / BusyBox init** - 根据系统配置使用不同的初始化系统: - sysvinit(传统 init) - systemd(现代主流) - BusyBox init(嵌入式常用) 2. **启动系统服务** - 启动 udev、网络、登录服务、GUI 等 3. **启动终端或图形界面** - 启动 getty 或图形登录界面(如 GDM) --- ## ✅ 启动流程图示(简化) ``` 上复位 ↓ BootROM(芯片内置) ↓ 加载 SPL(可选) ↓ 加载 U-Boot 主体 ↓ 加载 Linux 内核 + 设备树 ↓ 启动 Linux 内核 ↓ 内核初始化核心子系统 ↓ 挂载根文件系统启动 init 进程 ↓ 启动系统服务和用户界面 ``` --- ## ✅ 总结 | 阶段 | 组件 | 功能 | |------|------|------| | 1 | BootROM | 上后执行的第一段代码,加载 SPL 或 U-Boot | | 2 | SPL | 初始化 DDR,加载完整 U-Boot | | 3 | U-Boot | 初始化外设,加载内核和设备树,跳转执行内核 | | 4 | Linux 内核 | 初始化核心子系统,挂载根文件系统 | | 5 | init 进程 | 启动系统服务,进入用户空间 | --- ##
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值