ARM的启动代码(1):介绍(转)
很多朋友搞嵌入式,写起代码来一点问题没有,到最后上板子调试的时候,挂了。究其原因,还是对芯片的启动地址、启动方式、bootloader和操作系统的衔接出了问题。今天就闲聊一下这个问题。
对于一个新处理器,我们最关心的是什么呢?并不是它支持不支持C编译器,有没有良好的开发环境。从程序员的角度说,要把一个新处理器吃透,必须明白两样东西:a)新处理器的内存模型;b)新处理器的中断方式、中断源等等。以ARM的AT91SAM9260为例。
一个ARM芯片可能有N种不同的启动方式,支持从SPI flash启动、Norfalsh、nandflash、片内rom 等等。一些操作系统,如vxworks、ecos也支持这些五花八门的启动方式,如果不理解内存模型,会认为这些方式是完全不同的。但从有经验的嵌入式软件工程师眼里,这些方式其实都是一种方式扩展出来的。所有的ARM一上电以后,都是进入SVC模式、中断关闭、ARM指令,从0x0处执行代码。 我们来考察一个问题,SP flash和Nandflash是用什么总线的呢?SPI 和 8Bit or 16bit, 在代码中可以通过简单的赋值和地址方式来访问spi flash和nandflash中的内容吗?是不可以的,读取spi flash/nandflash,写入spi flash/nandflash首先要写入命令,然后准备缓冲区,刷新数据。所有这些不可能简简单单的通过一条LDR、STR指令完成对存储单元的访问。专业的话来说,SPIflash/nandflash并不是和系统统一编址的。一上电以后,ARM从0x0处执行,是无法通过复杂的方式获取0x0处的数据,只能通过简单的总线动作完成。也就是,想直接用spiflash/nandflash启动ARM那是天方夜谭……为什么有的ARM可以用spiflash/nandflash启动系统呢?AT91SAM9260 就是一个这样的芯片。
我们来看看AT91SAM9260的芯片存储结构:0x0~0x0FFF FFFF是internal memories,就是芯片内部的存储器。0x0~ 0x0F FFFF 是boot memory, 0x10 0000 到 0x10 7FFF是ROM。0x20 0000~0x20 0FFF是 SRAM0,0x30 0000 ~ 0x30 0FFF 是 SRAM1。boot memory是什么?boot memory是一个空闲的地址。可将SRAM0、ROM映射到该地址来,也就是用控制寄存器,选择ROM、SRAM0映射到boot memory位置。如果访问boot memory的地址,也就是访问被映射到该位置的ROM或SRAM0地址内容。例如,如果boot memory映射了SRAM0,访问0x10 的位置与0x20 0010位置是等价的。芯片一上电后,默认的映射是ROM,ROM是什么?原来是ATMEL为9260定义的一段启动代码,出厂就固化在里面。它会寻找Dataflash(ATMEL的一种flash),从flash中加载bootloader,或寻找nandflash、norflash,加载bootloader。
ARM上电从内存0x0开始执行,9260将rom映射到boot memory的位置,即执行的rom中的代码。从外设中加载bootloader。这个过程就顺利成章了,boot memory在arm7中是经常可见的,用以解决ARM的启动和异常向量的问题。是个非常完美的解决方案。
到这里,我们就明白了,其实从nandflash/spi flash/uart/网络等方式加载应用程序,实际上,ARM裸机是做不到的,必须要告诉ARM方法。也就是说,我们必须写个程序告诉ARM,从什么口,什么方法可以把正确的代码载入内存。明白了这一点,就需要弄清楚地址了,就是将什么东西加载到什么位置。其实这个问题并不复杂,关键就是把一些概念分清楚就好了。
- 我们的代码加载到芯片统一编址的什么位置,这个地址整个芯片内部都是通行可见的。
- 我们的代码存储在spi flash/nandflash这样非统一编制的器件上,代码在这些器件上的地址从哪里开始?其实这个地址对ARM来说已经不是统一编制的地址了,只需要编程人员明了,写好驱动,从指定位置加载就好。如果厂家已经写好驱动,这个地址已经固定了,对于编程人员来说,将代码写入nandflash/spi flash不能再随心所欲了,因为无法改变驱动中的起始地址了。
- 被加载代码的格式。如果是原始二进制格式,参考1)就可以了。但如果是elf文件,那就稍微麻烦了:elf文件中含有每一块数据加载到芯片的什么位置,但不管怎么说,思路都是一样的,将合适的代码加载到芯片特定的位置。
修改这些地址的位置也是不同的,Bootloader可以配置将目标加载到的位置、获取目标代码的位置和获取目标代码的方法;工具链的链接脚本可以修改每个段(数据段、代码段)的位置。硬件的片选信号也决定着器件统一编址的位置。所以,在设计ARM启动代码的时候,不能孤立的去看芯片资料,需要统一从全局考虑。
ARM的启动代码(1):介绍(转)的更多相关文章
- ARM Linux启动代码分析
前言 在学习.分析之前首先要弄明白一个问题:为什么要分析启动代码? 因为启动代码绝大部分都是用汇编语言写的,对于没学过或者不熟悉汇编语言的同学确实有一定难度,但是如果你想真正深入地学习Linux,那么 ...
- arm:启动代码判断是从nand启动还是从norflash启动,拷贝程序到内存的过程
一.nand启动和nor启动:[1] CPU从0x00000000位置开始运行程序. 1.nand启动: 如果将S3C2440配置成从NANDFLASH启动(将开发板的启动开关拔到nand端,此时OM ...
- ARM上电启动及Uboot代码分析
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/qianlong4526888/article/details/27698707 注意:由于文档是去年 ...
- ARM启动代码中_main 与用户主程序main()的区别
1.1 问题描述 __main函数的作用是什么呀?1.2 问题剖析 __main函数是C/C++运行时库的一个函数,嵌入式系统在进入应用主程序之前必须有一个初始化的过程,使用__m ...
- ARM Cortex-M底层技术(2)—启动代码详解
杂谈 工作了一天,脑袋比较乱.一直想把底层的知识写成一个系列,希望可以坚持下去.为什么要写底层的东西呢?首先,工作用到了这部分内容,最近和内部Flash打交道比较多,自然而然会接触到一些底层的东西:第 ...
- STM32启动代码分析及其汇编学习-ARM
STM32 启动代码 Author By YuCloud 边看启动文件边学汇编 汇编 see ARM: Assembler User Guide see: https://blog.csdn.net/ ...
- S3C2440启动代码2440init.s彻底解析
可以选择nand启动和nor启动,这两者之间的关系通过一个按键来选择 这个OM0有何玄机,在数据手册中有这么一段 位宽RAM启动了(当然,还得设置一些东西,下面就说), Nanaflash启动经历的过 ...
- S3C6410的启动代码分析 一
本文开始第一篇,启动代码的编写,注意,仅仅是启动代码,并不是bootloader,因为只有boot,没有loader. 第一要明确:CPU上电之后,会从某个固定地址执行指令.ARM结构的CPU从地址0 ...
- STM32启动代码详细分析
最近需要学习iap的功能,因此离不开stm32的启动代码的分析,以前看了很多遍,都看不懂,读书百遍,其义自见,因此我有看了一遍,下面的文章,挺好的,因此转载: 在上电复位后,我们都知道会先运行启动代码 ...
随机推荐
- CodeForces 678D Iterated Linear Function
简单矩阵快速幂. #include<cstdio> #include<cstring> #include<cmath> #include<algorithm& ...
- Mybatis学习(5)高级映射
需求: 一.一对一查询 查询订单信息,关联查询创建订单的用户信息: orders--->user:一个订单只由一个用户创建,一对一 orders表 和 user表: 1)使用resultType ...
- ubuntu12.04 android studio 安装
ubuntu12.04 android studio 安装 分类: android 2014-02-17 15:57 10756人阅读 评论(0) 收藏 举报 1.下载JDK ,我下载的是jdk-7u ...
- android 没有main函数,怎么找到程序执行入口呢?以及activity主要生命周期的方法说明
android应用程序,由一到多个Activity组成.每个Activity没有很紧密的联系,因为我们可以在自己的程序中调用其它Activity,特别是调用自己的代码之外生成的Activity,比如a ...
- JavaBean--删除操作
删除命令:removeAttribute(Javabean名称) 前面调用用pageContext,request,session,application, 如request.removeAttrib ...
- BCDedit 研究
bcdedit的研究 系统引导安装 2009-11-12 22:21:13 阅读13 评论0 字号:大中小 首先说明下引导: 微软在Vista之前的系统,采用的是Ntldr来进行引导系统,使用的是bo ...
- Java socket通信
首先抛开语言层面,简单介绍一下socket通信过程: 1.服务器端开启监听端口,阻塞进程 等待客户端连接 2.客户端连接,这时就产生了一个socket socket就相当于一个传递消息的通道,一般都 ...
- 常用的dos命名
注销:logoff 注册表:regedit 查看显存:dxdiag 删除文件: del +文件 删除文件夹: rd+(/s)+文件名 (/s表示删除文件下的子目录和文件); 系统配置实用程序: msc ...
- 【简单dp】 poj 2346
题意:给定一个N 求一共有多少个N位数 前N/2个数的和等于后N/2个数的和思路:令F[i][j] 为sum值为j的i位数的个数则问题转化成 求 sum(F[n/2][j] * F[n/2][ ...
- ural1855 Trade Guilds of Erathia
Trade Guilds of Erathia Time limit: 2.0 secondMemory limit: 64 MB The continent of Antagarich was co ...