当前位置:首页 > 单片机 > 单片机
[导读] 在u-boot的start.S中有这么一段relocate: /*relocate U-Boot to RAM */ adr r0, _start /*r0 800b4: e51f107cldr r1, [pc, #-124]字面意思是要取[pc, #-124]地址中的值,也就是要取_TEXT_BASE这个地址

在u-boot的start.S中有这么一段

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 duringdebug */

beq clear_bss

ldr r2, _armboot_start

ldr r3, _bss_start

sub r2, r3, r2 /*r2 <- size of armboot */

bl CopyCode2Ram /*r0: source, r1: dest, r2: size */

clear_bss:

…….

比较r0和r1,如果不相等就把代码从flash中copy到ram中去。但问题是单从adr和ldr这两条指令上怎么就能判断出r0和r1不相等呢?

既汇编搞不定那就反汇编了,汇编以上代码可以看出这两个指令有不同之处

33d800b0 :

33d800b0:e24f00b8 sub r0, pc, #184 ; 0xb8

33d800b4:e51f107c ldr r1, [pc, #-124] ;33d80040 <_text_base>

33d800b8:e1500001 cmp r0, r1

33d800bc:0a000003 beq 33d800d0

adr r0, _start ==> 33d800b0: e24f00b8 sub r0, pc, #184 ; 0xb8

取pc-184处的标号的地址,并把这个地址赋给r0,而_start是随着加载地址的不同而变化的,所以r0是变化的。当从nandflash运行时,实际上是在sram的0x0地址运行,_start的地址是0x0;而从0x33d80000处运行时,此时_start的值是0x33d80000。

ldr r1, _TEXT_BASE ==>800b4: e51f107cldr r1, [pc, #-124]

字面意思是要取[pc, #-124]地址中的值,也就是要取_TEXT_BASE这个地址中的值,无论如何链接_TEXT_BASE的地址会变,但是_TEXT_BASE地址处的值TEXT_BASE不变。这条指令就是把_TEXT_BASE的值也就是.word TEXT_BASE赋给r1,既r1=TEXT_BASE=0x33d80000。这条指令跟程序跑在什么位置没有关系,只要定义了TEXT_BASE,那么此处r1=TEXT_BASE.


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

同大多数的Bootloader一样,uboot的启动过程也分为BL1、BL2两个阶段,分别对应着SPL和Uboot。

关键字: Bootloader uboot SPL

为什么要有uboot?它能解决哪些问题?

关键字: uboot 计算机 嵌入式

一、为什么要有uboot 1.1、计算机系统的主要部件 (1)计算机系统就是以CPU为核心来运行的系统。典型的计算机系统有:PC机(台式机+笔记本)、嵌入式设备(手机、平板电脑、游戏机)、单片机(家用电器像电饭锅、空调)...

关键字: uboot

我们从u-boot启动内核可知道,uboot通过这条命令theKernel (0, bd->bi_arch_number, bd->bi_boot_params);来启动内核。那么我们可以

关键字: uboot linux内核启动流程 内核启动

开始start.s分析,根据S3C2410来跟踪代码,参考了S3C2410的datasheet和网上各个帖子一般来说,大家都是从start.s来分析UBOOT,但是事实是流程是从makefile中来的,也就是说是在敲入m...

关键字: s3c2410 uboot

程序从start。S开始启动start_code: /*  * set the cpu to SVC32 mode  设置管理模式  */ mrs r0, cpsr         bic r0, r

关键字: Flash nor uboot 启动分析

Ok6410的硬件相比mini6410强大许多(同样的价钱),但是ok6410的uboot制作用起来不方便,需要输入很多命令才可以烧写完一个系统。我还是比较怀念在2440上方便、灵活的烧写方式。 下面我们就来修改出一个...

关键字: s3c6410 uboot

在复杂的应用系统中通常都需要嵌入式操作系统的支持,这样嵌入式操作系统镜像文件的尺寸往往就会变得比较大。可以选择通过网络将嵌入式操作系统加载到SDRAM中运行来解决这一问题。另外,通过网络进行操作时,只要将需要升级的软件系...

关键字: tftp uboot 嵌入式开发 网络加载
关闭
关闭