ARMLinux启动过程是一个涉及硬件初始化、引导加载程序、内核加载及用户空间启动的复杂流程,其严谨的分阶段设计确保了系统从上电到可用状态的稳定过渡,以下从硬件启动到用户空间就绪,分阶段解析这一过程。

硬件初始化与Boot ROM启动
当ARMCPU上电后,首先执行固化在芯片内部ROM中的 Boot ROM 代码,这一阶段是硬件层面的基础初始化,主要完成以下任务:
- CPU核心初始化:复位ARM核心(如Cortex-A系列),设置处理器模式(通常为SVC模式,即管理模式),并禁用中断,确保后续初始化不被干扰。
- 时钟与电源配置:初始化系统时钟源(如晶振、PLL),配置CPU、外设所需的频率,并对必要的电源域上电,确保硬件模块正常工作。
- 引导介质选择:Boot ROM根据预设的启动模式(如通过引脚配置、熔丝设置或环境变量)确定引导介质,常见的有eMMC、SD卡、NAND Flash、Nor Flash或网络(TFTP),若启动模式为“SD卡 Boot”,Boot ROM会尝试从SD卡的特定分区(如第0扇区)读取引导程序。
- 加载引导加载程序的第一阶段(SPL):Boot ROM将引导介质中的前段代码(如U-Boot的SPL,Secondary Program Loader)加载到RAM中(通常是DDR SDRAM),并跳转到SPL的入口地址执行,至此,硬件层面的初步初始化完成,控制权移交至软件引导阶段。
引导加载程序(U-Boot)加载与执行
U-Boot(Universal Boot Loader)是ARMLinux系统中广泛使用的引导加载程序,其功能包括硬件初始化、内核加载、设备树传递及系统参数配置,U-Boot的执行可分为两个阶段:
- SPL阶段:SPL是U-Boot的精简版,负责初始化关键硬件,特别是DDR控制器,由于Boot ROM加载的代码空间有限,SPL需先配置DDR内存,为后续加载完整的U-Boot和内核腾出运行空间,完成DDR初始化后,SPL会将完整的U-Boot代码从引导介质加载到RAM中,并跳转执行。
- U-Boot Proper阶段:完整的U-Boot启动后,会进一步初始化外设(如串口、网口、存储控制器),加载环境变量(如
bootcmd、bootargs),并解析启动参数,随后,U-Boot根据配置加载Linux内核镜像(如zImage或Image)和设备树文件(DTB,Device Tree Blob),设备树是ARMLinux的关键数据结构,用于描述硬件资源(如内存地址、外设节点、中断号),解决硬件配置差异化的兼容性问题,U-Boot将内核和设备树加载到RAM的指定地址,通过设置启动参数(如bootargs指定根文件系统位置)后,跳转到内核入口地址,启动内核。
Linux内核启动
内核启动是系统从引导程序到操作系统的核心过渡阶段,主要完成内核初始化、硬件驱动加载及根文件系统准备:

- 内核解压与自身初始化:若内核为压缩格式(如
zImage),会先解压到内存;若为Image(非压缩格式),则直接执行,内核随后进行自身初始化,包括:- 设置内存管理单元(MMU),开启虚拟内存映射;
- 初始化进程调度器、中断控制器(如GIC)和系统调用表;
- 识别CPU类型(如ARMv7、ARMv8)并架构相关代码。
- 设备树解析与驱动加载:内核通过解析DTB文件,获取硬件拓扑信息,按需加载对应驱动(如串口驱动、存储驱动、网卡驱动),对于需要早期初始化的硬件(如控制台、定时器),内核会直接调用驱动代码;对于非关键外设,则通过模块(
.ko文件)延迟加载。 - 启动第一个用户空间进程:完成内核初始化后,内核会查找根文件系统(通过
bootargs中的root=参数指定),若使用initramfs(内存根文件系统),则先挂载initramfs并执行其中的init程序;若直接挂载磁盘根文件系统(如ext4),则等待init进程启动,内核通过execve系统调用启动第一个用户空间进程(通常是/sbin/init),标志着内核启动阶段结束。
根文件系统挂载与用户空间初始化
用户空间初始化是系统从“可用”到“就绪”的最后阶段,由init进程(或systemd等现代init系统)主导:
: init进程是所有用户空间进程的祖先,其PID始终为1,传统系统中,init可能读取/etc/inittab配置文件;现代系统(如Debian、Ubuntu)则多采用systemd,通过/lib/systemd/systemd作为init进程,并行启动服务,提高效率。- 文件系统挂载与服务启动:
init系统会按需挂载根文件系统下的其他分区(如/home、/var),并启动必要的服务(如网络服务、日志服务、安全服务),若系统使用initramfs,init会在完成硬件初始化(如挂载磁盘根文件系统)后,切换到真实根文件系统并继续执行。 - 用户交互界面启动:对于带图形界面的系统(如嵌入式Linux桌面),
init会启动显示管理器(如lightdm、gdm),加载图形驱动(如DRM、KMS),最终启动登录界面(如GDM登录界面);对于无图形界面的系统(如服务器、工控设备),则直接启动命令行终端(如bash),等待用户登录,至此,ARMLinux系统完成全部启动流程,进入可用状态。
相关问答FAQs
Q1:ARMLinux启动过程中设备树(DTB)的作用是什么?为什么x86系统通常不需要设备树?
A:设备树(DTB)是ARMLinux中描述硬件资源的数据结构,以“节点-属性”形式定义硬件拓扑(如CPU核心数量、内存地址范围、外设寄存器地址、中断号等),由于ARM硬件平台高度碎片化(不同厂商、型号的板卡硬件配置差异大),设备树实现了硬件描述与内核代码的解耦,使同一内核可适配多种硬件,而x86系统硬件标准化程度高(如PC架构由Intel/AMD主导,主板遵循标准规范),BIOS/UEFI已固定硬件资源,因此无需设备树,内核可直接通过BIOS提供的接口获取硬件信息。
Q2:为什么有些ARMLinux系统需要initramfs,而有些可以直接挂载磁盘根文件系统?
A:initramfs(内存根文件系统)是一个临时的、小型的根文件系统,主要用于解决“先有鸡还是先有蛋”的问题:若磁盘根文件系统的存储驱动(如SATA控制器、USB存储器)需要内核模块加载,而模块又位于磁盘上时,内核无法直接访问磁盘,initramfs中会预加载必要的驱动和工具(如insmod、mount),内核启动后先挂载initramfs,在initramfs中加载磁盘驱动,再挂载真实根文件系统,对于硬件驱动已编译进内核(非模块)或存储驱动简单的系统(如eMMC直接挂载),则可直接跳过initramfs,内核直接挂载磁盘根文件系统。

【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复