Boot Loader之ARM Uboot移植 阶段一 理论篇

1.boot loader需要完成的任务:

              1》设计程序的入口地址

              2》建立异常中断处理向量

              3》初始化CPU各种模式的堆栈和寄存器

              4》初始化系统中要使用的各种片内外设备

              5》初始化目标板

              6》引导操作系统

2.boot loader 的实现流

在stage1中boot loader主要完成5方面的工作,依次为

          1》基本的硬件的初始化

                 屏蔽所有的中断,设置CPU的速度和时钟频率,初始化内存的控制器,初始化串口,关闭CPU内部指令/数据cache

           2》为加载stage2 准备内存空间

                 为了获得更快的运行速度,通常将stage2加载到RAM空间中执行,因此必须为加载boot loader的stage2准备好一段可用的RAM空间范围。由于stage2通常是c语言执行代码,因此在考虑空间大小时,除了要考虑stage2映像的大小,还应该考虑堆栈的大小。

           3》复制stage2到内存空间中

               复制的时候要注意两点 :

                stage2的可执行映像在固态存储设备的存放起始地址和终止地址。

                内存空间的起始地址

4》设置堆栈指针sp

                因为堆栈是向下生长的,通常把sp的值设置为那个1MB的RAM空间的最顶端。

           5》跳转到stage2的入口点

               上述一切都就绪后,就可以跳转到bootloader 的stage2去执行了。

               stage2 是用c代码书写,但是在编译连接的时候不能使用glibc 库的任何支持函数。带来一问题就是从哪里跳转进main函数呢?直接将main()函数的起始地址作为整个stage2执行映像的入口点或许是最直接的方法,但是这样做有两个缺点:
               无法通过main()函数传递函数参数
               无法处理main()函数返回的情况
               另一种方法Trampoline(弹簧床)的概念,即用汇编语言写一段Trampoline 小程序,并将Trampoline程序来作为stage2可执行的映像的执行入口点。然后可以在Trampoline汇编小 程序中用CPU跳转指令跳入main()函数中去执行;而当main()函数返回时,CPU执行路径显然再次回到Trampoline程序。简而言之,这种方法的思想就是:用这段Trampoline程序作为main()函数的外部包裹(external wrapper)

UBoot讲解和实践-----------讲解(一)的更多相关文章

  1. UBoot讲解和实践-------------讲解(二)

    UBoot  ARM移植之阶段二   理论篇 stage2: 1.初始化本阶段要使用的硬件设备: 通常包括两方面: 1)初始化至少一个串口,以便和终端用户进行I/O输出信息.              ...

  2. Android事件总线分发库EventBus3.0的简单讲解与实践

    Android事件总线分发库EventBus的简单讲解与实践 导语,EventBus大家应该不陌生,EventBus是一款针对Android优化的发布/订阅事件总线.主要功能是替代Intent,Han ...

  3. LSTM和双向LSTM讲解及实践

    LSTM和双向LSTM讲解及实践 目录 RNN的长期依赖问题LSTM原理讲解双向LSTM原理讲解Keras实现LSTM和双向LSTM 一.RNN的长期依赖问题 在上篇文章中介绍的循环神经网络RNN在训 ...

  4. 使用Keras进行深度学习:(七)GRU讲解及实践

    ####欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 介绍 GRU(Gated Recurrent Unit) ...

  5. 使用Keras进行深度学习:(六)LSTM和双向LSTM讲解及实践

    欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 介绍 长短期记忆(Long Short Term Memory, ...

  6. 使用Keras进行深度学习:(五)RNN和双向RNN讲解及实践

    欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 笔者:Ray 介绍 通过对前面文章的学习,对深度神经网络(DNN) ...

  7. Vuex 实践讲解

    state 用来数据共享数据存储 mutation 用来注册改变数据状态 getters 用来对共享数据进行过滤操作 action 解决异步改变共享数据 这个四大特征就是核心,如何用怎么用 接下来还是 ...

  8. MySQL/RDS数据如何同步到MaxCompute之实践讲解

    摘要:大数据计算服务(MaxCompute,原名ODPS)是阿里云提供的一种快速.完全托管的EB级数据仓库解决方案.本文章中阿里云MaxCompute公有云技术支持人员刘力夺通过一个实验向大家介绍了阿 ...

  9. 使用Keras进行深度学习:(二)CNN讲解及实践

    欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 现今最主流的处理图像数据的技术当属深度神经网络了,尤其是卷积神经网 ...

随机推荐

  1. [LeetCode] Simplify Path(可以不用看)

    Given an absolute path for a file (Unix-style), simplify it. For example, path = "/home/", ...

  2. CentOS7 + linux kernel 3.10.94 compile 简记

    Linux kernel 一直以其开源著称,可以自己编译选择合适的模块,针对特定的系统可以有不同的编译选项 来源 此次编译的内核版本为3.10.94,从官网www.kernel.org下载而来,自己虚 ...

  3. c#中匿名函数lamb表达式

    c#中匿名函数lamb表达式 实例一:(其实,这样都是些语法糖) using System; using System.Collections.Generic; using System.Linq; ...

  4. OC initialize和init

    Objective-C很有趣的一个地方是,它非常非常像C.实际上,它就是C语言加上一些其他扩展和一个运行时间(runtime). 有了这个在每个Objective-C程序中都会起作用的附加运行时间,给 ...

  5. sed 例子

    sed 应用示例 给1.1.1.1后面增加2.2.2.2: sed -i 's/Server=1.1.1.1/&,2.2.2.2/g' zabbix_agentd.conf

  6. 股票中带有ST和*ST的股票是什么意思啊?一图了解新三板与主板、中小板、创业板制度差异!

    st表示已经亏损超过1年以上的 *st表示连续亏损3年以上,并且有退市风险的,随时可能会“退市”到时候你的钱可能都拿不会来 主板股票代码上海60开头,深圳000开头,通常指大中型企业:中小板002开头 ...

  7. iOS: 讯飞语音的使用

    一.介绍: 讯飞语音做的相当不错,容错率达到90%多,如果需要做语音方面的功能,它绝对是一个不错的选择.讯飞语音的功能很多:语音听写.语音识别.语音合成等,但我们最常用的还是语音听写.讯飞语音中包含界 ...

  8. Android标签云控件:TagCloudLinkView

    可以完成添加.删除.选择操作的标签控件,可以自定样式(颜色等),可删除的标签末尾带有'×'符号.和Android-Cloud-TagView-Plus(见正文相关代码)类似. 1.layout in ...

  9. javascript:void(0)和javascript:;的用法

    一.JavaScript:void(0) 我们经常会使用到 javascript:void(0) 这样的代码,那么在 JavaScript 中 javascript:void(0) 代表的是什么意思呢 ...

  10. 在一个Label上设置多种颜色字体

    #import "AppDelegate.h" @interface AppDelegate () @end @implementation AppDelegate - (BOOL ...