1、框架
2、启动过程
大多数ARM芯片从0地址启动
NOR启动:NOR Flash 基地址为0,片内 RAM 地址为 0X4000,0000
CPU 读出Nor上第一个指令(前四个字节),执行
CPU继续读出其他指令执行
Nand启动:片内 4K RAM 基地址为0,Nor Flash 不可访问
2440硬件把Nand前4K内容复制到片内 RAM
然后 CPU 从0地址取出第一条指令
例如:(汇编代码)
ldr sp, =4096 /* nand启动 */
ldr sp, =0x40000000+4096 /* nor启动 */
3、几条常用汇编指令
LDR: 读内存
LDR R0,[R1]
读取地址 R1 的数据(四字节),保存到R0中
STR: 写内存命令
STRR0,[R1]
将 R0 的值写入地址 R1 (四字节)
B: 跳转
MOV:
MOV R0,R1
把 R1 的值赋给 R0 ,R0 = R1
MOV R0,#0x100 ,R0 = 0x100
LDR R0,=0x12345678
R0 = 0x12345678
伪指令,他会被拆分为几条真正的RAM指令
MOV R0,=0x12345678 错误的
6. 加指令
add r0,r1,#4r0 = r1 + 4
sub r0,r1,#4r0 = r1- 4
sub r0,r1,r2r0 = r1- r2
BL:
跳转到***
把返回地址保存到LR寄存器即下一条指令的起始地址
ldm:读内存,写入多个寄存器
stm:把多个寄存器的值写入内存
内存就是寄存器
4、NOR启动和NAND启动的区别
nand flash与nor flash的最主要区别
性能区别
在JZ2440开发板上有两种Flash,分别为nand flash和nor flash。这两种flash的最主要的区别为:nor flash比较稳定,存在里面的数据不易丢失,但是容量小,nor flash在读的时候可以像内存一样操作;其次,NOR的读速度比NAND稍快一些。NAND的写入速度比NOR快很多。nand flash容量大,但是存在位反转,会导致数据丢失,读写需要通过一定的时序。所以一般nor flash里面存放的uboot代码,而nand flash里面存放的是占用容量比较大的linux内核和文件系统。在JZ2440上,nand flash的容量为256M,而nor flash只有2M。
当从NAND启动时
CPU会自动从NAND flash中读取前 4KB 的数据放置在片内SRAM里(s3c2440是soc),同时把这段片内SRAM映射到nGCS0片选的空间(即0x00000000)。cpu是从0x00000000开始执行,也就是NAND flash里的前 4KB 内容。因为NAND FLASH连地址线都没有,不能直接把NAND映射到0x00000000,只好使用片内SRAM做一个载体。通过这个载体把nandflash中大代码复制到RAM(一般是SDRAM)中去执行。
当从非NAND flash启动时
nor flash被映射到0x00000000地址(就是nGCS0,这里就不需要片内SRAM来辅助了,所以片内SRAM的起始地址还是0x40000000). 然后CPU从0x00000000开始执行(也就是在Norfalsh中执行)。
Uboot里的流程:
启动时先将0x4000003C处的数据清零,再读出0x0000003C处地址的数据,如果为0就意味着,这个地址是同时映射在0x4000003C处和0x0000003C处即为nandflash启动,不相等则为norflash启动。
但是最后有一点很重要:
如果是Nand flash启动,必须要复原清零的数据。原因是:在nand boot过后,会核对内部SRAM中的4K程序,和从Nand中拷贝到SDRAM的前4K程序是否一致,如果不一致会进入死循环。