uboot relocation

2024-03-17 12:52
文章标签 uboot relocation

本文主要是介绍uboot relocation,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • relocation重定位定义
    uboot运行后会将自身代码拷贝到sdram的另一个位置继续运行。

  • 原因
    uboot从SDRAM低位拷贝到高位后,各指令存储地址改变,对位置无关指令的执行,不受影响;但位置相关指令的执行会导致程序执行错误,这时即需要relocation来解决。

  • 解决
    使用-pie选项的compiler,将需要relocate的值(全局变量地址 函数入口地址)的地址存储在rel.dyn段中,uboot运行中relocate_code遍历rel.dyn段,根据rel.dyn中存储的值,对以(这些值+offset)为地址上的值进行了relocate,完成对所有需要relocate的变量的修改

  • 应用
    考虑3个点:

     1)link链接地址2)load的加载地址3)运行地址这3个点相同下才会完整运行bin文件。
    

    而relocation后运行地址不同于加载地址 特别是链接地址,ARM的寻址会不会出现问题?
    新版uboot跟老版uboot不太一样的地方在于新版uboot不管uboot的load addr(entry pointer)在哪里,启动后会计算出一个靠近sdram顶端的地址,将自身代码拷贝到该地址,继续运行。因此relocation是必须的。
    参考:《uboot的relocation原理详细分析》

这篇关于uboot relocation的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/819010

相关文章

笔记整理—uboot番外(6)针对x210的网卡说明

对于x210而言,在三星中与九鼎官方的uboot都默认使用了二号串口。详见CONFIG_SERIALn(n=1~4)。         更改串口后,应先插回原串口,进行iROM打印,内部iNnad校验核失败的信息,之后再插入其串口进行启动。         修改CCONFIG_NETMASK等多个宏可以修改默认的网络环境。在进行完成修改后,如果依旧没进行改变,则应对iNand

PetaLinux Linux Uboot 源码路径

在很早以前的版本,直接在创建的工程下面就可以找到内核源码和uboot源码。后面的版本采用的是网络下载编译,诸如2018.3 编译完成自动删除,如果想保留,可以在创建的工程下面 $ vim ./project-spec/meta-user/conf/petalinuxbsp.conf 加入RM_WORK_EXCLUDE += "linux-xlnx"RM_WORK_EXCLUDE += "u

新路程----海思 uboot(1)

先看start.s吧 .globl _start //.global声明_start为全局符号,_start就会被连接器链接到,也就是链接脚本中的入口地址了。_start: b reset //跳转到reset 下面的代码是设置arm的异常向量表ldr pc, _undefined_instruction //把label后的数据或者指令内容赋值给pcldr pc, _softw

新路程------uboot环境变量没生效

之前刷文件系统一种出错,出错log如下 hisilicon # sf probe 0;mw.b 0x82000000 0xff 0x1800000;tftp 0x82000000 rootfs_ucl ibc_64k.jffs2;sf erase 0x500000 0x1800000;sf write 0x82000000 0x500000 0x1800000 32768 KiB h

uboot中添加一条自己的命令-Nazgul

uboot中添加XNazgul命令三部曲 1、在unsp210_u-boot\include\configs\unsp210.h中添加一项宏定义 #define CONFIG_CMD_XNazgul 1 主要是为了防止后面命令实现的时候出现重复的命令 2、在common文件夹下建立cmd_XNazgul.c 文件内容 #include <comm

追踪uboot下tftp命令的代码执行过程-Nagul

一、网卡驱动的添加  网络在uboot中的启动是在uboot的第二阶段启动代码中 /lib_arm/board.c [cpp]  view plain copy void start_armboot (void){}   里面有网络初始化函数 [cpp]  view plain copy eth_initialize(gd->bd)

笔记整理—内核!启动!—uboot部分(3)uboot启动内核传参

uboot会以tag的方式给内核传递参数,tag是一个数据结构,在uboot中与linux_kernel中都有相同的结构。         kernel接收到的传参由若干个tag构成,从tag_start到tag_end之间的数据构成,读到start时开始传参,end结束传参。  CONFIG_SETUP_MEMORY_TAGS 宏会去找对应的tag_mem,其内容

笔记整理—内核!启动!—uboot部分(1)

常规启动时,各镜像都在SD卡中的各种分区中,内核放在kernel分区,从SD卡到DDR的连接处(内核不需要进行重定位,直接从链接处启动)。uboot从sd卡分区读使用movi命令。         使用fastboot指令可以查看分区情况;movi read可以用于读取kernel,读取完成后使用bootm启动。 对于x210而言是movi read kernel 0x300

笔记 10 : 彭老师课本第 5 章 , GPIO , vim 的复制剪切删除 ; uboot读写内存的 md , nm 命令

(77) 进入代码实验以来,开始有机会频繁的修改源代码。补充 vim 的使用: ++ (78) 如何只查看某个文件的权限,属性: (79) 关于 rm 命令: (80) 接着学习 新的 Uboot 命令: md/nm 显示内存与修改内存: uboot 有很多不错的调试命令。之前学习和使用了 loadb 指令指定指令的加载地址, 如 40008000 H: ++ nm

qemu利用uboot启动

进入qemu可以先ping一下主机 qemu已经内部分配了ip地址实现主机(10.0.2.2)与虚拟机(10.0.2.15)的通信 tftp:可以在qemu启动时输入参数-tftp /var/lib/tftpboot,也可以在uboot中执行tftp ${...} ... 主机上tftpd服务的重启:sudo /etc/init.d/tftpd-hpa restart uboot编译