Uboot机制详细理解分析(5):Uboot重定位相关内容
- 一、为什么要重定位?
- 1.1 重定义的位置
- 1.2 编译支持
- 二、重定位的意义
- 三、介绍一些重定位相关的表项结构(节):
- 四、uboot的重定位过程:
U-BOOT的初始化阶段即将自身复制到另一个地址的操作,这个操作被称为重定位,
riscv中reloacte_code()定义在arch/riscv/cpu/start.S中,函数原型relocate_code(addr_sp,gd, addr_moni)。一、为什么要重定位?
U-boot因为启动前期阶段在SRAM中进行,存储资源不足,无法容纳U-Boot完全运行,需要到外部RAM中运行,在ddr初始化完成后,一般会将Uboot重定位到高地址。此时,U-boot必须在内存中保留3个区域:U-boot本身,uImage(压缩内核),未压缩内核,(若是RISC-V架构,多一个Opensbi)。
一般情况下在UBoot引导前至少会有bootrom阶段,这个阶段并不知道U-boot这3三个区域的划分,只是简单的将U-boot加载到RAM内存中的较低地址,然后跳转运行。
因此,U-boot必须执行一些基本的初始化并检测当前位置是否合适,u-boot会默认调用relocate函数将自身移动到计划位置并跳转到新位置去执行,从而为Kernel预留处尽可能大的连续内存区域。
1.1 重定义的位置
U-Boot通常会将自身加载到RAM的最高地址,把低地址区域留给Kernel,防止冲突。