Chinaunix
标题:
uboot relocate是怎么确定自身大小的?2440的relocate貌似有BUG?
[打印本页]
作者:
zennTidy
时间:
2017-04-06 10:23
标题:
uboot relocate是怎么确定自身大小的?2440的relocate貌似有BUG?
我看2440的uboot relocate中,似乎有个bug?请看以下代码和注释
relocate:
/*********** CHECK_FOR_MAGIC_NUMBER***************/
ldr r1, =(0xdeadbeef) //这一段是什么意思、作用?
cmp r0, r1
bne loop3
/*********** CHECK_FOR_MAGIC_NUMBER***************/
adr r0, _start /* r0 <- current position of code */
ldr r1, _TEXT_BASE /* test if we run from flash or RAM */
ldr r2, _armboot_start //为什么是_armboot_start而不是_start。
ldr r3, _bss_start
sub r2, r3, r2 /* r2 <- size of armboot */ //那这样算出来的size就是bss段到_armboot_start的差,而_start到_armboot_start的差没有被计算在内
add r2, r0, r2 /* r2 <- source end address */ //然后拷贝又是从_start开始的,这样拷贝下来最后会少一部分内容。(_start到_armboot_start的字节数)
复制代码
所以我比较疑惑的是:
1.为什么是
_armboot_start
2.为什么是
_bss_start
3.他俩都是在哪里被指定地址的?连接脚本里面?
以下是连接脚本:
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
. = 0x00000000;
. = ALIGN(4);
.text :
{
cpu/arm920t/start.o (.text)
board/tekkamanninja/mini2440/lowlevel_init.o (.text)
board/tekkamanninja/mini2440/nand_read.o (.text)
*(.text)
}
. = ALIGN(4);
.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
. = ALIGN(4);
.data : { *(.data) }
. = ALIGN(4);
.got : { *(.got) }
. = .;
__u_boot_cmd_start = .;
.u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd_end = .;
. = ALIGN(4);
__bss_start = .;
.bss (NOLOAD) : { *(.bss) . = ALIGN(4); }
_end = .;
}
复制代码
Thanks!
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2