ARM + Linux 开发指南
随想:想写一个系列来讲如何嵌入式开发,然后能形成一个知识体系,帮助那些刚刚做嵌入开发的同学们.
1. ARM Linux从开机到Linux完全启动的流程和代码分析
ARM Linux从开机到完全启动的流程与代码分析
ARM Linux的启动过程主要涉及从设备上电开始,到Linux内核完全启动并进入用户空间的整个过程。这个过程通常分为多个阶段,涉及硬件初始化、Bootloader引导、内核加载、内核初始化、用户空间启动等几个关键环节。以下将详细介绍这个过程及其代码分析。
1. 系统启动流程概览
- 芯片上电(电源管理):硬件复位后,CPU 从 Boot ROM 中启动。
- 引导程序(Bootloader):第一阶段引导(FSBL)和第二阶段引导(如 U-Boot)初始化硬件,加载内核,并传递启动参数。
- 内核加载:Bootloader(如 U-Boot)加载 Linux 内核映像,并传递必要的启动参数。
- 内核初始化:Linux 内核启动,进行硬件检测和初始化,包括内存、CPU、设备树等。
- 用户空间启动:内核初始化完成后,启动
init
进程,用户空间的所有服务和应用程序开始运行。
2. ARM Linux 启动流程详细分析
2.1 芯片上电与Boot ROM启动
- ARM 系统上电后,CPU 首先会执行 Boot ROM(即硬件内部的引导代码)。它通常是厂商定制的,负责最初的硬件初始化(如时钟、内存、外设配置等),并将引导程序(Bootloader)加载到内存中。
- Boot ROM 通常比较简单,只完成硬件的最基本初始化工作,不会有复杂的功能。
2.2 第一阶段引导(FSBL)
- FSBL(First Stage Bootloader) 是在 ARM 系统启动时最先执行的代码。它的作用是对硬件进行初始化,并加载第二阶段引导程序(如 U-Boot)。
- FSBL 的任务:
- 初始化 RAM(内存控制器配置)。
- 初始化处理器(CPU、时钟、外设等)。
- 设置引导介质(比如 NAND Flash、eMMC、SD 卡等)。
- 加载第二阶段引导程序(例如 U-Boot)到内存。
在 FSBL 完成其工作后,它会将控制权转交给第二阶段引导(SBL)。
2.3 第二阶段引导(U-Boot)
- U-Boot 是 ARM 系统中常用的第二阶段引导程序,它的主要功能是:
- 进一步初始化硬件(包括更多外设和 I/O)。
- 加载 Linux 内核映像到内存。
- 配置设备树(Device Tree),为内核提供硬件信息。
- 配置启动参数(如根文件系统、内核命令行)。
- 启动 Linux 内核。
在启动过程中,U-Boot 会通过读取存储设备(如 eMMC、NAND Flash、SD 卡)来获取内核映像、设备树和根文件系统镜像,并将它们加载到内存。
// U-Boot 加载 Linux 内核
void load_kernel_image(void) {if (load_image_from_storage("kernel.img", KERNEL_ADDR) != 0) {printf("Failed to load kernel image\n");return -1;}return 0;
}// 启动内核
void start_kernel(void) {// 配置启动参数setup_bootargs();/