uboot: 理解uboot要看哪些书

概览:

1. 《嵌入式Linux应用开发完全手册_.pdf》

  韦东山编写,讲解arm硬件,uboot以及linux嵌入式开发,配合2440开发板最佳。

2. 《Uboot中start.S源码的指令级的详尽解析_v1.6.pdf》

  对理解gnu arm汇编极其有帮助。

3. 《ARM指令集快速查询手册.pdf》

  工具手册,快速查找各种arm指令用法。

4. 《ARM指令详解[ARM标准].pdf》

  arm汇编的一些规范和常用形式,很多例子非常有用:子程序调用、散转、数据块复制等。对写裸机程序很有帮助,同样对理解uboot和内核启动代码有很大帮助。

5. 《ARM体系结构与编程 杜春雷.pdf》

  第二章 ARM指令分类及其寻址方式 以及第三章 ARM指令集 对深入理解arm指令有很大作用。本书已经深入到单条arm指令深度含义的解析了,很多疑难问题在这里可能得到解析。

  比如:

uboot启动文件
.globl _start
_start: b       reset

编译的uboot.dis
 33f80000 <_start>:
   33f80000:       ea000017        b       33f80064 <reset>

我一直不明白,如果是nand启动,这个 b       33f80064 <reset>能对吗? 看了b指令的实际构成, 恍然大悟。这里b       33f80064绝对不是单纯的跳到33f80064这个地址,b指令是当前地址+偏移地址的方式来跳转的。

在配合下面的讲解,问题得到解决。我们从uboot.dis得到的33f80064是编译地址,不代表是运行地址。

  U-BOOT详解 http://bbs.21ic.com/forum.php?mod=viewthread&tid=857037&typeid=114  

     什么是《编译地址》?什么是《运行地址》?
(一)编译地址: 32位的处理器,它的每一条指令是4个字节,以4个字节存储顺序,进行顺序执行,CPU是顺序执行的,只要没发生什么跳转,它会顺序进行执行行, 编译器会对每一条指令分配一个编译地址,这是编译器分配的,在编译过程中分配的地址,我们称之为编译地址。
(二)运行地址:是指程序指令真正运行的地址,是由用户指定的,用户将运行地址烧录到哪里,哪里就是运行的地址。
      比如有一个指令的编译地址是0x5,实际运行的地址是0x200,如果用户将指令烧到0x200上,那么这条指令的运行地址就是0x200,
      当编译地址和运行地址不同的时候会出现什么结果?结果是不能跳转,编译后会产生跳转地址,如果实际地址和编译后产生的地址不相等,那么就不能跳转。
     C语言编译地址:都希望把编译地址和实际运行地址放在一起的,但是汇编代码因为不需要做C语言到汇编的转换,可以认为的去写地址,所以直接写的就是他的运行地址这就是为什么任何bootloader刚开始会有一段汇编代码,因为起始代码编译地址和实际地址不相等,这段代码和汇编无关,跳转用的运行地址。
                                                                        编译地址和运行地址如何来算呢?
   1.    假如有两个编译地址a=0x10,b=0x7,b的运行地址是0x300,那么a的运行地址就是b的运行地址加上两者编译地址的差值,a-b=0x10-0x7=0x3,
       a的运行地址就是0x300+0x3=0x303。
    2.   假设uboot上两条指令的编译地址为a=0x33000007和b=0x33000001,这两条指令都落在bank6上,现在要计算出他们对应的运行地址,要找出运行地址的始地址,这个是由用户烧录进去的,假设运行地址的首地址是0x0,则a的运行地址为0x7,b为0x1,就是这样算出来的。

                                                                    为什么要分配编译地址?这样做有什么好处,有什么作用?
        比如在函数a中定义了函数b,当执行到函数b时要进行指令跳转,要跳转到b函数所对应的起始地址上去,编译时,编译器给每条指令都分配了编译地址,如果编译器已经给分配了地址就可以直接进行跳转,查找b函数跳转指令所对应的表,进行直接跳转,因为有个编译地址和指令对应的一个表,如果没有分配,编译器就查找不到这个跳转地址,要进行计算,非常麻烦。

                                                                                              什么是《相对地址》?
        以NOR Flash为例,NOR Falsh是映射到bank0上面,SDRAM是映射到bank6上面,uboot和内核最终是在SDRAM上面运行,最开始我们是从Nor Flash的零地址开始往后烧录,uboot中至少有一段代码编译地址和运行地址是不一样的,编译uboot或内核时,都会将编译地址放入到SDRAM中,他们最终都会在SDRAM中执行,刚开始uboot在Nor Flash中运行,运行地址是一个低端地址,是bank0中的一个地址,但编译地址是bank6中的地址,这样就会导致绝对跳转指令执行的失败,所以就引出了相对地址的概念。
                                                                                               那么什么是相对地址呢?
     至少在bank0中uboot这段代码要知道不能用b+编译地址这样的方法去跳转指令,因为这段代码的编译地址和运行地址不一样,那如何去做呢?
    要去计算这个指令运行的真实地址,计算出来后再做跳转,应该是b+运行地址,不能出现b+编译地址,而是b+运行地址,而运行地址是算出来的。

   _TEXT_BASE:
  .word TEXT_BASE //0x33F80000,在board/config.mk中
这段话表示,用户告诉编译器编译地址的起始地址

6. 下面几篇是讲解arm汇编和gnu arm汇编的小差别,了解这些主要是为了移植boot启动代码:

《第6章 ARM汇编伪指令与伪操作》ARM汇编   http://wenku.baidu.com/view/78342db069dc5022aaea00cb.html?re=view

《第6章 ARM汇编伪指令与伪操作(2) 》GNU arm汇编 http://wenku.baidu.com/view/73ec7dea998fcc22bcd10dcb.html?re=view

ARM标准汇编与GNU汇编 http://blog.sina.com.cn/s/blog_5c93b2ab0100ivfp.html

ARM汇编和Gnu汇编的转换 http://blog.csdn.net/jun2ran/article/details/6473458

《嵌入式Linux应用开发完全手册_.pdf》

《Uboot中start.S源码的指令级的详尽解析_v1.6.pdf》

《ARM指令集快速查询手册.pdf》

《ARM指令详解[ARM标准].pdf》

《ARM体系结构与编程》杜春雷.pdf

时间: 2024-10-13 15:36:49

uboot: 理解uboot要看哪些书的相关文章

先做别人的例子,让自己去理解,比看书效果要好——只看不写,永远都不会

我的学习经验就是多做练习,先做别人的例子,让自己去理解,比看书效果要好,做完例子也理解了以后再看书,效果是非常明显的,而且效率也会提高了. 应该给实践分配95%的时间.只看永远都不会. 其实刚开始学习qt要多仿写别人的例子,然后不明白的地方就查 assistant ,然后就是多跟人交流!!!给你推荐一个博客 http://hi.baidu.com/llxqnh 其实我自己也是,那几本VCL原理书仔细看,但是感觉死记硬背没有连贯性,还无法真正理解,更谈不上提出和解决书上没有提到的问题.但是通过自己

在嵌入式学习过程中的困惑——我一开始看什么书都看不懂,怎么才能理出一个学习顺序

以前有个学员在学C语言时说,"C语言很多地方都很奇怪,都得用内核的知识去解释,可是你又不先教我内核,我没法学C语言.我只好自己看操作系统的书,看内核代码,可是看不懂."当然看不懂了,内核代码都是用C写的,如果不学内核就没法学C语言,那不学C语言又怎么可能看懂内核?看来这是一个鸡生蛋还是蛋生鸡的问题. 懒真的是人的本性,就连学习的过程都希望是一条路顺利地走下去,不用动脑就能学会的:身后走过的路都是"已知",每走一步就把眼前新的"未知"变成"

想成为网络安全技术爱好者(可能是黑客)的话,需要看什么书?

(从刚刚从知乎上看到了的问题,看到排名第一的答案依旧是调侃和嘲讽,心生凉意,大概知乎也到如此地步了) 与其说是成为一名hacker倒不如说是 成为一名网络安全技术爱好者更符合你们的审美标准,我们一般是不会说自己是某某客,一来是这个词已经被世俗歪曲,以及各种帽(red hat or black hat)我们提只会让不懂的人误解,二来不是什么人都配叫这两个字的,我在很多场合提过这两个字是有内涵,坚信它的人是有 自由 平等 随意 突破的信条的. 既然题主问想要成为一名hacker需要阅读什么样的书.

学习软件开发应该看的书

学习软件开发应该看的书 来源: 李越甲的日志 1. C语言提升 <c和指针> <c缺陷和陷阱> <c专家编程> 这三本书是一个初级C程序员必看的三本书,同时也是应届新员工必须好好学习的教材,非常适合刚毕业的大学生学习 2.  C++语言提升 <Effective C++:改善程序与设计的55个具体做法> <More Effective C++:35个改善编程与设计的有效方法(中文版)> <C++沉思录> <C++Template

程序员必看的书(九)

程序员的必看的书已经更新到第九章了,想必大家也都烦了,不过还是有人喜欢的,再次声明我推荐的这些书有些没有看过,不过这些书都是不错的,根据豆瓣评分,以及朋友的阅读都说可以看. 在这里希望可以帮助一些人想看技术书,不知道怎么看的程序员们.再次请大家多多支持,如果大家也有不错的书推荐,也可以投稿.谢谢大家.对了IT江湖iOS客户端上线了,大家可以去Appstore下载,项目开源地址请看文章下方. 计算机程序的构造和解释 本书1984年出版,成型于美国麻省理工学院(MIT)多年使用的一本教材,1996年

今年计划要看的书全部备齐

上个月购买的书<今年计划看的书其中几本> http://www.cnblogs.com/insus/p/5325513.html 昨天购买的书回来了,今年计划要看的书全部备齐.<MongoDB>,<深入理解Bootstarp>和<ASP.NETSignalR编程实践>……      

股票基金看哪些书

1.30部必读的投资学经典(更新版) 投资是经济生活的一部分,也是我们的人生中极复杂又多变化的一环.聪明的投资人总是能够人投资大师所撰写的著作中,汲取宝贵的投资智慧.这些经典之作,将一些新的思想介绍给我们,警告我们应该避开哪些陷阱,让我们从别人的错误中汲取经验,成为投资领域中的赢家. 2. 第1部<聪明的投资者>本杰明·格雷厄姆(美国1894—1976) 别名:<格雷厄姆投资指南>,据说这就是那本曾被巴菲特翻烂的书.这本书的目的是以适当的形式给外行提供投资策略的指导.该理论不鼓励投

值得一看的书之《sed&awk(第2版)》

想学习高级sed和awk可以去看看,收益匪浅. --2016年11月19日看完<sed&awk(第2版)> 下载链接:http://down.51cto.com/data/2264410(需要一个下载豆) 值得一看的书之<sed&awk(第2版)>

linux移植u-boot(一)——U-Boot详解+自定义命令实战

linux移植u-boot(一)--U-Boot详解+自定义命令实战 2015-02-07 一.Bootloader ????简单地说:Bootloader主要功能就是 在系统上电时开始执行,初始化硬件和设备,准备好软件环境,最后调用操作系统. ????具体的包含:关闭你看门狗WATCHDOG,改变系统时钟,初始化存储控制器 ,将操作系统内核代码复制到内存中去运行. ????为了开发方便,可以增加网络功能,从PC上通过串口或者网络下载文件,烧写文件,将flash上的内核代码解压后运行等. Boo