- 论坛徽章:
- 0
|
我看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!
|
|