分类: LINUX
2011-12-28 16:22:51
(1) .lds文件到底起什么作用
(2) start.o中初始化和文字池的关系(汇编语言问题),以及的那几个变量的作用
注:本文是基于u-boot-1.1.6编写的。
(1) .lds文件到底起什么作用
.lds的源代码如下:
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
/*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*/
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
. = 0x00000000; 定位当前的地址为0地址
. = ALIGN(4); 代码以4字节对齐
.text : 指定代码段
{
cpu/arm920t/start.o (.text) ;代码的第一个代码部分
*(.text) ;其它代码部分,但我不知道具体是那些。但其属性必须是.text
}
. = ALIGN(4);
.rodata : { *(.rodata) }
. = ALIGN(4);
.data : { *(.data) }
. = ALIGN(4);
.got : { *(.got) }
. = .;
__u_boot_cmd_start = .; 将__u_boot_cmd_start 赋值为当前位置
.u_boot_cmd : { *(.u_boot_cmd) } ;指定u_boot_cmd段,uboot把命令放在该段
__u_boot_cmd_end = .;
. = ALIGN(4);
__bss_start = .;
.bss : { *(.bss) }
_end = .;
}
我们用图1来表示一下上面的空间分配。
图 1 uboot在flash中的分配
我现在的疑问是这个图是什么地方的空间分配。
我们知道.lds文件的作用是“决定一个可执行程序的各个段的存储位置,以及入口地址”。那么,.lds决定了uboot在flash中的分配情况了。
(2) start.o中初始化和文字池的关系(汇编语言问题),以及的那几个变量的作用
在start.o中有如下的代码,这些的代码的作用是声明并初始化变量。其中的值是各代码段在内存中的位置。
_TEXT_BASE:
.word TEXT_BASE
.globl _armboot_start
_armboot_start:
.word _start
/*
* These are defined in the board-specific linker script.
*/
.globl _bss_start
_bss_start:
.word __bss_start
.globl _bss_end
_bss_end:
.word _end
#ifdef CONFIG_USE_IRQ
/* IRQ stack memory (calculated at run-time) */
.globl IRQ_STACK_START
IRQ_STACK_START:
.word 0x0badc0de
/* IRQ stack memory (calculated at run-time) */
.globl FIQ_STACK_START
FIQ_STACK_START:
.word 0x0badc0de
#endif
由于系统是从flash的0x0000_0000位置启动的,而我们在.lds文件中讲start.o放在了这个位置,所以系统会从这里开始启动。根据源代码,我们可以分析出如下的uboot启动步骤:
① 关闭watchdog
② 关闭IRQ等中断
③ 设置CLK比
④ 关闭cache、MMU
⑤ 初始化话SDRAM控制器
⑥ 将flash中的区别uboot映像搬到SDRAM中【将我们图1中的内容,搬到SDRAM中,具体如图2所示】
⑦ 建立堆栈【这一块涉及内存空间分配】【这一块涉及内存空间分配,具体如图2所示】
⑧ 清空.bss
⑨ 通过ldr pc, _start_armboot进入stage2,也就是进入C代码
图2是uboot在存储器中的映射
图2 是uboot在存储器中的映射
我现在关于.lds文件和.bss区还有一些分析的不透彻的地方。但总而言之,当stage1完成后回生成上面的图2。而图2决定了我们可以运行C语言了。