浅谈2015新版 U-Boot
过了挺长一断时间没有看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的更多相关文章
- 【微信小程序项目实践总结】30分钟从陌生到熟悉 web app 、native app、hybrid app比较 30分钟ES6从陌生到熟悉 【原创】浅谈内存泄露 HTML5 五子棋 - JS/Canvas 游戏 meta 详解,html5 meta 标签日常设置 C#中回滚TransactionScope的使用方法和原理
[微信小程序项目实践总结]30分钟从陌生到熟悉 前言 我们之前对小程序做了基本学习: 1. 微信小程序开发07-列表页面怎么做 2. 微信小程序开发06-一个业务页面的完成 3. 微信小程序开发05- ...
- 浅谈WebService的版本兼容性设计
在现在大型的项目或者软件开发中,一般都会有很多种终端, PC端比如Winform.WebForm,移动端,比如各种Native客户端(iOS, Android, WP),Html5等,我们要满足以上所 ...
- iOS开发之浅谈MVVM的架构设计与团队协作
今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...
- 浅谈DES加密算法
一.DES加密算法介绍 1.要求密钥必须是8个字节,即64bit长度 2.因为密钥是byte[8] , 代表字符串也可以是非可见的字节,可以与Base64编码算法一起使用 3.加密.解密都需要通过字节 ...
- 浅谈Python时间模块
浅谈Python时间模块 今天简单总结了一下Python处理时间和日期方面的模块,主要就是datetime.time.calendar三个模块的使用.希望这篇文章对于学习Python的朋友们有所帮助 ...
- 浅谈iOS中MVVM的架构设计与团队协作
说到架构设计和团队协作,这个对App的开发还是比较重要的.即使作为一个专业的搬砖者,前提是你这砖搬完放在哪?不只是Code有框架,其他的东西都是有框架的,比如桥梁等等神马的~在这儿就不往外扯了.一个好 ...
- [C#]6.0新特性浅谈
原文:[C#]6.0新特性浅谈 C#6.0出来也有很长一段时间了,虽然新的特性和语法趋于稳定,但是对于大多数程序猿来说,想在工作中用上C#6.0估计还得等上不短的一段时间.所以现在再来聊一聊新版本带来 ...
- 浅谈MacOS-20155205郝博雅
预备作业3:安装虚拟机 我的电脑是MacBook Air,因此按照娄老师说的,不需要安装Linix系统便能完成之后的学习.所以我就浅谈一下用MacOS系统的感受. 优点:人性化&便捷 与同系列 ...
- 浅谈测试rhel7新功能时的感受及遇到的问题【转载】
半夜起来看世界杯,没啥激情,但是又怕错误意大利和英格兰的比赛,就看了rhel7 相关新功能的介绍. rhel7的下载地址: https://access.redhat.com/site/downloa ...
随机推荐
- js页面报错javax.servlet.jsp.PageContext cannot be resolved to a type解决
构建了一个maven项目但是项目创建好的jsp总会报错javax.servlet.jsp.PageContext cannot be resolved to a type,但是不影响项目运行.但总归难 ...
- 【转】axios全攻略
随着 vuejs 作者尤雨溪发布消息,不再继续维护vue-resource,并推荐大家使用 axios 开始,axios 被越来越多的人所了解.本来想在网上找找详细攻略,突然发现,axios 的官方文 ...
- jQuery得到多个值只能用取Class ,不能用取ID
如果页面有多个checkbox: <input type="checkbox" class="checkApply" id="chec ...
- sql server 日期模糊查询
转换成varchar类型 ) like '%2010-10-09%' 两个字段拼接成一个字段 SELECT C0252_ID, C0252_name,C0252_Addr, ((select top ...
- 微信公众号开发——创建自定义菜单(PHP版)
<?php include "TokenUtil.php"; //TokenUtil::build_access_token(); $access_token = Token ...
- Linux系统调用之open(), close() (转载)
转自:http://joe.is-programmer.com/posts/17463.html open函数可以打开或创建一个文件. #include <sys/types.h> #in ...
- bzoj 2456: mode【瞎搞】
这题加个#include都会MLE-- 神思路,每个数抵消宇哥和它不同的数,最后剩下的就是众数 #include<cstdio> int n,la,x,tot; int main() { ...
- bzoj 1614: [Usaco2007 Jan]Telephone Lines架设电话线【二分+spfa】
二分答案,然后把边权大于二分值的的边赋值为1,其他边赋值为0,然后跑spfa最短路看是否满足小于等于k条边在最短路上 #include<iostream> #include<cstd ...
- bzoj 1609[Usaco2008 Feb]Eating Together麻烦的聚餐【dp】
设up[i][j]为第i位升序为j的最小修改数,down为降序 #include<iostream> #include<stdio.h> using namespace std ...
- java web课程设计截图和服务器地址
企业办公测试截图和服务器地址 本篇博客主要围绕以下几个部分展开,登录.系统管理.工作流.个人事务管理.内部邮件.公共信息共六个部分.主要有界面截图和简要介绍. 一.登录.更改密码界面 登录界面包括以管 ...