uboot启动流程(1)之链接脚本u-boot.lds详解

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

大部分转载了大神的博客: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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值