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 配置 ...
随机推荐
- 【Java】JAVA-加密-DES加密代码详解
package util; import java.security.SecureRandom; import javax.crypto.spec.DESKeySpec; import javax.c ...
- 【刷题】BZOJ 3238 [Ahoi2013]差异
Description Input 一行,一个字符串S Output 一行,一个整数,表示所求值 Sample Input cacao Sample Output 54 HINT 2<=N< ...
- 谈谈 Java 类加载机制
概述 类加载器主要分为两类,一类是 JDK 默认提供的,一类是用户自定义的. JDK 默认提供三种类加载器: Bootstrap ClassLoader 启动类加载器:每次执行 java 命令时都会使 ...
- Gradle及eclipse插件安装
1. 下载Gradle Gradle需要jdk7或以上版本,使用Java –version命令进行测试:Gradle自带了Groovy库,所以无需再安装Groovy,已经安装的Groovy会被Gra ...
- 常州day1p3
给定一个 n 行 m 列的方格,每个格子里有一个正整数 a,1 ≤ a ≤ k,k ≤ n∗m 假设你当前时刻站在 (i,j) 这个格子里,你想要移动到 (x,y),那必须满足以下三个条件 1:i & ...
- POJ--3461
原题链接:http://poj.org/problem?id=3461 分析:求一个串在另一个串中出现的次数,显然用KMP可以解决. #include<cstdio> #include&l ...
- JSP2 的自定义标签
在 JSP 中开发标签库只需如下几个步骤 1.开发自定义标签处理类 2.建立一个 *.tld 文件,每个 *.tld 文件对应一个标签库,每个标签库可包含多个标签 3.在 JSP 文件中使用自定义标签 ...
- Linux常用网络工具:hping高级主机扫描
之前介绍了主机扫描工具fping,可以参考我写的<Linux常用网络工具:fping主机扫描>. hping是一款更高级的主机扫描工具,它支持TCP/IP数据包构造.分析,在某些防火墙配置 ...
- 删除rabbitmq中持久化的队列和数据
在windows中的rabbitmq安装目录中的/sbin目录下: rabbitmqctl.bat stop_app rabbitmqctl.bat reset rabbitmqctl start_a ...
- Kubernetes 1.5部署sonarqube
前面几篇博文我们一直在说kubernetes的基础环境的安装及部署.在基础环境部署完成以后,我们开始尝试使用kubernetes来管理我们的应用.本篇博文通过一个简单的示例来向大家展示如何通过depl ...