过了挺长一断时间没有看U-BOOT了,这两天下载了新版的UBOOT源码(之前看的一些书都是基于早好多年的源码来讲述,总感觉心里有点不对劲,也许是我比较喜新的原因吧,不过小弟我并没有厌旧哈),好了不多扯了,开始来写写随笔,看到好多大牛们都喜欢发技术博文来当做日记,那我就把这当作周记吧!

uboot其实也不能看得太简单了,MCU刚开始启动时一般是由芯片厂商在MCU内部集成了一个IROM,里面的代码是用来对MCU的第一步初始化,比如配置PLL,建立起一个合适环境,然后从外部存储区EMMC,SD,LAND-FLASH这类设备当中复制当中头部第一个block开始的一小部分代码[一般有4K,8K,16K不等,不同系列的MCU,MPU大小有些区别]到MCU内部当中的IRAM内,然后跳转到IRAM当中运行,此时IROM里的代码的功能完成了,把控制权转交给IRAM当中的代码[也就是刚才从外部存储区复制过来的UBOOT代码]来执行,接下来是由此时IRAM中的程序来建立合适的环境,比如初始化栈空间,建立起一个适合C程序运行的环境,再初始化外部RAM控制器,把外部存储区的整个UBOOT代码加载到RAM当中。也许大家会问,为何不能一次性把UBOOT加载RAM当中呢,下面来谈谈原因吧。

刚开始MCU启动时通常是不能访问外部RAM的,因为此时的RAM控制器还没有被我们的UBOOT初始化,而且内部的IROM代码也没有对其做初始化,这也意味着我们此时也还没有可写的DATA区及BSS区,并且BSS区也还没有被IROM代码初始化为0.为了能获取一个完整的C语言工作环境,我们必须分配一个最小的栈空间,而这些工作也是IROM里的代码来完成的。接下来IROM代码再从外部存储区复制代码到IRAM中运行,选择启动方式的选项由MCU,MPU,CPU厂商来提供(如从SD卡,LAND-FLASH,EMMC等),这里得说下[并不是所有的MCU,MPU,CPU都是从外部存储区复制代码到IRAM中,有些是复制到内部的Cache当中,把Cache当作临时的RAM使用,当使用Dcache作为栈的初始化RAM时,我们不需要任何的物理RAM来备份缓存中的数据,这个方法的灵活之处在于缓存被用做一个临时支持必要的存储器(在SDRAM控制器启动之前)]。UBOOT的起始初始化代码的初始化过程中我们也得明确以下几点:

1.初始化的全局数据是只读的,不能改写。

2.不能使用任何的未初始化的全局变量,因为它们还没有被定义,它们的初始化是在重定位到RAM里面之后完成的。

3.在此期间,栈空间是相当有限的,因此避免大数据buffers的存放。

刚开始我们只有栈空间作为有限的可写存储区,也就是说我们此时还不能使用常规的全局数据在代码断之间进行共享,但这也造就了我们在执行UBOOT时可以很方便的建立全局数据结构体给所有的函数,同时我们可以传递一个指向全局数据区的指针给函数,作为函数的参数,但这无疑又增大了代码的体积,所以我们采用另一种方式,用寄存器变量来达到共享数据的功能:我们放置一个指向全局数据区的指针到一个我们预留的一个寄存器当中(在ARM中使用R9寄存器)。

浅谈2015新版 U-Boot的更多相关文章

  1. 【微信小程序项目实践总结】30分钟从陌生到熟悉 web app 、native app、hybrid app比较 30分钟ES6从陌生到熟悉 【原创】浅谈内存泄露 HTML5 五子棋 - JS/Canvas 游戏 meta 详解,html5 meta 标签日常设置 C#中回滚TransactionScope的使用方法和原理

    [微信小程序项目实践总结]30分钟从陌生到熟悉 前言 我们之前对小程序做了基本学习: 1. 微信小程序开发07-列表页面怎么做 2. 微信小程序开发06-一个业务页面的完成 3. 微信小程序开发05- ...

  2. 浅谈WebService的版本兼容性设计

    在现在大型的项目或者软件开发中,一般都会有很多种终端, PC端比如Winform.WebForm,移动端,比如各种Native客户端(iOS, Android, WP),Html5等,我们要满足以上所 ...

  3. iOS开发之浅谈MVVM的架构设计与团队协作

    今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...

  4. 浅谈DES加密算法

    一.DES加密算法介绍 1.要求密钥必须是8个字节,即64bit长度 2.因为密钥是byte[8] , 代表字符串也可以是非可见的字节,可以与Base64编码算法一起使用 3.加密.解密都需要通过字节 ...

  5. 浅谈Python时间模块

    浅谈Python时间模块 今天简单总结了一下Python处理时间和日期方面的模块,主要就是datetime.time.calendar三个模块的使用.希望这篇文章对于学习Python的朋友们有所帮助 ...

  6. 浅谈iOS中MVVM的架构设计与团队协作

    说到架构设计和团队协作,这个对App的开发还是比较重要的.即使作为一个专业的搬砖者,前提是你这砖搬完放在哪?不只是Code有框架,其他的东西都是有框架的,比如桥梁等等神马的~在这儿就不往外扯了.一个好 ...

  7. [C#]6.0新特性浅谈

    原文:[C#]6.0新特性浅谈 C#6.0出来也有很长一段时间了,虽然新的特性和语法趋于稳定,但是对于大多数程序猿来说,想在工作中用上C#6.0估计还得等上不短的一段时间.所以现在再来聊一聊新版本带来 ...

  8. 浅谈MacOS-20155205郝博雅

    预备作业3:安装虚拟机 我的电脑是MacBook Air,因此按照娄老师说的,不需要安装Linix系统便能完成之后的学习.所以我就浅谈一下用MacOS系统的感受. 优点:人性化&便捷 与同系列 ...

  9. 浅谈测试rhel7新功能时的感受及遇到的问题【转载】

    半夜起来看世界杯,没啥激情,但是又怕错误意大利和英格兰的比赛,就看了rhel7 相关新功能的介绍. rhel7的下载地址: https://access.redhat.com/site/downloa ...

随机推荐

  1. Js_闭包详解

    http://blog.csdn.net/chenglc1612/article/details/53413318 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变 ...

  2. 推荐一款很好用的调试js的eclipse插件

    ie调试的话用 Companion.JS 一个插件 很好用的 不用配置,直接安装eclipse调试的话 可以用jsdt 可能需要配置下 网上有很多说明http://wokaours.blog.163. ...

  3. linux 下使用exp/imp 或者expdp/impdp导出导入oracle数据表数据

    一.环境配置 1.执行环境: exp/imp可以在客户端执行也可以在服务器端执行,在客户端执行需要先安装有oracle的客户端,如果是linux系统,就是以oracle用户登录,在控制台下执行.建议在 ...

  4. 洛谷 P1071 潜伏者 —— 模拟

    题目:https://www.luogu.org/problemnew/show/P1071 按题意模拟即可. 代码如下: #include<iostream> #include<c ...

  5. hdu 3503(有点小技巧的dfs(对结点加东西表示边的某些状态))

    Friends Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  6. Tensorflow卷积接口总结

    tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, name=None) 这个接口用了这么久,每次都有点迷惑,这里 ...

  7. 开源ORM

    Farseer.net轻量级开源框架 目录 https://github.com/steden/Farseer.net ---------------------------------- SunSo ...

  8. Node 基本使用

    node -v:查看node版本 npm -v:查看npm版本 npm install npm -g :升级npm版本 npm install <module_name> [-g]:安装指 ...

  9. React实战之将数据库返回的时间转换为几分钟前、几小时前、几天前的形式。

    React实战之将数据库返回的时间转换为几分钟前.几小时前.几天前的形式. 不知道大家的时间格式是什么样子的,我先展示下我这里数据库返回的时间格式 ‘2019-05-05T15:52:19Z’ 是这个 ...

  10. 移动游戏By HYJ

    暴力求SG函数即可,记忆化贼方便 /*program from Wolfycz*/ #include<cmath> #include<cstdio> #include<c ...