linux在arm上的启动流程
嵌入式系统的开发板启动流程通常涉及从上电开始,一直到系统运行用户程序的全过程。整个流程可分为多个阶段,每一阶段都有其特定的作用。
以下是一个典型的嵌入式Linux系统(如ARM架构,常用于 STM32、瑞芯微、全志、NXP 等平台)的启动流程;
一个嵌入式 Linux 系统从软件角度看可以分为四个部分:引导加载程序(bootloader), Linux 内核,文件系统,应用程序。
---------------------------
通电/复位
↓
Boot ROM //执行ROM中固化的一小段程序。根据CPU外部管脚或efuse值来判断系统的启动方式:**NOR、NAND还是SD卡启动**
↓ ---->bootloader
SPL / MLO(Minimal Loader)(初始化RAM,加载 U-Boot)//Secondary Program Loader、(二级程序加载器),是嵌入式系统启动过程中 Bootloader 的第一阶段
↓
U-Boot(Universal Boot Loader 初始化硬件 + 加载内核)//完整Bootloader,运行于DRAM,Bootloader 的第二阶段;
//https://sourceforge.net/projects/u-boot/ 官网
---------------------------
↓ --->Linux 内核,文件系统
Linux Kernel(启动内核 + 挂载根文件系统)
↓
---------------------------
init进程(用户空间)
↓ --->应用程序
启动应用或Shell
---------------------------

1.系统上电后,会首先运行固化在芯片内部的这部分ROMCODE代码。这部分代码的主要工作就是初始化存储接口、建立存储映射。
它首先会根据CPU外部管脚或efuse值来判断系统的启动方式:NOR、NAND还是SD卡启动。
2.如果我们设置系统从NORFlash启动,这段代码就会将NORFlash映射为零地址(0x00000000),然后系统复位,
跳转到U-boot的中断向量表中的第一行代码,即NORFlash中的第一行代码去执行。
3.如果是从NAND或者SD卡启动,需要将代码拷贝到内存中执行(原因:除了SDRAM和NORFlash支持随机读写,可以直接运行代码外,
其它的Flash设备是不支持直接运行代码),但是此时DDR还没初始化,所以需要将部分代码(SPL)拷贝到芯片内部的SRAM(Static Random Access Memory)中去执行,
这部分代码进行各种初始化和拷贝等工作,最后再调到DDR内存中继续执行代码;
4.为了能达到启动Linux 内核的目的,所有的 bootloader都必须具备以下功能 :
- 初始化RAM: Linux 内核一般都会在 RAM 中运行;
- 初始化串口:Linux内核和用户交互的方式之一,一般的 bootloader 都会在执行过程中初始化一个串口做为调试端口
- 检测处理器类型 :检测系统的处理器类型,并将其保存到某个常量中提供给 Linux 内核。
Linux 内核在启动过程中会根据该处理器类型调用相应的初始化程序; - 设置 Linux启动参数:Linux内核在启动过程中会根据该启动参数进行相应的初始化工作;
- 调用 Linux内核映像: Linux内核拷贝到 RAM 中,然后跳转到 RAM 中去执行;
5.Linux内核的启动过程
- 启动 Linux 内核:call_linux(0, machine_type, kernel_params_base)。
- 开启 MMU 和 Cache,调用 decompress_kernel()解压内核
- 调用 call_kernel()进入非压缩内核 Image 的启动
- 当所有的初始化结束之后,跳到 C 程序的入口函数 start_kernel()处,开始之后的内核初始化
- start_kernel()函数会调用 rest_init()函数来进行最后的初始化,包括创建系统的第一个进程-init 进程来结束内核的启动。
- Init 进程首先进行一系列的硬件初始化,然后通过命令行传递过来的参数挂载根文件系统
- 运行用户服务程序/etc/init.d/S*app
参考链接:
https://blog.csdn.net/linus_ben/article/details/122709705
https://www.cnblogs.com/yuanqiangfei/p/15584834.html
https://zhuanlan.zhihu.com/p/41975408
https://github.com/wugsh/Linux-ARM-https://github.com/wugsh/Linux-ARM-class/blob/master
https://www.ctyun.cn/zhishi/p-350627
浙公网安备 33010602011771号