运行地址和加载地址

运行地址和加载地址

ID:8846663

大小:407.00 KB

页数:4页

时间:2018-04-09

运行地址和加载地址_第1页
运行地址和加载地址_第2页
运行地址和加载地址_第3页
运行地址和加载地址_第4页
资源描述:

《运行地址和加载地址》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、U-Boot移植过程中的运行地址和装载地址的区别uboot移植涉及到底层硬件的设置,因此需要掌握UART、系统时钟频率、NORFLASH、NANDFLASH、SDRAM、网卡、存储控制器等硬件的功能及配置,这些都可以参照相应开发板的芯片手册来完成,没有什么大的问题。在移植过程中,一直困扰我的是PIC(代码无关性)问题,即运行地址和加载地址的区别,看过网上很多关于这两者的介绍,感觉懂一点,却一直不知所然。在参考大量的文献下,算是得了一点心得。首先来了解下运行地址及加载地址的区别运行地址:也叫链接地址,是程序定位的绝对地址,即在编译连接时确定的地址。如果程序中有位置相关指令,程序在运行时,程

2、序必须在运行地址上。加载地址:程序放置的位置。运行地址和加载地址的值有时相等,有时却不相等,所以这给初学者带来很大的困扰。为了弄清楚这个问题,还得从NORFLASH,NANDFLASH,S3C2440内部4KBRAM的映射说起。左边表示从NORFLASH启动时的映射,右边表示从NANDFLASH启动时的映射。这里只讨论从NORFLASH启动的情况,从图中可以看出NORFLASH映射到了0X00000000的起始位置,假如UBOOT的代码存放在NORFLASH上,即装载地址为0X00000000。再来看看UBOOT的链接地址,代码在board/smdk2410/U-Boot.lds里。连接

3、脚本文件lds中没有设置LMA,只是设置了VMA。VMA的设置是通过顶层目录下的config.mk文件中的LDFLAGS实现的在board/smdk2410/config.mk定义了TEXT_BASE=0x33F80000(SDRAM),即程序的运行地址查看u-boot.map文件,代码的连接地址是从0x33F80000开始的。167.text0x33f800000x232c8168cpu/arm920t/start.o(.text)169.text0x33f800000x4a0cpu/arm920t/start.o1700x33f80048_bss_start1710x33f8004c

4、_bss_end1720x33f80044_armboot_start1730x33f80000_start174board/samsung/fs2410/lowlevel_init.o(.text)175.text0x33f804a00x64board/samsung/fs2410/lowlevel_init.o1760x33f804a4lowlevel_init177board/samsung/fs2410/nand_read.o(.text)178.text0x33f805040xe8board/samsung/fs2410/nand_read.o1790x33f80504wait

5、_idle1800x33f80518nand_read_ll此时装载地址和运行地址明显不一样,为什么程序还能运行呢?这里就涉及到PIC----代码无关设计方面的知识了。在汇编语言中,像bl、b、adr(adr属于伪指令,一般被编译器解释成sub指令)指令属于位置无关指令,不管程序装载在哪个位置上,bl、b、adr指令都能正确的运行,其原因是bl、b、adr指令的地址域是基于PC的相对偏移寻址,相当于[pc+offset]。当ARM启动时,ARM自动取0x00000000位置上的指令,此时PC=0x00000000。基于PC偏移量的指令都能正确的执行。所以uboot第一阶段指令都能执行的原

6、因在于此。但我们回顾一下u-boot的启动过程中的第一阶段有将u-boot代码复制到SDRAM中,并跳到SDRAM中去运行,因为SDRAM映射到了BANK6,其地址为0x30000000,此时uboot代码的地址范围从TEXT_BASE----TEXT_BASE+size(u-boot),程序是如何跳转的呢?跳转到SDRAM为何还能运行呢?这里就需要看下cpu/arm920t/start.S中的relocate标号。relocate:把norflash中的代码复制到_TEXT_BASE处,在board/smdk2410/config.mk定义了TEXT_BASE=0x33F80000,这

7、个地址属于BANK6的范围。也就是把代码复制到从_TEXT_BASE地址开始的SDRAM中,当然在复制之前是要初始化SDRAM的,要不然SDRAM没法使用。至此,代码已复制到SDRAM中,那么就要跳到SDRAM中去运行,跳转之前要做stack设置,清BSS,这些就不说了。下面来说如何跳转的,请看下面这条指令。ldrpc,_start_armbootldr伪指令中目的寄存器如果是pc,则ldr是与位置相关的指令,u-boot.map文

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。