加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ARM启动过程

发布时间:2020-12-15 06:18:08 所属栏目:百科 来源:网络整理
导读:ARM 启动过程 ??? 对于一般的嵌入式系统来讲,考虑到系统成本,运行速度等因素,往往联合使用好几种存储器件。在下面讲到的例子中,是开发中用到的一个 ARM9EJ 的处理器,系统中采用了SDRAM,ROM,Nand FLASH,ITCM,DTCM 等。?? ??? SDRAM: 程序正常运行时所在

ARM 启动过程
??? 对于一般的嵌入式系统来讲,考虑到系统成本,运行速度等因素,往往联合使用好几种存储器件。在下面讲到的例子中,是开发中用到的一个 ARM9EJ 的处理器,系统中采用了SDRAM,ROM,Nand FLASH,ITCM,DTCM 等。??
??? SDRAM: 程序正常运行时所在的存储器, 物理地址 0x24000000 - 0x24800000 (以8M 为例);
??? ROM:?? 复位后, ARM 从 ROM 启动, ROM 是只读的,出厂时就烧好了,不可更改,正常运行时,物理地址:
??????????? 0x2C000000 - 0x2C006000 (24KB);
??? Nand FLASH: 外接存储器件,正常运行的程序会通过烧录工具先放在这里。也可以做为用户的数据存储区,通过文件系统来访问。
??? ITCM,DTCM: 类似与 SDRAM,但是速度比 SDRAM 快很多,当进行大量,繁琐,且实时性要求较高的运算时,使用该存储。

??? 从开机,即对处理器发送一个 RESET 信号后, ARM 处理器就进入中断模式,从中断向量 RESET 处理,即地址0x00000000 处开始执行。但是,我们看到,整个系统在物理地址 0 处是没有存储器件的。实际上是, 对与大多数的ARM处理器来讲,有一个硬件映射的机制。对与这个处理器来说,开始时,默认将 ROM (0x2C000000 - 0x2C006000) 映射到地址零处,注意,此动作是由硬件达成的,软件不用考虑。此时,送到地址总线的地址是 0x00000000,但是对应的却是ROM 中offset 为0处的代码。 看看ROM 中代码是怎么考虑的:

??? .section .boot????????????????? #1
??? __RESET_ADDR:
?/* Move PC to ROM address */
? LDR PC,=0x2C000024??????????? #2
?/* Hardward init */
?BL? __HARDWARD_INIT??????????

?/* Detect SDRAM size */
?BL? __SDRAM_DETECT

?/* SDRAM init */
?BL? __SDRAM_INIT

?/* Data section init */
?BL? __DATA_INIT??????????????? #3


?/* BSS section init */
?BL? __BSS_INIT???????????????? #4
?
?/* ARM mode stacks init */
?BL? __STACK_INIT?????????????? #5


?/* Enter C code */
?B __MMU_START_MAIN????????????? #6
???
??? 需要注意的是上面标出来的6个地方,下面分别解释:
??? #1
??? GCC 会把以下的代码放到 .boot 段中,通过 ld 中对 .boot 的安排,可将该段放在指定的地址空间,参见后面的 ld 描述;
???
??? #2
??? 此处将 PC 指针赋值为 0x2C000024,通过对这个 .boot 段进行反汇编,可以看到该地址对应
??? BL? __HARDWARD_INIT,就是该条指令的下一条。 此时,物理地址 0x00000024 和 0x2C000024 都对应这条指令,这是由于重映射机制造成的。通过,执行
??? LDR PC,=0x2C000024,使得处理器的地址空间从原来的 0x0000000 变到 0x2C000000 ,这是必要的。其一: ROM 本身就对应在 0x2C000000 这个地址空间,恢复到此空间是很自然的。其二:为后面的重映射做准备。因为ROM 的运行速度没有 SDRAM 快,所以通常把程序加载到 SDRAM 中运行,由于中断向量的在 0x00000000 处,所以需要把 SDRAM 映射到 0 地址去,这也是硬件映射的。如果不做这种转换的话,当进行了硬件映射后,两条指令就接不上了,上一条指令是 0x0000xxxx,位于 ROM 中,下一条指令 0x0000xxxy 为与SDRAM ,会接着从 SDRAM 中执行,很容易出问题。
???
??? #3
??? 此处做数据段的初始化的,数据段是可读可写的。所以必须把数据段搬到 SDRAM 中去,方可使用。该数据段的 LMA 和? VMA 是不同的,通过在 ld 中加上标签,可以得知从哪儿搬数据,要搬到那儿去。

??? #4
??? 做BSS 段初始话,一般清0。 值得注意的是,对于初始化为 0 的全局变量,可能会放在这里。

??? #5
??? 初始化,各个模式下的堆栈。

??? #6
??? 启动MMU,进入main 函数。??????

??? 由于 ROM 中空间有限,上面在 ROM 中代码不可能做更多动作。 一般我们把自己编写程序生成 arm 代码放在 Nand Flash 中。在 ROM 中的程序进入main 后,就会通过nand driver 将存在nand 中的code 读到 SDRAM 中,然后做硬件重映射,将 SDRAM 映射到地址 0 处, 然后在 SDRAM 中跑。 对于 ARM 的 bootload 来将,做的就是这个工作。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读