uboot armv8 启动流程之 linker script

section 详细说明
.text

按如下顺序,中断向量表vectors, 启动入口代码start.o,

普通text, glue (arm thumb2 相互调用时自动生成的代码)

        *(.vectors)
        CPUDIR/start.o (.text*)
        *(.text*)
        *(.glue*)

__image_copy_start 标记为text 段入口,
将code 搬到dram 时,从这开始搬

.rodata 

存储所有rodata 段,即只读变量,按对齐按名字排序

*(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))

.data存储所有data 段,即已初始化可读可写变量
__u_boot_list

u-boot 中的各种init 入口会统一放在***list 区,由init 统一执行,

避免了在去维护一支文件来主动显式调用

binman_sym_table

binman,即binary manager, 用以维护生成的所有binary

__image_copy_end, 以下内容不会被搬到dram

.rel.dyn

重定位表,用于般code 时计算各段offset

_image_binary_end 标记为rel.dyn 结尾

.bss未初始化变量

ARMv8 架构下,U-Boot启动流程主要分为多个阶段,从硬件初始化到最终加载并启动 Linux 内核。以下是详细分析: ### 汇编启动阶段 U-Boot启动流程通常从 `_start` 符号开始,进入 `reset` 函数进行初始设置。在 `reset` 函数中,主要完成以下工作: - **中断禁用**:通过修改 CPSR 寄存器,禁用 FIQ 和 IRQ 中断,并将 CPU 设置为 SVC32 模式,除非当前处于 HYP 模式[^4]。 - **保存启动参数**:允许开发板保存重要的寄存器信息,以备后续使用。 随后,U-Boot 会进行一些平台相关的初始化操作,包括时钟、内存控制器、串口等基本外设的初始化。这部分工作通常依赖于具体的硬件设计。 ### 地址无关与重定位 在完成基本的硬件初始化之后,U-Boot 会进入地址无关代码(Position Independent Code, PIC)阶段。此阶段的主要任务是确定 U-Boot 映像是否已经加载到正确的内存地址。如果当前运行的地址与最终期望的地址不同,U-Boot 会进行重定位(relocation),即将自身复制到最终的运行地址。 重定位完成后,U-Boot 会跳转到 `relocated` 标签处继续执行后续的初始化工作。这一过程确保了 U-Boot 能够在任意加载地址下正常运行。 ### 寄存器初始化与从核引导 在进入 `main` 函数之前,U-Boot 会进一步初始化系统寄存器,并为多核处理器准备从核(secondary cores)的启动环境。这包括设置从核的启动地址、同步机制等,以支持 SMP(Symmetric Multi-Processing)架构。 ### 进入 C 语言主流程 当所有底层初始化完成后,U-Boot 会调用 `main` 函数,进入 C 语言编写的主流程。在此阶段,U-Boot 会继续完成更复杂的初始化任务,如设备驱动加载、命令行解析、环境变量读取等。 ### 启动 Linux 内核 U-Boot 的最终使命是启动 Linux 内核。在启动内核之前,U-Boot 会执行以下步骤: - **查找启动函数**:通过 `bootm_os_get_boot_func` 查找适用于 Linux 内核的启动函数 `do_bootm_linux`。 - **准备启动参数**:调用 `boot_prep_linux` 准备启动参数,包括将 Bootargs 通过设备树传递给 Linux 内核。 - **跳转到内核入口**:通过 `boot_jump_linux` 跳转到内核入口地址 `images->ep`(例如 `0x80800000`),并传递必要的参数(如 `machid` 和 `r2`)。 最终,U-Boot 输出 "Starting kernel..." 信息,并将控制权完全移交给 Linux 内核。 ```c void kernel_entry(int zero, int arch, uint params); kernel_entry = (void (*)(int, int, uint))images->ep; announce_and_cleanup(); // 输出 Starting kernel... kernel_entry(0, machid, r2); // 启动 Linux 内核 ``` ### 多阶段引导与安全启动 在实际应用中,U-Boot 支持多阶段引导(Multi-stage Boot),即通过 SPL(Secondary Program Loader)进行最小化初始化后加载完整的 U-Boot。这种方式可以加快启动速度并减少内存占用。 此外,U-Boot 还支持安全启动(Secure Boot),通过验证内核签名来确保系统的完整性与安全性。这一机制可以防止未经授权的内核被加载,增强系统的可信性。 ### 网络引导与远程调试 U-Boot 支持通过 TFTP 协议从网络加载内核或 RAM 磁盘,适用于远程调试和无盘系统。这一功能在嵌入式开发和调试过程中非常有用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值