Atmel ARM9启动流程与Bootstrap的大小内幕
来源:互联网 发布:statistic软件教学 编辑:程序博客网 时间:2024/05/22 07:42
原文地址:http://blog.csdn.net/embededswordman/article/details/6274324
AT91SAM系列的ARM内置了一片bootrom, 如果选择了合适的BMS电平, 那么芯片启动后会将bootrom映射到0x0地址.
启动bootrom后会从外面的的NVM(dataflash, nandflash..)中去寻找是否存在"合法"的固件程序. 如果有就将这个固件拷贝到内部SRAM中来运行. 而这个固件程序我们一般放置的就是bootstrap. 再由它去完成u-boot和kernel等等的搬移.
顺序如下:
bootrom (ROM) -> bootstrap (SRAM) -> u-boot (SDRAM) -> kernel (SDRAM)
对于dataflash和nandflash的NVM, ATMEL很巧妙的将第6个向量处放置的内容当做Bootstrap的大小.但是打开AT91bootstrap的源码, 发现第6个向量处有2种写法.
1) B . (或弄一个标号, 跳转本身)
2) .word _edata
第一种是直接放了一跳ARM跳转本身的指令在此位置, 转换为机器码之后是一个非常大的数. 远远超出了SRAM的大小.
第二种是用了汇编器的一个预留关键字_edata, 它是指向数据段的结尾. 按道理应该是和编译出来的bin同样大小才对. 但是自己通过将bin文件打开查看第6个向量确不相等. 后来才觉悟是由于基地址并不是0x0导致, 由于bootstrap最终是在SRAM里运行, 以SAM9260为例,SRAM基地址是0x20000. 所以是_edata=0x20000+程序大小,还是无法满足要求.
这两种方式都不正确,那BOOTROM是怎么知道要拷贝多大的长度呢?我一开始猜想是不超过最大的长度就OK了,即SRAM大小减去BOOTROM程序本身所需的堆栈,这是一个合理的解释,不过实际操作起来会浪费很多时间。而真正的内幕是:
原来SAM-BA软件中有一个send boot file的操作,这个操作暗地里读取文件大小将其写入第六个向量再写入0地址,所以bootstrap必须用SAM-BA的send boot file的方式烧写,如果自己从0地址send file是启动不了的,大家可以做实验验证。(其实在IAR下也有相应的Flashloader可以支持,但是一般没有人用)
over
- Atmel ARM9启动流程与Bootstrap的大小内幕
- Atmel ARM9启动流程与Bootstrap的大小内幕
- Atmel ARM9启动流程
- Atmel AT91SAM9x5系列ARM9
- Atmel SAMA5D3 U-Boot 启动流程简单分析
- 製作ARM9的Bootstrap Root Filesystem
- Tomcat源码阅读之Bootstrap启动流程与classLoader设计
- ARM9启动分析--存储器区分和启动流程解析
- Linux开机启动(bootstrap)流程
- arm9 norflash与nandflash启动过程分析
- arm9 norflash与nandflash启动过程分析
- arm9 norflash与nandflash启动过程分析
- struts2的启动流程与请求流程
- Atmel at91rm9200的armlinux的bootloader启动代码分析
- arm7与arm9的区别
- ARM7与ARM9的区别
- 自用的ARM9(tq2440)的启动代码
- S3C2410(ARM9)的启动方式
- 成员初始化
- android ANR
- 深入理解Stata的week()函数
- 关于printf
- Python一日一练100----消息服务器
- Atmel ARM9启动流程与Bootstrap的大小内幕
- spring:quartz 简单例子
- ubuntu设置无线网络
- 每天一个linux命令(5):rm 命令
- Android开发之使用URL访问网络资源
- 高速总线之一:XAUI 接口
- 3g android4 移植 飞思卡尔i.MX 6Quad Android 4.2.2的中兴和Ublox 3G驱动移植 Android——4.2 - 3G移植之路之 reference-ril .p
- ubuntu14.04 无线热点开启
- Linux进程间通信——使用共享内存