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. 【C++】运算符重载

    运算符重载,主要是简化类类型运算,能够让我们对类对象直接用运算符进行运算.基本语法: 类型 operator 运算符(参数列表){ ... } Complex operator+(Complex va ...

  2. contentOffset,frame,bounds,contentSize,ContentInset

    contentOffset, 在UIScrollview里面滚动条用的最多,比如网易新闻的滚动条,肯定会用到这个. 我认为:它是下一个要显示的图片的左上角.设置了这个左上角后,下一次滚动时,邮戳直接到 ...

  3. sell- 获取邮箱的后缀

    1. public static void main(String[] args) { System.out.println(getEmailSuffix("jim_chen28270@16 ...

  4. http://blog.csdn.net/yangyuhan156/article/details/48899439

    http://blog.csdn.net/yangyuhan156/article/details/48899439

  5. 打造安全的App!iOS安全系列之 HTTPS

    如何打造一个安全的App?这是每一个移动开发者必须面对的问题.在移动App开发领域,开发工程师对于安全方面的考虑普遍比较欠缺,而由于iOS平台的封闭性,遭遇到的安全问题相比于Android来说要少得多 ...

  6. XMPP语音聊天解决方案 (待论证 正打算写)

    1.获取音频文件路径 例如: NSURL *recordedFile = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendin ...

  7. 异步刷新tableView

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [self.tableView rel ...

  8. Eclipse/Myeclipse 开发项目技巧

    Eclipse/Myeclipse 开发项目 编程的本质: 把现实生活中的业务逻辑用代码实现. eclipse 是一个开放源代码.基于Java的可扩展开发平台. (最初主要用来Java语言开发,但目前 ...

  9. storm 随机发送字符串

    Storm的程序叫做Topology,类似MapReduce job 一个Topolog应该有Spout,代表数据源,和若干个bolt 首先写一个Spout public class RandomSp ...

  10. QQ拼音在中文输入下默认英文标点

    别小看这个功能, 感觉在写一些技术 Blog 的情况下还是挺有用的. 打开QQ拼音: 输入法设置->基本设置->初始状态->中文状态下使用英文标点.