s3c2440学习系列2

uboot:

 

首先cpu自动将nand4k code 拷贝到内部的sram buf中,然后开始从0地址执行, CPU的模式设置为管理模式(svc),关闭看门狗,设置FCLKHCLKPCLK的比例,主要设置CLKDIVN寄存器,关闭MMUCACHE。在自行的过程中,利用uboot中的nand的驱动,从地址0读取长度0x30000192k)的内容到0x33f80000这里,为了确保读取的正确性质,它会和sram里面比较4k的内容。

这里有几个问题需要明确:

1:如何知道uboot刚好放在nand的地址0处,是根据u-boot.lds中的地址0x00000000来确定。在sram里面执行的时候就是从地址0开始执行,因为sram容量有限,所以uboot中的内容不能全部拷贝到sram中,所以在uboot中有一些函数调用不了,0x1000字节之后就运行不了。

2:所以在uboot4k的代码中除了做一些初始化动作以外,还需要将自己uboot拷贝到dram中,所以就有了上面的说法,从地址0读取长度0x30000192k)的内容到0x33f80000,我们看一下,为什么要选择将代码拷贝到dram0x33f80000处,这是在board/xxx/2440/config.mk中来设置的TEXT_BASE,所以的代码在dram中的运行地址都是0x33f80000之后的,即所谓的连接地址和运行时域。在拷贝完成以后,重新建立栈地址,在0x33f80000dram域中运行。


在这里我们要注意代码:

.globl _armboot_start 

_armboot_start:

.word _start

 ldr r2, _armboot_start

1. 汇编语言中所有定义的标号指的都是绝对地址, 对标号的引用也就是绝对地址的引用.

_armboot_start: 相当于直接的 #define 定义, _armboot_start的引用就是直接的替换操作.

2. 汇编中没有变量的概念, 但是使用LDR指令可以实现类似C中变量的功能.比如上程序中,  ldr r2, _armboot_start   [1]ldr r2, =_armboot_start   [2]是不同的,

[1]可以理解为将变量_armboot_start的值即_start送入r2.,是ldr指令

[2]则是将_armboot_start所在的地址送入日r2. 相当于C中的&_armboot_start(取地址操作),这是ldr伪指令

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值