网上关于ARM的bootloader(以Uboot为例)的启动顺序的资料有好多,但是对于Uboot的地址映射、体系结构级操作介绍很少,都是直接开始Start.s代码的阅读。本文拟详细分析Uboot从上电,到第一条指令的执行,同时分析代码对于cache、TLB等部件的操作过程。

以下内容以u-boot-2012.04.01源码为例,从网上很容易下载该版本。

1 ARM上电取第一条指令流程
1.1 上电后的第一条指令在哪里?
首先明确:对于ARM芯片,启动时pc值由CPU设计者规定,不同的ARM CPU有不同的值,例如S3C2440芯片上电后PC值被硬件设计者规定为0x0;其他ARM芯片不一定是0x0。

第一章讲述的上电取第一条指令过程以S3C2440为例,该芯片是ARMv4T架构,其他芯片在原理上类似。

S3C2440的启动时读取的第一条指令是在内存0x00地址处,不管是从nand flash还是nor flash启动。

但是上电后内存中是没有数据的,那么0x00地址处的指令是如何放进去的?针对不同的flash(nandflash、norflash),操作方式是不同的,下面讲述从nandflash和norflash启动的不同流程。

1.1.1  norflash和nandflash的异同
nandflash:价格低,容量大,适合大容量数据存储,地址线和数据线共用I/O线,所有信息都通过一条线传送,类比于PC的硬盘,

norflash:价格贵,容量小,适合小容量的程序或数据存储,类似硬盘,但是能在其中运行程序;有独立地址线、数据线

sdram:主要用于程序执行时的程序存储、执行或计算,类比于PC的内存;

综上:norflash比较适合频繁随即读写的场合,通常用于存储代码并直接在其中运行。nandflash用于存储资料。

只要知道以上大概区别就行。以下说明ARM从两种flash启动方式的异同。

1.1.1.1  ARM从nandFlash启动
若从nandflash启动,上电后nandflash控制器自动把nandflash存储器中的0——4K内容加载到芯片内的起步石(Steppingstone,起步石这个机制是处理器中集成的功能,对程序员透明),即内部SRAM缓冲器中,同时把内部SRAM的起始地址设置为0x0(不同的CPU上电后的PC值不尽相同,对不同的CPU该值也不尽相同),然后把这段片内SRAM映射到nGCS0片选的空间,进而CPU开始从内部SRAM的0x0处开始取得第一条指令,该过程全部是硬件自动完成,不需要程序代码控制。

或许你有个疑问,为什么不能直接把nandflash映射到0x0地址处?非要经过内部SRAM缓冲?

答案是,nandflash根本没有地址线,没法直接映射,必须使用SRAM做一个载体,通过SRAM把剩余的nandflash代码(即剩余的uboot启动代码)复制到SDRAM中运行。

若想从nandflash启动,那么uboot最核心的代码必须放在前4k完成。这4k代码要完成ARM CPU的核心配置以及将剩余的代码拷贝到SDRAM中(若从norflash启动则没有4k这个大小的限制,但是还会在完成最主要的设置后进入SDRAM中运行)。

1.1.1.2 ARM从norflash启动
若从norflash启动,则norflash直接被映射到内存的0x0地址处(就是nGCS0,这里就不需要片内SRAM来辅助了,所以片内SRAM的起始地址不变,还是0x40000000),然后cpu从0x00000000开始执行(也就是在Norfalsh中执行)。

需要说明的是,uboot代码段(.text段)起始位置必须是与上电后PC值一致,即编译uboot时,TEXT_BASE宏必须设置成0x0 ,反汇编uboot文件后,文本段第一条指令的地址也是0.

总结:

1、从norflash还是从nandflash启动,是由ARM的OM1和OM0引脚组合决定

2、不管从norflash还是nandflash启动,S3C2440上电后的pc值为0x0

3、如果某芯片上电后PC值不是0x0,假如是0x38ff0000,那么从norflash启动时,硬件就要自动将其映射到0x38ff0000地址处;如果从nandflash启动,那么硬件就要自动将nandflash中的前4K内容加载到0x38ff0000地址处。

ARM上电后第一条指令相关推荐

  1. 【基础】ARM芯片上电取第一条指令流程

    转载:ARM上电启动及Uboot代码分析 网上关于ARM的bootloader(以Uboot为例)的启动顺序的资料有好多,但是对于Uboot的地址映射.体系结构级操作介绍很少,都是直接开始Start. ...

  2. CPU加电后第一条指令

    当我们按下电源开关时,电源就开始向主板和其它设备供电,此时电压还不太稳定,主板上的控制芯片组会向CPU发出并保持一个RESET(重置)信号,让 CPU内部自动恢复到初始状态,但CPU在此刻不会马上执行 ...

  3. [architecture]-CPU(ARM)启动的第一条指令

  4. 【我所認知的BIOS】--第一条指令

    [我所認知的BIOS]-->第一条指令 By LightSeed 2009-10-26 其实早就想写这样一篇文章了,今天才着手写了下.说来也惭愧关于CPU的第一条指令的问题,在一开始study的 ...

  5. 计算机开机执行的第一条指令是什么?

    第一条指令的位置在FFFF:0000,也就是物理地址FFFF0.第一条指令是跳转到F000:EO5B. 接下来准备由实模式进入保护模式.加载GDT,置PE位为1,清指令预取队列并真正进入保护模式. 那 ...

  6. 自己动手写CPU(1)五级流水线及CPU第一条指令ori

    自己动手写CPU(1)五级流水线及CPU第一条指令ori 动机 不知为何研一的自由时间突然多起来,可能人一闲下来就容易焦虑吧,hhhhhh.正好之前看到一本<自己动手写CPU>,就按照此书 ...

  7. verilog实现多周期处理器之——(二)第一条指令ori的实现

    本博文希望对于OpenMIPS第一条指令ori加以实现并总结.会加入一些基本的理论以及博主的学习记录. 流水与五级流水 什么是流水:拆分,并行.将多条指令的执行相互重叠起来.就构成了流水,这样充分利用 ...

  8. 对[我所认识的BIOS]系列 -- CPU的第一条指令 一文扩充(III):从源代码到 FFS 文件

    我们可以在\Build\NT32IA32\DEBUG_VS2013\IA32\MdeModulePkg\Universal\BdsDxe\BdsDxe\OUTPUT\ 目录下,找到编译生成的 BdsD ...

  9. 对[我所认识的BIOS]系列 -- CPU的第一条指令 一文扩充(II):从FDF到Bios Rom image

    在"对[我所认识的BIOS]系列 -- CPU的第一条指令 一文扩充(I)"一文中,我用EFITool工具加载了BIOS Rom,发现Reset Vector位于BIOS Rom ...

最新文章

  1. Theano3.3-练习之逻辑回归
  2. mysql 时差查了13小时_Mysql 时间差了 14 或 13 小时 com.mysql.cj.jdbc.Driver
  3. eclipse maven创建web项目
  4. HDU - 3571 HDU CakeMan(bfs+最短路必经点)
  5. html中input后的报错信息,js 监测from表单中的input和select,时时监测,没有输入或选择信息报错,不允许提交数据...
  6. react(88)--ant design控制inputNumber设置正整数
  7. WordPress主题modown6.2+erphpdown11.7
  8. Android 内存泄漏分析(完)
  9. HTML表格的简单使用1
  10. 一次惨痛的微软AA面经历
  11. 微信群二维码活码生成系统 生成微信活码
  12. YUV和RGB调节色彩公式
  13. 点击率 ctr 与转化率 cvr
  14. 征服spring源码(一)
  15. [codeforces 1312A] Two Regular Polygons 整除
  16. Oracle Spatial中上载GIS空间数据方法研究
  17. 推荐系统lambda架构学习笔记之推荐系统算法(二)
  18. linux下刻录光盘读取不了_Linux操作系统下光盘刻录实战
  19. 快速建站 python_Django简单快捷建站(适合做大作业)
  20. 新 版 骗 分 导 论

热门文章

  1. java构造实部与虚部_没时间更优化了,(终极版)声明复数类,成员变量包括实部和虚部,成员方法包括实现由字符串构造复数、复数加法、减法,字符串描述、比较...
  2. 上白泽慧 洛谷1726 强连通分量
  3. 通信售前工程师的总结
  4. Lodop打印控件初始化过程
  5. 高斯过程(Gaussian Process)
  6. php 将CST时间转成格式化时间
  7. Java十六进制码的字符_【重点】java中 转16进制字符串 hex
  8. 关于鸡肋(goto)那些事
  9. 方舟加入服务器显示lnvalid,方舟生存进化更新180.4版后打怪无效怎么解决
  10. 科目3考试内容模拟灯光