u-boot分析--u-boot.lds
2013-12-17 17:00
190 查看
转载地址:/article/6998159.html
Bootloader启动大多都分为两个阶段。第一阶段主要包含依赖于CPU的体系结构的硬件初始化的代码,通常都用汇编语言来实现;第二阶段通常用C语言来完成,以便实现更复杂的功能,也使程序有更好的可读性和可移植性。
U-Boot的启动代码分布在start.s、low_level_init.s、board.c和main.c文件中:
start.s:是U-Boot整个程序的入口,该文件使用汇编语言编写,不同体系结构的启动代码是不同的;
low_level_init.s:是特定开发板的设置代码;
board.c:包含开发板底层设备驱动;
main.c:是一个与平台无关的代码,U-Boot应用程序的入口在此文件中;
第一阶段对应的文件是 /cpu/XXX/start.s 和 /board/freescale/XXX/low_level_init.s。
第二阶段对应的文件是 /lib_arm/board.c,最后跳转到 /common/main.c,main_loop在标准转入设备中接受命令行,然后分析,查找,执行。
一个可执行的image必须有一个入口点,并且只能有一个全局入口点,所以要通知编译器这个入口在哪里,入口点是通过链接脚本来实现的,是在 /cpu/arm_cortexa8/u-boot.lds中指定的,其中ENTER(_start)说明程序是从_start开始运行,而它指向的是 /cpu/arm_cortexa8/start.o 文件。
因为我们用的是cortex-a8的cpu架构,在cpu复位后从iROM地址0x00000000取它的第一条指令,执行iROM代码的功能是把Flash中的前16K的代码加载到iRAM中,系统上电后将首先执行u-boot程序。
首先我们来看一下u-boot.lds链接脚本,通过它我们可以知道它整个程序的各个段是怎么存放的。
说明1:标准应用程序包括3类标准段空间:.text 运行代码段;.data 全局变量等具有初始化值的数据空间;.bss暂态变量,堆栈等数据空间
说明2:.rodata,.got,.u_boot_cmd 等段空间由程序员设计需要而自行定义的段空间;
说明3:采用的CPU其指令字长为4字节的,所以地址调整为4字节;
我们查看Makefile中的LDFLAGS变量,发现一条指令:
LDFLAGS+=-Ttext $(TEXT_BASE),其中TEXT_BASE是在u-boot根目录的board文件夹的对应的开发板名字的子目录下的config.mk文件中定义的。在链接的时候 ld 命令会把参数 -Ttext 指定的地址赋给 .text ,所以 .text 在u-boot.lds中的默认地址不起作用。
Bootloader启动大多都分为两个阶段。第一阶段主要包含依赖于CPU的体系结构的硬件初始化的代码,通常都用汇编语言来实现;第二阶段通常用C语言来完成,以便实现更复杂的功能,也使程序有更好的可读性和可移植性。
U-Boot的启动代码分布在start.s、low_level_init.s、board.c和main.c文件中:
start.s:是U-Boot整个程序的入口,该文件使用汇编语言编写,不同体系结构的启动代码是不同的;
low_level_init.s:是特定开发板的设置代码;
board.c:包含开发板底层设备驱动;
main.c:是一个与平台无关的代码,U-Boot应用程序的入口在此文件中;
第一阶段对应的文件是 /cpu/XXX/start.s 和 /board/freescale/XXX/low_level_init.s。
第二阶段对应的文件是 /lib_arm/board.c,最后跳转到 /common/main.c,main_loop在标准转入设备中接受命令行,然后分析,查找,执行。
一个可执行的image必须有一个入口点,并且只能有一个全局入口点,所以要通知编译器这个入口在哪里,入口点是通过链接脚本来实现的,是在 /cpu/arm_cortexa8/u-boot.lds中指定的,其中ENTER(_start)说明程序是从_start开始运行,而它指向的是 /cpu/arm_cortexa8/start.o 文件。
因为我们用的是cortex-a8的cpu架构,在cpu复位后从iROM地址0x00000000取它的第一条指令,执行iROM代码的功能是把Flash中的前16K的代码加载到iRAM中,系统上电后将首先执行u-boot程序。
首先我们来看一下u-boot.lds链接脚本,通过它我们可以知道它整个程序的各个段是怎么存放的。
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") OUTPUT_ARCH(arm) ENTRY(_start) SECTIONS { . = 0x00000000; . = ALIGN(4); .text : { cpu/arm_cortexa8/start.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 : { *(.bss) } _end = .; }
说明1:标准应用程序包括3类标准段空间:.text 运行代码段;.data 全局变量等具有初始化值的数据空间;.bss暂态变量,堆栈等数据空间
说明2:.rodata,.got,.u_boot_cmd 等段空间由程序员设计需要而自行定义的段空间;
说明3:采用的CPU其指令字长为4字节的,所以地址调整为4字节;
我们查看Makefile中的LDFLAGS变量,发现一条指令:
LDFLAGS+=-Ttext $(TEXT_BASE),其中TEXT_BASE是在u-boot根目录的board文件夹的对应的开发板名字的子目录下的config.mk文件中定义的。在链接的时候 ld 命令会把参数 -Ttext 指定的地址赋给 .text ,所以 .text 在u-boot.lds中的默认地址不起作用。
相关文章推荐
- uboot 之uboot.lds分析
- u-boot中.lds链接脚本文件的分析
- u-boot.lds链接脚本分析
- u-boot.lds分析
- u-boot中.lds连接脚本文件的分析
- u-boot分析 三 (u-boot.lds脚本)
- u-boot中.lds链接脚本文件的分析
- uboot分析之u-boot.lds
- u-boot.lds 文件分析
- u-boot-nand.lds分析
- 自己写bootloader笔记4---uboot.lds分析
- 对u-boot.lds的更详细的分析
- [uboot学习笔记(一)]u-boot.lds文件分析
- uboot分析之u-boot.lds
- u-boot.lds 链接脚本分析(hi3515)
- u-boot 连接脚本文件u-boot.lds的分析
- arm处理器的u-boot.lds文件分析
- uboot 之uboot.lds分析
- u-boot.lds链接脚本分析
- 对u-boot.lds的分析