【嵌入式】U-boot学习笔记——一些U-boot之外的问题

本博文记录一些关于ARM芯片的一些知识点,与U-boot源代码无关,但是是学习U-boot的基础。

环境:S3C2440(ARM920T),U-boot-1.1.6


1、ARM9地址空间分配


1)ARM9为32位,采用统一编址

即可以寻址4GB空间,内存(SDRAM)和端口(特殊寄存器),还有ROM都映射到同一个4G空间里。


2)开发板上一般都用SDRAM做内存Flash(Nor、Nand)来当做ROM

其中Nand flash没有地址线,一次至少要读一页(512B).其他两个有地址线,所以Nand Flash不用来运行代码,只用来存储代码。

Nor Flash,SDRAM可以直接运行代码。


2、启动流程


1)当从NAND启动时

CPU会自动从Nand Flash中读取前4KB的数据放置在片内SRAM里(S3C2440是SOC),同时把这段片内SRAM映射到nGCS0片选的空间(即 0x00000000)。CPU是从

0x00000000开始执行,也就是Nand Flash里的前4KB内容。因为Nand Flash连地址线都没有,不能直接把Nand映射到0x00000000,只好使用片内SRAM做一个载体。

通过这个载体把Nand Flash中大代码复制到RAM(一般是SDRAM)中去执行。

程序员要完成的工作是把最核心的代码放在nandflash的前4K中。4K代码要完成S3C2440的核心配置以及启动代码(U-boot)的剩余部分拷贝到SDRAM中。

这4K的启动代码需要将NANDFlash中的内容复制到SDRAM中执行。NANDFlash的前4K空间放启动代码,SDRAM速度较快,用来执行主程序的代码。

ARM一般从ROM或Flash启动完成初始化,然后将应用程序拷贝到RAM,然后跳到RAM执行。


2)当从非NAND FLASH启动时

Nor Flash被映射到0x00000000地址(就是nGCS0,这里就不需要片内SRAM来辅助了,所以片内SRAM的起始地址还是0x40000000)。

然后CPU从0x00000000开始执行(也就是在Nor Flash中执行)。


3、指令


1)LDR指令与LDR伪指令

LDR指令的格式: 

LDR{条件} 目的寄存器 <存储器地址>

作用:将 存储器地址 所指地址处连续的4个字节(1个字)的数据传送到目的寄存器中。


LDR伪指令的格式:

LDR Rn,=expr

作用:将expr符号放入寄存器中


2)ADR伪指令与LDR指令

ADR伪指令格式 :

ADR{cond} register, expr

ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。

在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。

通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。

relocate:				/* relocate U-Boot to RAM	    */
	adr	r0, _start		/* r0 <- current position of code   */
	ldr	r1, _TEXT_BASE		/* test if we run from flash or RAM */
	cmp     r0, r1                  /* don't reloc during debug         */
	beq     stack_setup


所以有relocate这一段,为什么可以通过ADR和LDR判断当前运行的程序是否已经放在内存上

ADR得到的结果实际上是与绝对位置无关

adr r0, _start /* r0 <- current position of code */   

这条adr伪指令,目的便是为了获取_start标号在初始运行时的地址是多少。这条指令在编译的时候就会被真实的指令所替代,如:

sub r0, pc, #164 /* _start标号的地址在pc前面164byte处 */   

在编译时,编译器便确定pc指向这条语句时和_start标号的地址差多少,然后用实际的指令进行替代。这样在relocate之前,程序到底位于什么地方,即首地址便知道了。


而LDR得到的就是_TEXT_BASE实际上的地址0x33F80000的内容。


参考博客:

http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=20909886&id=5003161

http://blog.csdn.net/yp120yp/article/details/8508213

http://blog.csdn.net/lwj103862095/article/details/8073768


你可能感兴趣的:(嵌入式)