上电与Bootloader加载阶段
ARM系统上电后,CPU首先执行固化在ROM或Boot ROM中的代码,完成硬件初始化(如时钟设置、内存控制器配置等),这一阶段称为“第一阶段引导程序”(FSBL,First Stage Boot Loader),随后,FSBL加载第二阶段引导程序(如U-Boot)到内存中,并跳转执行,U-Boot作为主流Bootloader,在ARM Linux启动中扮演关键角色:它负责初始化必要的硬件(如串口、存储设备),加载Linux内核镜像(通常为zImage或Image格式)和设备树文件(DTB,Device Tree Blob)到指定内存地址,并通过启动参数(如bootargs)向内核传递根文件系统位置、内存布局等关键信息,U-Boot通过bootm或bootz命令跳转到内核入口点,完成引导交接。

内核入口与解压阶段
内核入口点位于arch/arm/kernel/head.S中的stext(Start Text)标签,此时CPU处于SVC模式(管理模式),MMU和D-cache、I-cache均处于关闭状态,内核使用临时堆栈(通常通过Bootloader设置的sp寄存器确定),若内核镜像为压缩格式(zImage),stext会先调用decompress_kernel进行解压,生成 uncompressed 的内核镜像(Image);若为非压缩镜像,则直接跳转至start_kernel,解压过程中,内核会重置页表、设置临时映射,确保后续初始化能正常访问内存。
架构相关初始化
start_kernel是内核C语言层面的入口点(位于init/main.c),但在此之前,ARM架构会执行一系列底层初始化,包括:
- 设置异常向量表:通过
trap_init初始化ARM的异常向量(如未定义指令、中断、快速中断等),为后续内核异常处理做准备。 - 内存管理初始化:调用
mm_init,建立页表、初始化内存管理单元(MMU),并开启MMU和D-cache,使内核能通过虚拟地址访问内存。 - 处理器核心初始化:通过
cpu_init设置CPU ID、缓存对齐参数,并初始化本地定时器(local timer)。
通用内核初始化
进入start_kernel后,内核开始执行通用初始化流程,核心任务包括:

- 调度器初始化:
sched_init初始化内核调度器,就绪运行队列(runqueue)和调度类(如CFS)。 - 控制台初始化:
console_init注册串口控制台(如earlycon),方便内核启动过程中打印日志。 - 中断初始化:
init_IRQ初始化中断控制器(如GIC),注册中断处理函数,使能系统中断。 - 内存管理完善:
meminfo和free_area_init根据设备树中的内存节点,初始化物理内存分区和伙伴系统。 - 设备模型初始化:
driver_init初始化设备模型核心组件(如kobject、bus_type),为后续驱动加载奠定基础。
设备树解析与驱动初始化
ARM Linux依赖设备树(Device Tree)描述硬件拓扑,内核通过unflatten_device_tree将DTB解析为struct device_node树状结构,并生成platform_device节点,随后,内核通过of_platform_populate遍历设备树,为每个兼容(compatible)属性匹配的设备创建platform_device,并通过总线机制(如platform总线)加载对应驱动,驱动初始化过程中,probe函数会被调用,完成硬件资源(如地址、中断号)申请和硬件配置,串口驱动会初始化UART控制器,网卡驱动会配置MAC地址和PHY芯片。
根文件系统挂载与用户空间启动
当硬件初始化完成后,内核需要挂载根文件系统以启动用户空间,通过启动参数root=指定根文件系统类型(如ext4、nfs)和设备(如/dev/mmcblk0p2),内核调用mount_root完成挂载,随后,内核在根文件系统中查找init程序(通常位于/sbin/init、/bin/systemd等路径),并通过kernel_init调用execve执行init进程。init进程作为用户空间的第一个进程,会启动系统服务(如systemd、init)、挂载其他文件系统(如/proc、/sys),并最终启动登录界面或服务进程,完成整个启动流程。
相关问答FAQs
Q1:ARM Linux内核启动过程中,Bootloader和内核通过什么机制传递硬件信息?
A:早期ARM Linux通过ATAGS(Tagged List)传递硬件信息(如内存大小、根文件系统位置),但ATAGS灵活性有限,当前主流方式是使用设备树(Device Tree),Bootloader将设备树二进制文件(DTB)加载到内存,并通过启动参数fdt_high和fdt_addr告知内核DTB的地址,内核解析DTB后,可获取CPU节点、内存节点、外设节点等硬件信息,实现硬件描述与内核的解耦。

Q2:内核启动过程中,如果设备树解析失败,会导致什么问题?
A:设备树是ARM Linux识别硬件的核心配置文件,解析失败会导致内核无法获取必要的硬件资源(如内存基地址、外设寄存器地址、中断号等),具体表现为:内核在unflatten_device_tree阶段打印错误日志(如“Failed to unflatten device tree”),后续of_platform_populate无法创建platform_device,对应驱动加载失败,最终可能导致系统无法启动(如卡在“Waiting for root device filesystem”或直接panic)。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复