Bootstrap启动过程分析

本文详细阐述了Linux系统的三级启动过程,重点关注第二级启动——Bootstrap。Bootstrap负责初始化硬件、设置时钟、加载U-Boot到SDRAM。lds文件格式、crt0_gnu.s文件流程、时钟配置及Main.c的硬件初始化和程序加载过程被深入探讨。通过对Makefile的分析,揭示了编译和加载U-Boot到DataFlash或NandFlash的细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linux 启动过程描述 

Linux的启动可分为三级,

Ø 第1级内嵌于AT91SAM9260内部

Ø 第2级为BootStrap

Ø 第3级为U-Boot

1

 

AT91SAM9260 的内嵌存储器有一个32KBROM0x10,0000 ~ 0x10,7FFF),两个4KBRAM0x20,0000 ~0x20,0FFF 与 0x30,0000 ~ 0x30,0FFF)。

启动时,BMS=1REMAP=0,芯片从内部ROM启动,该启动程序即上面所述的第1级引导程序,该引导程序将DataFlash / NandFlash /SMA-BA程序下载到SRAM0,后执行重映射,将SRAM0映射到地址0x00,0000。重新进行引导。

 

关于如何判断DataFlash / NandFlash内是否有有效的程序镜像,依据如下:

检测前28个字节(对应于ARM异常向量),DataFlash 引导程序寻找有效的应用。这些字节必须是跳转或装载PC(偏移地址装载)等ARM指令。

6个向量(0x14),包含了需要下载的镜像的尺寸。用户必须利用自己的向量替换之。(在NANDFlash Boot中,无需在第6向量指定下载镜像的尺寸,而是固定下载4096个字节)

2级(BootStrap

其功能如下:

Ø 初始化时钟、PIO等设置

Ø 初始化PIOPMCSDRAM等外设

Ø 初始化DataFlashNandFlash

Ø 从DataFlashNandFlash中装载U-BootSDRAM,并跳转执行

lds 文件格式

crt0_gnu.s 文件流程

 

 

文件注解如下:crt0_gnu.s

芯片时钟

时钟生成器共生成如下四个时钟:

Ø SCLK:慢速时钟,唯一一个永久运行的时候

Ø MAINCK:主振荡器输出的时钟,也叫Main Clock

Ø PLLACKPLLA 输出的时钟

Ø PLLBCKPLLB 输出的时钟

 

利用上述四个时钟,电源管理芯片提供如下5个时钟

Ø MCK :也叫Master Clock

Ø PCK :处理器时钟

Ø 外设时钟:通常是MCK

Ø UHPCK USB主机所需时钟

Ø 可编程时钟输出: PCKx管脚的输出 

Main.c

包括硬件初始化、从DataFlash/NandFlash装载U_Boot程序两部分

hw_Init函数

 

其中SDRAM的初始化是按照Datasheet描述进行的,需要说明的是刷新时间:存储体中电容的数据有效保存期上限是64ms, 此处每个BANK8092行,行时间间隔为7us,则总共需要57ms

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Load_df函数

 

load_nandflash函数

NandFlash 信息结构说明:

 

 

流程图如下:

Makefile 

在该Makefile中,包含了.config、driver/*.mk、board/$(BOARD)/$(BOARD).mk等文件,其中BOARD在.config文件中有定义,定义为:at91sam9260ek;

Makefile文件中所需要编译的文件在:driver/driver.mk中,为变量COBJS-y所定义,至于该程序是从NandFlash还是DataFlash加载U-boot,是由CONFIG_NANDFLASHCONFIG_DATAFLASH所指定,这两个常数在.config有定义(可仅定义需要编译的代码)。

编译过程中所包含头文件由PROJECT所指定,在顶层Makefile中有INCL=board/$(BOARD)/$(PROJECT),其中INCL在后面是作为-I的参数使用,表示编译过程中可查找头文件的目录。

board/$(BOARD)/$(BOARD).mk中所定义的两个参数:

n LINK_ADDR ld链接命令时使用,作为链接过程的基地址(也即是日后程序运行的地方)

n TOP_OF_MEMORY:在gcc时使用,做堆栈底部使用

这两个地址均为内部SRAM的地址。

在这个Makefile文件内,没有调用gcc的地方,按照make的缺省规则,CCCFLAGCPPFLAG等变量代表了编译过程中调用的命令以及参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值