ARM平台的启动流程
一 fs4412(SOC:samsung,exynos4412) 启动
硬件信息
SOC : 三星 exynos4412 (4个cortex-A9 ARM核) 主频 1.4GHZ
board : origen<->fs4412
u-boot版本 : u-boot-2013.01
1.eynos4412内部固化的irom代码先运行
(1)确定启动的设备
(2)初始化启动的设备
(3)将启动设备开始一部分代码(BL1)搬移到exynos4412内部的iram(SRAM)运行
注意:BL1 代码是三星提供的,irom的代码在读取BL1的时候,会对它做验证,如果验证通过
则运行它。(BL1 代码不是三星提供的,就没法启动开发板,是三星对芯片专利的保护)
2.在iram运行BL1代码
(1)确定启动设备
(2)将启动设备中的BL2代码拷贝到exynos4412内部的iram运行
注意:
BL2指的的是u_boot的第一阶段代码(可以实现对u_boot第二阶段的代码的更新)
-----------------------------u-boot代码开始运行----------------------------------------
3.在iram运行BL2代码
(0)设置ARM核为SVC模式
(1)设置异常向量表,告诉ARM核异常向量表基地址
(2)关闭Cache和MMU
(3)初始化系统时钟
(4)初始化内存
(5)将u_boot(第二阶段)从存储介质中搬移到内存中(board_init_f)
4.在内存中运行u_boot代码
(0)设置ARM核为SVC模式
(1)设置异常向量表,告诉ARM核异常向量表基地址
(2)关闭Cache和MMU
(3) ...
(4) ...
注意:
此时u_boot已经在内存中,不需要初始化系统时钟和内存
(5)_main
<1>设置了sp
<2>调用了board_init_f
(6)board_init_f (板子的第一阶段初始化)
<1>完成基本的初始化
[1]SOC ID的获取
[2]定时器初始化
[3]串口的初始化
[4]从串口中输出了一些信息
<2>为u_boot重定向做准备
在内存最顶端划分空间
(7)重定向u_boot
如果u_boot不是在高端内存,则将u_boot从低端内存搬移到高端内存
(8)清BSS段
为运行C语言程序
(9)board_init_r(板子的第二阶段初始化)
<1>初始化硬件设备
[1]EMMC存储器
[2]DM9000网卡设备
...
<2>从存储介质中读取了环境变量的值
(10)main_loop
获取了bootdelay和bootcmd环境变量的值,如果没有设置bootcmd则进入u_boot交互界面。
如果设置了bootcmd,判断在到计时时间内,如果用户没有打断,则执行bootcmd命令。
如果倒计时时间内,被用户打断,则进入u_boot交互界面。 取消bootcmd命令:setenv bootcmd
注意:
u_boot交互界面,循环读取用户输入的命令,然后执行。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)