ARM上电启动:Uboot初始化与地址映射详解

需积分: 50 368 下载量 176 浏览量 更新于2024-08-10 收藏 827KB PDF 举报
本文档深入探讨了板级初始化在PYNQ-Z2平台上的配置和引导过程,特别关注ARMv7架构下的Uboot源码分析。首先,文章介绍了上电后第一条指令的位置,指出当Uboot烧写在NorFlash中时,启动时_start标号通常位于0x0,但如果经过relocate阶段,会移动到TEXT_BASE位置,该值在board/~/config.mk文件中指定。接着,文章详细剖析了_start和reset这两个关键部分: 1. `_start`:这是程序的起始点,包含一个跳转指令,引导程序的执行。通过`.globl _start`声明它为全局变量,用于确保在整个程序中都能访问。当上电后,程序会从_reset标号开始执行。 2. `reset`:这是一个全局函数,标志着系统复位后程序的初始状态。它可能是程序的第一条实际指令,负责设置CPU寄存器、初始化硬件设备以及执行必要的系统初始化步骤。 随后,文档进一步探讨了Uboot的链接脚本(如Uboot.lds)的重要性,因为链接脚本负责将各个模块和数据正确地放置在内存中,包括地址映射和缓存管理。文章逐个解析了start.S文件中的多个关键函数,如`cpu_init_cp15`、`cpu_init_crit`、`lowlevel_init`等,这些函数涉及CPU初始化、中断处理、内存初始化以及调用board初始化函数。 板级初始化章节中,提到了如何将代码从Flash复制到RAM并最终跳转到RAM继续执行的过程,涉及`jump_2_ram`函数。此外,文档还概述了如何从Uboot引导到Linux内核,以及Uboot的异常处理机制,包括异常向量表、异常处理函数的跳转和真正处理函数的实现。 整个文档提供了一个详尽的入门指南,帮助读者理解ARM上电启动流程中的关键步骤,以及Uboot如何与硬件交互和管理系统初始化。这对于理解和调试嵌入式系统的开发人员来说具有很高的价值。