u-boot启动第一阶段
目标板:2440开发板
u-boot启动的第一阶段是在文件start.S中完成的,这个过程对不同硬件平台的设置是不同的。下面进入start.S
_start: b reset //跳转到reset
//设置CPU为SVC32安全管理模式
reset: /* * set the cpu to SVC32 mode */ mrs r0,cpsr bic r0,r0,#0x1f orr r0,r0,#0xd3 msr cpsr,r0
//关闭看门狗
#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)
ldr r0, =pWTCON
mov r1, #0x0
str r1, [r0]
//屏蔽中断
/*
* mask all IRQs by setting all bits in the INTMR - default
*/
mov r1, #0xffffffff
ldr r0, =INTMSK
str r1, [r0]
//初始化内存
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
adr r0, _start /* r0 <- current position of code */
/*将_start的值赋给r0,如果_start的地址为0x33F80000,则说明内存已经被初始化,准备从0x33F80000运行程序
如果_start的值为0,则说明程序还没开始执行,内存没有被初始化*/
ldr r1, _TEXT_BASE /* test if we run from flash or RAM */
//将链接地址_TEXT_BASE,给r1
cmp r0, r1 /* don't reloc during debug */
/*cmp = 0时,则r0 = r1,那么程序已经把SDRAM初始化了*/
blne cpu_init_crit
/* 当r0和r1不相等时,跳转到cpu_init_crit*/
#endif
/*查找cpu_init_crit*/
cpu_init_crit:
/*
* flush v4 I/D caches 设置缓存
*/
mov r0, #
mcr p15, , r0, c7, c7, /* flush v3/v4 cache */
mcr p15, , r0, c8, c7, /* flush v4 TLB */
/*
* disable MMU stuff and caches 关闭MMU,内存映射
*/
mrc p15, , r0, c1, c0,
bic r0, r0, #, : (--V- --RS)
bic r0, r0, #, : (B--- -CAM)
orr r0, r0, # (A) Align
orr r0, r0, # (I) I-Cache
mcr p15, , r0, c1, c0,
/*
* before relocating, we have to setup RAM timing
* because memory timing is board-dependend, you will
* find a lowlevel_init.S in your board directory.
*/
mov ip, lr
bl lowlevel_init /*跳转到lowlevel_init,开始初始化SDRAM*/
mov lr, ip
mov pc, lr
/*lowlevel_init的路径为/cpu/arm920t/ks8695/lowlevel_init.S ,在lowlevel_init.S中,对内存进行设置*/
//设置堆栈
/* Set up the stack */
stack_setup:
ldr r0, _TEXT_BASE /* upper 128 KiB: relocated uboot */
sub r0, r0, #CFG_MALLOC_LEN /* malloc area */
sub r0, r0, #CFG_GBL_DATA_SIZE /* bdinfo
#ifdef CONFIG_USE_IRQ
sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
#endif
sub sp, r0, #12 /* leave 3 words for abort-stack */
/*从上面的代码可以知道,栈区已经被分为好几个部分,栈的起始地址为_TEXT_BASE,依次分为堆区,全局数据区等如下图所示*/

/*在栈设置好之后,就可以处理C程序了*/
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
bl clock_init
#endif
/*clock_init设置时钟,在上面的栈初始化结束之后执行,这儿处理的clock_init,是C语言程序*/
进入/board/100ask24x0/boot_init.c,文件boot_init.c中的void clock_init(void),用的是c与汇编混合编程,c语言中嵌入汇编。
/*下面这段代码就是,开始搬运u-boot到SDRAM中去*/
relocate: /* relocate U-Boot to RAM */
adr r0, _start /* r0 <- current position of code */
ldr r1, _TEXT_BASE /* test if we run from flash or RAM */
cmp r0, r1 /* don't reloc during debug */
beq clear_bss
//如果加载地址与链接地址相等,则开始清BSS段,BSS段中存放的是未初始化的静态变量和全局变量
由u-boot.lds可以知道,BSS段从从_bss_start开始,在_end 结束
clear_bss:
ldr r0, _bss_start /* find start of bss segment */
ldr r1, _bss_end /* stop here */
mov r2, #0x00000000 /* clear */
/*在清空BSS段之后,就跳转到_start_armboot,就开始从start_armboot运行C程序*/
ldr pc, _start_armboot
_start_armboot: .word start_armboot
综合上边的过程,可以得到,start.S 中所作如下工作:
1.设置设置CPU为SVC32安全管理模式
2.关闭看门狗
3.屏蔽中断
4.开始初始化SDRAM
5.设置堆栈
6.clock_init设置时钟
7.搬运u-boot到SDRAM中
8.清BSS段
9.调用start_armboot进入第二阶段
u-boot启动第一阶段的更多相关文章
- Spring Boot 启动第一个页面(Spring二)
在前面的文章里我配置好了spring boot的环境,并选择STS开发工具 具体文章见:https://blog.csdn.net/qq_38175040/article/details/105481 ...
- UBoot启动代码第一阶段流程
http://blog.csdn.net/xautfengzi/article/details/7470134 前段时间了看了UBoot的源码,放了一段时间之后忘得差不多了.现做一些注释,方便以后温习 ...
- Spring Boot启动过程及回调接口汇总
Spring Boot启动过程及回调接口汇总 链接: https://www.itcodemonkey.com/article/1431.html 来自:chanjarster (Daniel Qia ...
- [Spring Boot] Spring Boot启动过程源码分析
关于Spring Boot,已经有很多介绍其如何使用的文章了,本文从源代码(基于Spring-boot 1.5.6)的角度来看看Spring Boot的启动过程到底是怎么样的,为何以往纷繁复杂的配置到 ...
- Spring Boot启动过程源码分析--转
https://blog.csdn.net/dm_vincent/article/details/76735888 关于Spring Boot,已经有很多介绍其如何使用的文章了,本文从源代码(基于Sp ...
- uboot启动第一阶段分析
一. uboot第一阶段初识 1.1. 什么是uboot第一阶段 1.1.1. 启动os三个阶段 1.1.1.1. bl0阶段 a. 这段代码是三星固化到iROM中,可以查看<S5PV210_i ...
- Spring Boot启动过程(四):Spring Boot内嵌Tomcat启动
之前在Spring Boot启动过程(二)提到过createEmbeddedServletContainer创建了内嵌的Servlet容器,我用的是默认的Tomcat. private void cr ...
- Spring Boot 启动(四) EnvironmentPostProcessor
Spring Boot 启动(四) EnvironmentPostProcessor Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698. ...
- Spring Boot 启动(二) 配置详解
Spring Boot 启动(二) 配置详解 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) Spring Boot 配置 ...
随机推荐
- [POI2012]OKR-A Horrible Poem hash
题面:洛谷 题解: 首先我们需要知道一个性质,串s的最小循环节 = len - next[len].其中next[len]表示串s的一个最长长度使得s[1] ~ s[next[len]] == s[l ...
- Codeforces Round #406 (Div. 2)滚粗记
A 一看到题,不是一道解不定方程的裸题吗,调了好久exgcd. 其实一个for就好了啊 B 一直WA ON TEST 7真是烦,一想会不会是编号太大了,又写了一个map版本,无用. 调了好久好久才发现 ...
- 排座位&&Little Elephant And Permutation——排列dp的处理
排列的问题,就是要把序列排个序,使之达到某种最优值或者统计方案数 dp可以解决部分排列问题. 通常的解决方案是,按照编号(优先级)排序决策,从左到右决策两种. 这里主要是第一个. 排座位• 有
- selenium - webdriver - 定位一组元素
八种方法: find_elements_by_id() find_elements_by_name() find_elements_by_class_name() find_elements_by_t ...
- Codeforces Round #340 (Div. 2) E 莫队+前缀异或和
E. XOR and Favorite Number time limit per test 4 seconds memory limit per test 256 megabytes input s ...
- 洛谷P2344 奶牛抗议
题目背景 Generic Cow Protests, 2011 Feb 题目描述 约翰家的N 头奶牛正在排队游行抗议.一些奶牛情绪激动,约翰测算下来,排在第i 位的奶牛的理智度为Ai,数字可正可负. ...
- struts标签错误:Can not find the tag library descriptor for "http://java.sun.com/jsp/jstl/core"
今天使用eclipse开发ssh,出现Can not find the tag library descriptor for "http://java.sun.com/jsp/jstl/co ...
- 前端PHP入门-030-文件函数API
bool file_exists ( $指定文件名或者文件路径) 功能:文件是否存在. bool is_readable ( $指定文件名或者文件路径) 功能:文件是否可读 bool is_write ...
- SQL基础操作
SQL是操作数据的语言 增加记录: insert into 数据表名称(字段1,字段2,字段3....)values(值1,值2,值3.....) 查看表结构:desc 表名 inset into x ...
- JQ笔记-加强版
Query初级 一.介绍.基本写法 什么是JQ: 一个优秀的JS库,大型开发必备 JQ的好处: 简化JS的复杂操作 不再需要关心兼容性 提供大量实用方法 如何学习JQ: www.jquery. ...