学习毕业班,有几个疑惑的问题,想请教大家,希望解答啊。
(1)为什么重定位的时候BSS段不拷贝过去?如果在SDRAM中调用这些BSS段定义的变量或者地址,不是需要在SDRAM进行地址的转换吗?就跟新的u-boot的做法一样,需要地址转换啊。
比如,在bss段中有个变量的地址是0x100, 那如果在SDRAM中引用这个变量不是需要地址转换吗?这样不是必须得拷贝这个变量过去吗??
(2)既然bss段没有拷贝过去,为什么存储在SDRAM上u-boot代码总的大小是:__bss_end__ - _start 呢?
代码重定向拷贝代码不是只拷贝了除BSS段以外代码段和数据段的大小么? ldr r2, =_bss_start_ofs // _bss_start_ofs = __bss_start - _start,表示u-boot代码的大小。
(3)还有一个问题是,为什么修改_TEXT_BASE = 0x33f00000以后,反汇编就是从0x33f00000开始呢?
但是在u-boot.lds中的链接地址不是从0 开始的么?
SEC
tiONS
{
. = 0x00000000; // 不是从0地址处开始堆放的么???
. = ALIGN(4);
.text :
{
__image_copy_start = .;
arch/
ARM/cpu/arm920t/start.o (.text)
board/samsung/smdk2440/libsmdk2440.o (.text)
*(.text)
}
. = ALIGN(4);
.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
. = ALIGN(4);
.data : {
*(.data)
}
. = ALIGN(4);
. = .;
__u_boot_cmd_start = .;
.u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd_end = .;
. = ALIGN(4);
__image_copy_end = .;
.rel.dyn : {
__rel_dyn_start = .;
*(.rel*)
__rel_dyn_end = .;
}
.dynsym : {
__dynsym_start = .;
*(.dynsym)
}
_end = .;
. = ALIGN(4096);
.mmutable : {
*(.mmutable)
}
.bss __rel_dyn_start (OVERLAY) : {
__bss_start = .;
*(.bss)
. = ALIGN(4);
__bss_end__ = .;
}
/DISCARD/ : { *(.dynstr*) }
/DISCARD/ : { *(.dynamic*) }
/DISCARD/ : { *(.plt*) }
/DISCARD/ : { *(.interp*) }
/DISCARD/ : { *(.gnu*) }
}