u-boot入口 _start函数学习
前言
u-boot一个嵌入式裸机程序,一般被当作OS的bootloader来使用。因为u-boot本身对底层硬件操作的便利性,也常常被用来在OS之下对各个嵌入式硬件模块进行测试。因此学会u-boot对一名嵌入式工程师来说是非常重要的。当今快速发展的社会,竞争激烈。对笔者来说,掌握u-boot是面对不确定时,信心和底气的来源。
关于本文
这篇博客,基于笔者正在开发的平台,简单介绍u-boot.lds连接脚本,u-boot内存分布模型,u-boot第一个执行的函数_start()。
u-boot.lds
u-boot.lds
是 U-Boot (嵌入式系统的引导加载程序)的链接脚本文件,用于描述 U-Boot 在链接过程中如何组织目标文件,并确定它们在内存中的布局和分配方式。这个文件的后缀 .lds
表示它是一个链接脚本文件。
在 u-boot.lds
文件中,你会找到一系列的指令和命令,用于定义程序的段(section)布局、地址空间的分配以及程序的入口地址等。这些指令和命令决定了 U-Boot 最终生成的可执行文件的结构和执行方式。
典型的 u-boot.lds
文件可能包含以下几个部分:
- OUTPUT_ARCH 指令:用于指定目标架构的类型,比如
OUTPUT_ARCH(arm)
表示目标架构是 ARM。 - ENTRY 指令:用于指定程序的入口地址。在 U-Boot 中通常是
ENTRY(_start)
,表示程序的入口地址是_start
。 - SECTIONS 段:这是
u-boot.lds
文件中最重要的部分,它定义了程序中各个段的布局和分配方式。比如.text
段、.data
段、.bss
段等。每个段都有自己的起始地址、大小和属性等信息。 - ALIGN 指令:用于对段进行对齐操作,以确保各个段的起始地址符合要求。
通过编辑u-boot.lds
文件,可以自定义 U-Boot 的链接行为,例如修改程序的段布局、改变程序的入口地址等。这对于一些特殊的应用场景或者定制化需求是非常有用的。
这样,链接器就会按照链接脚本的要求,将text段一个个打包进image的相应位置,每个函数都有了自己在内存中的地址。其他段的拼接和text段类似,笔者就不赘述了,感兴趣的可以学习链接原理。推荐博客:SegmentFault思否的彻底理解链接器四篇