U-Boot启动流程详解:从硬件初始化到内核加载

需积分: 0 2 下载量 74 浏览量 更新于2024-07-29 收藏 574KB PDF 举报
"u-boot启动分析" U-Boot是一款开源的引导加载程序,广泛应用于嵌入式系统中,负责系统的初始化和加载操作系统内核。本文详细分析了U-Boot的启动流程,涵盖了从硬件设备初始化到内核加载的全过程。 1. U-Boot启动流程概述 U-Boot的启动分为两个主要阶段: 第一阶段: 1.1 硬件设备初始化:此阶段对处理器的基本硬件进行初始化,包括时钟、中断控制器等。 1.2 加载第二阶段代码到RAM:U-Boot的第一阶段代码会将第二阶段的代码从非易失性存储(如Flash)复制到RAM中。 1.3 设置栈:配置栈指针以供后续代码使用。 1.4 跳转到第二阶段:执行完第一阶段的任务后,程序控制权转交给第二阶段代码。 第二阶段: 2.1 硬件设备进一步初始化:包括更多复杂设备的初始化,如网络控制器、串口等。 2.2 内存检测:确定系统的内存布局和可用空间。 2.3 内核加载:将内核镜像从Flash读取到RAM的特定位置。 2.4 配置启动参数:设置传递给内核的参数,如设备树、内存信息等。 2.5 启动内核:调用内核的入口点,将控制权交给操作系统。 2. 第一阶段代码分析 第一阶段的代码主要由`cpu/arm920t/start.S`和`board/samsung/mini2440/lowlevel_init.S`组成。入口点由链接脚本`cpu/arm920t/u-boot.lds`指定,通常在`cpu/arm920t/start.o`中的`_start`标签。 在硬件设备初始化部分,`start.S`会设置异常处理向量,确保系统在遇到异常或中断时能正确响应。例如,设置未定义指令、软件中断、预取指令异常、数据操作异常、IRQ中断和FIQ中断的向量地址。 3. 第二阶段详解 第二阶段的代码会继续初始化更多硬件,例如设置GPIO、I2C等,并进行更深入的内存检测。同时,它会根据配置读取内核镜像(可能是从NAND Flash或其他存储设备),并将其放置在RAM中的预定位置。最后,它会设置内核启动参数,这些参数可能包括设备树 blob、命令行参数等,然后调用内核的入口点(通常在`kernel_entry`或类似的符号)启动操作系统。 总结来说,U-Boot启动流程是一个精细的初始化过程,涉及到硬件初始化、内存管理、异常处理、内核加载等多个关键环节。理解这一流程对于开发、调试和优化嵌入式系统至关重要。通过深入学习U-Boot源码,开发者可以更好地掌控系统的启动行为,解决可能出现的问题,提升系统的稳定性和效率。