/**
******************************************************************************
* @author    Maoxiao Hu
* @version   V1.0.0
* @date       Jan-2015
******************************************************************************
* < COPYRIGHT 2015 ISE of SHANDONG UNIVERSITY >
******************************************************************************
**/
based on u-boot-2014.10。源代码以红色标示,其它均为添加的注释。

------------脑补区---------------

本文汇编涉及的指令:ldr , bic , mov , sub , cmp , strlo , addlo , blo , str , bl 。
不是很清楚的请到我的另外一篇博客《arm汇编指令总结(不断更新)》中集中脑补。

----------------------------------

分析一下 crt0.S 文件开头的一段。crt0.S 位于u-boot-2014.10/arch/arm/lib/crt0.S。
正如 crt0.S 文件开头所注释的一样:
1. Set up initial environment for calling board_init_f().This environment only provides a stack and a place to store the GD (‘global data’) structure, both located in some readily available RAM (SRAM, locked cache...). In this context, VARIABLE global data, initialized or not (BSS), are UNAVAILABLE; only CONSTANT initialized data are available.
最开始先为调用 board_init_f() 设定初始化条件。这个初始化条件就是:设定栈首地址,将栈往下移 GD_SIZE 个大小,然后将刚才经过的这段 SRAM 从头清空(写0)。话不多说看代码:

ENTRY(_main)

/*
* Set up initial C runtime environment and call board_init_f(0).
*/

ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)

一路反查定义:

#define CONFIG_SYS_INIT_SP_ADDR (CONFIG_SYS_LOAD_ADDR - GENERATED_GBL_DATA_SIZE)
#define CONFIG_SYS_LOAD_ADDR (CONFIG_SYS_SDRAM_BASE + 0x4800000)
#define GENERATED_GBL_DATA_SIZE 0xC0
#define CONFIG_SYS_INIT_SP_ADDR (0x40000000 + 0x4800000 - 0xC0)
#define CONFIG_SYS_INIT_SP_ADDR  0x447FFF40

最终SP值为0x447FFF40。

bic sp, sp, #7 /* 8-byte alignment for ABI compliance */

sp低三位清0。

mov r2, sp

保存sp到r2中,现在r2中的值也是0x447FFF40。

sub sp, sp, #GD_SIZE /* allocate one GD above SP */

 GD_SIZE为184(0xB8),将sp指针向下移184个字节,现在sp为0x447ffe88。

bic sp, sp, #7 /* 8-byte alignment for ABI compliance */

sp低三位再次清0。

mov r9, sp /* GD is above SP */

保存sp到r9中,现在r9中的值也是0x447ffe88。

mov r1, sp

再次保存sp到r1中,现在r1中的值也是0x447ffe88。

mov r0, #0

清r0。

clr_gd:

    cmp r1, r2 /* while not at end of GD */

    现在 r1=0x447ffe88 < r2=0x447FFF40不相等是必然的。

    strlo r0, [r1] /* clear 32-bit GD word */

    addlo r1, r1, #4 /* move to next */

    blo clr_gd

    blo小于则跳转。

#if defined(CONFIG_SYS_MALLOC_F_LEN) && !defined(CONFIG_SPL_BUILD)
sub sp, sp, #CONFIG_SYS_MALLOC_F_LEN

CONFIG_SYS_MALLOC_F_LEN=(1<<10)即0x400,现在sp为0x447ffa88。

str sp, [r9, #GD_MALLOC_BASE] 

GD_MALLOC_BASE = 136 (0x88),把sp的值存到r9+ 0x88 = 0x447fff10 地址处。

#endif
/* mov r0, #0 not needed due to above code */
bl board_init_f

u-boot ctr0.S详解 包含_main函数的更多相关文章

  1. Spring Boot 自定义日志详解

    本节内容基于 Spring Boot 2.0. 你所需具备的基础 什么是 Spring Boot? Spring Boot 核心配置文件详解 Spring Boot 开启的 2 种方式 Spring ...

  2. Spring Boot 集成 FreeMarker 详解案例(十五)

    一.Springboot 那些事 SpringBoot 很方便的集成 FreeMarker ,DAO 数据库操作层依旧用的是 Mybatis,本文将会一步一步到来如何集成 FreeMarker 以及配 ...

  3. Spring Boot 之 Redis详解

    Redis是目前业界使用最广泛的内存数据存储. Redis支持丰富的数据结构,同时支持数据持久化. Redis还提供一些类数据库的特性,比如事务,HA,主从库. REmote DIctionary S ...

  4. ggplot2作图详解:入门函数qplot

    ggplot2作图详解:入门函数qplot   ggplot2的功能不用我们做广告,因为它的作者Hadley Wickham就说ggplot2是一个强大的作图工具,它可以让你不受现有图形类型的限制,创 ...

  5. Spring Boot 之 HelloWorld详解

    摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! “以前是人放狗看家,现在是狗牵着人散步” — 随笔 一.Spring Boot 自述 世界上最好 ...

  6. EditText使用详解-包含很多教程上看不到的功能演示

    写道 标题有点大,说是详解,其实就是对EditText的一些常用功能的介绍,包括密码框,电话框,空白提示文字等等的讲解,尽量的介绍详细一点,也就是所谓的详解了..呵呵 广告一下我的应用“我团”,最新1 ...

  7. lib 和 dll 的区别、生成以及使用详解 ~~包含示例代码~~(转)

    原文章地址:https://www.cnblogs.com/TenosDoIt/p/3203137.html#c 首先介绍一下静态库(静态链接库).动态库(动态链接库)的概念,首先两者都是代码共享的方 ...

  8. jQuery的deferred对象详解 jquery回调函数

    http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_deferred_object.html jQuery的 ...

  9. php调用C代码的方法详解和zend_parse_parameters函数详解

    php调用C代码的方法详解 在php程序中需要用到C代码,应该是下面两种情况: 1 已有C代码,在php程序中想直接用 2 由于php的性能问题,需要用C来实现部分功能   针对第一种情况,最合适的方 ...

随机推荐

  1. C# 模式窗口下更新进度条

    public partial class frmProcessBar : Form { public frmProcessBar() { InitializeComponent(); } public ...

  2. Design Mode 之 行为模式

    行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 看看这11中模式的关系,大致可分为四类:(1) ...

  3. PN-Traniger

        首先先从Bezier说起: 一条直线上有两个端点,P0和P1,那么直线可以写成 y = kx+b ,其实也就是P(t) = (1-t)P0 + P1 (这是个插值函数),(小注,我时常把这两个 ...

  4. [翻译] CBStoreHouseTransition

    CBStoreHouseTransition What is it? A custom transition inspired by Storehouse iOS app, also support ...

  5. ASP.NET页面与IIS底层交互和工作原理详解(第二回)

    引言 在 Part.1 Http请求处理流程 一文中,我们了解了Http请求的处理过程以及其它一些运作原理.我们知道Http管道中有两个可用接口,一个是IHttpHandler,一个是IHttpMod ...

  6. ASCII码表 char(9),char(10),char(13)等

    char(9)   水平制表符 char(10) 换行 char(13) 回车 测试ASCII码的方法: 在记事本中,按住ALT键,同时用小键盘输入十进制的ASCII码,然后松手,就可以看到效果了! ...

  7. Gulp 自动化的项目构建工具

    在很多场合都会听到前端工和 node 程师推荐 Grunt 来实现项目的自动化,自动化可以自动完成 javascript/coffee/sass/less 等文件的的测试.检查.合并.压缩.格式化.部 ...

  8. SQL---------表的约束

    表的约束 防止同一条数据完全重复:主键约束(primary key)唯一键约束(unique),自增长: 防止数据为空: 非空约束(not noll),默认值: 防止乱填数据: 外键, 定义数据类型, ...

  9. 转:eclipse怎样修改包(package)的显示样式、格式 工具/原料

    转:http://blog.csdn.net/longyaxx258/article/details/50774128 eclipse 打开我们的项目,可以看到左侧的package看上去特别多,没有层 ...

  10. 转: android app进程保活的文章列表

    1. Android 后台任务型App多进程架构演化 http://www.jianshu.com/p/4ac1f373e8cd 2. 关于 Android 进程保活,你所需要知道的一切 http:/ ...