大部分转载了大神的博客:uboot启动流程(1)之链接脚本u-boot.lds详解_蒋文韬的博客-CSDN博客
部分穿插了对自身平台内容的理解。
=========================================================================
要分析 uboot 的启动流程,首先要找到“入口”,找到第一行程序在哪里。程序的链接是由链接脚本来决定的,所以通过链接脚本可以找到程序的入口。如果没有编译过 uboot 的话链接脚本为arch/arm/cpu/u-boot.lds。但是这个不是最终使用的链接脚本,最终的链接脚本是在这个链接脚本的基础上生成的。编译一下 uboot,编译完成以后就会在 uboot 根目录下生成 u-boot.lds文件
只有编译 u-boot 以后才会在根目录下出现 u-boot.lds 文件!
打开 u-boot.lds,内容如下(以下文件内容是我所用的A40/T3平台):
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
. = 0x4A000000;
. = ALIGN(4);
.head :
{
*(.__image_copy_start)
arch/arm/cpu/armv7/spare_head.o (.data*)
}
.hash :
{
arch/arm/cpu/armv7/uboot_hash.o(.data*)
}
. = ALIGN(4);
.text :
{
*(.vectors)
arch/arm/cpu/armv7/start.o (.text*)
*(.text*)
}
. = ALIGN(4);
.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
. = ALIGN(4);
.data :
{
*(.data*)
}
. = ALIGN(4);
. = .;
. = ALIGN(4);
.u_boot_list :
{
KEEP(*(SORT(.u_boot_list*)));
}
. = ALIGN(4);
.image_copy_end :
{
*(.__image_copy_end)
}
.rel_dyn_start :
{
*(.__rel_dyn_start)
}
.rel.dyn :
{
*(.rel*)
}
.rel_dyn_end :
{
*(.__rel_dyn_end)
}
.end :
{
*(.__end)
}
_image_binary_end = .;
. = ALIGN(4096);
.mmutable : {
*(.mmutable)
}
.bss_start __rel_dyn_start (OVERLAY) : {
KEEP(*(.__bss_start));
__bss_base = .;
}
.bss __bss_base (OVERLAY) : {
*(.bss*)
. = ALIGN(4);
__bss_limit = .;
}
.bss_end __bss_limit (OVER
U-Boot启动流程解析:链接脚本与内存布局

本文详细分析了U-Boot的启动流程,从链接脚本u-boot.lds入手,解释了入口点、中断向量表、代码段和数据段的布局。通过实例展示了不同平台的内存映射,并提到了关键变量和其在u-boot.map中的值,揭示了启动过程中各段代码的作用和地址关系。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



