ARM上电启动:第一条指令来源与Uboot剖析

需积分: 50 368 下载量 75 浏览量 更新于2024-08-10 收藏 827KB PDF 举报
本文主要探讨了ARM芯片在上电后如何获取第一条指令的过程,以S3C2440作为案例,这是一种ARMv4T架构的处理器。文章首先强调,不同ARM芯片的上电初始程序计数器(PC)值并非固定,如S3C2440可能为0x0,但其他芯片可能不同。上电后,内存中通常没有数据,因此需要特定的启动流程来填充第一条指令。 启动流程中,以Norflash和Nandflash为例,这两种闪存类型在使用上有显著差异。Norflash价格较高,容量较小,适合存放程序代码,因为它有独立的地址线和数据线,支持直接运行。而Nandflash则成本低、容量大,适用于存储大量数据,其地址线和数据线共用I/O线。Norflash在启动时会被加载到处理器的内置SRAM缓冲器,然后通过片选信号映射到特定地址,CPU从这个位置开始执行。 文章深入剖析了ARM从Nandflash启动的过程,首先是Nandflash控制器自动将前4KB内容加载到内部SRAM,同时设置SRAM起始地址为0x0。这个过程完全由硬件自动完成,无需软件干预。尽管可以直接将Nandflash映射到0x0地址,但为了效率和性能,通常会先通过SRAM缓冲区进行过渡。 接下来,文章转向U-Boot(通用微控制器启动加载器)的分析,包括U-Boot的.LDS链接脚本,这是构建可执行映像的关键部分,它定义了代码和数据在内存中的布局。链接脚本分析有助于理解代码如何被组织和加载到内存中,以及对缓存、TLB等系统级硬件的管理。 重点讨论了start.S文件,这是U-Boot启动过程中的关键入口点,它负责初始化CPU状态、设置寄存器、加载和清零数据段等任务。此外,文章还提及了板级初始化、Linux内核的跳转、异常处理等内容,这些都是确保系统启动和正常运行的重要步骤。 总结来说,本文通过详细的代码解析,揭示了ARM芯片上电后获取第一条指令的流程,以及U-Boot在其中的角色,包括地址映射策略、内存管理和异常处理机制。这对于理解嵌入式系统开发和ARM处理器的工作原理具有重要的参考价值。