uboot启动流程-uboot代码重定位说明一

一.  uboot启动流程

本文学习 uboot 的启动流程中涉及的 uboot 代码重定位部分。

_main 函数中会调用 relocate_code 函数,本文继续简单分析一下 relocate_code 函数。

relocate_code 函数分两个部分:

1.  拷贝 uboot 代码部分

2.  有关 " 重定位后有关函数调用或全局变量地址的问题"的解决方法。

二.  uboot代码重定位

1.  uboot一些变量的地址

要分析 uboot 的启动流程,首先要找到“入口”,找到第一行程序在哪里。

程序的链接是由链接脚本来决定的,所以通过链接脚本可以找到程序的入口。连接脚本在uboot的根目录下u-boot.lds文件。

在 u-boot.lds 中有一些跟地址有关的“变量”,我所编译后的uboot源码涉及的变量的值如下:

变量数值描述
__image_copy_start0X87800000uboot拷贝的首地址
__image_copy_end0X8786B03Cuboot拷贝的结束地址

__rel_dyn_start

0X8786B03C

.rel.dyn 段起始地址

__rel_dyn_end

0X8787459C

.rel.dyn 段结束地址

_image_binary_end

0X8787459C

镜像结束地址

__bss_start

0X8786B03C

.bss 段起始地址

__bss_end

0X878B7314

.bss 段结束地址

2.   _main函数

_main 函数中会调用 relocate_code 函数,调用的地方如下:

	ldr	r0, [r9, #GD_RELOCADDR]		/* r0 = gd->relocaddr */b	relocate_code

可以看出,relocate_code函数有一个参数,r0=gd->relocaddr=0X8FF38000uboot重定位后的首地址。

3.  relocate_code 函数:拷贝代码部分

relocate_code 函数是用于代码拷贝的,此函数定义在文件 arch/arm/lib/relocate.S 中。relocate_code 函数的前半部分代码如下:

79 ENTRY(relocate_code)
80 ldr r1, =__image_copy_start /* r1 <- SRC &__image_copy_start */
81 subs r4, r0, r1 /* r4 <- relocation offset */
82 beq relocate_done /* skip relocation */
83 ldr r2, =__image_copy_end /* r2 <- SRC &__image_copy_end */
84 
85 copy_loop:
86 ldmia r1!, {r10-r11} /* copy from source address [r1] */
87 stmia r0!, {r10-r11} /* copy to target address [r0] */
88 cmp r1, r2 /* until source end address [r2] */
89 blo copy_loop

80 行, r1=__image_copy_start ,也就是 r1 寄存器保存源地址,获取到镜像起始地址,
__image_copy_start=0X87800000
81 行,r0= 0X8FF38000 ,这个地址就是 uboot 拷贝的目标首地址
r4 = r0-r1 = 0X8FF38000 - 0X87800000=0X18747000 ,因此, r4寄存器 保存偏移量。
82 行,如果在第 81 中, r0-r1 等于 0 ,说明 r0 r1 相等,也就是源地址和目的地址是 一样的,那肯定就不需要拷贝了!即执行 relocate_done 函数。
83 行, r2 = __image_copy_end 保存拷贝之前的代码结束地址由之前的
__image_copy_end = 0X8786B03C
84 行,函数 copy_loop 完成代码拷贝工作!从 r1 ,也就是 __image_copy_start 开始,读 uboot 代码保存到 r10 r11 中,一次就只拷贝这 2 32 位的数据。拷贝完成以后 r1 的值会 更新,保存下一个要拷贝的数据地址。
87 行,将 r10 r11 的数据写到 r0 开始的地方,也就是目的地址。写完以后 r0 的值会 更新,更新为下一个要写入的数据地址。
88 行,比较 r1 是否和 r2 相等,也就是检查是否拷贝完成,如果不相等的话说明没有拷 贝完成,则跳转到 copy_loop 接着拷贝,直至拷贝完成。
下一篇文章继续学习 uboot重定位部分。具体学习 relocate_code 函数 的第二部分:
有关 " 重定位后有关函数调用或全局变量地址的问题"的解决方法。

我们知道,一个可执行的 bin 文件,其链接地址和运行地址要相等,也就是链接到哪个地址, 在运行之前,就要拷贝到哪个地址去。现在我们重定位以后,运行地址就和链接地址不同了,这 样寻址的时候不会出问题吗?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/97152.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何实现矩阵的重采样问题

文章目录 前言一、问题描述二、回答 前言 记录知乎的自问自答。 一、问题描述 我的问题是这样的&#xff0c;有两个列向量E和F&#xff0c;需要注意的是&#xff0c;E和F是连续的&#xff0c;可任意插值&#xff0c;得到包含其中的子向量。E和F通过一个mn的矩阵联系起来&…

【Go】go-es统计接口被刷数和ip访问来源

go-es模块统计日志中接口被刷数和ip访问来源 以下是使用go的web框架gin作为后端&#xff0c;展示的统计页面 背景 上面的数据来自elk日志统计。因为elk通过kibana进行展示&#xff0c;但是kibana有一定学习成本且不太能满足定制化的需求&#xff0c;所以考虑用编程的方式…

Eclipse iceoryx™ - 真正的零拷贝进程间通信

1 序言 通过一个快速的背景教程&#xff0c;介绍项目范围和安装所需的所有内容以及第一个运行示例。 首先&#xff1a;什么是冰羚&#xff1f; iceoryx是一个用于各种操作系统的进程间通信&#xff08;IPC&#xff09;中间件&#xff08;目前我们支持Linux、macOS、QNX、FreeBS…

C语言中文网 - Shell脚本 - 1

Shell 既是一个连接用户和 Linux 内核的程序&#xff0c;又是一门管理 Linux 系统的脚本语言。Shell 脚本虽然没有 C、Python、Java、C# 等编程语言强大&#xff0c;但也支持了基本的编程元素。 第1章 Shell基础&#xff08;开胃菜&#xff09; 欢迎来到 Linux Shell 的世界&am…

迁移学习是什么?

迁移学习&#xff08;Transfer Learning&#xff09;是一种机器学习方法&#xff0c;它的主要思想是将已经在一个任务上学到的知识迁移到另一个相关或不相关的任务上&#xff0c;以提高目标任务的性能。迁移学习的核心概念是&#xff0c;模型可以通过先前学到的知识来更好地解决…

nextjs通过使用getServerSideProps实现登录后跳转上一页

在实际开发中&#xff0c;经常遇到登录后跳转到之前的页面&#xff0c;可使用getServerSideProps实现该功能&#xff0c;getServerSideProps 是 next.js 中的一项特色功能&#xff0c;可以让我们在给页面设置一些初始的 props 参数。 getServerSideProps 是定义在页面中的 API&…

asp.net闲置物品购物网系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net闲置物品购物网系统是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语 言开发 asp.net 闲置物品购物网 二、功…

JavaScript中的map()和forEach()方法有什么区别?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

DevEco Studio下载/安装与配置开发环境

一、下载与安装DevEco Studio 在HarmonyOS应用开发学习之前&#xff0c;需要进行一些准备工作&#xff0c;首先需要完成开发工具DevEco Studio的下载与安装以及环境配置。 1.进入DevEco Studio下载官网 单击“立即下载”进入下载页面。 DevEco Studio提供了Windows版本和Mac…

学信息系统项目管理师第4版系列20_风险管理

1. 针对不确定性的应对方法 1.1. 【高23上选58】 1.2. 收集信息 1.2.1. 可以对信息收集和分析工作进行规划&#xff0c;以便发现更多信息&#xff08;如进行研究、争取专家参与或进行市场分析&#xff09;来减少不确定性 1.3. 为多种结果做好准备 1.3.1. 制定可用的解决方…

高级 I/O【Linux】

阅读前导&#xff1a; “高级 I/O”处于知识树中网络和操作系统的最后&#xff0c;因此本文默认读者有计算机网络和操作系统的基础。 1. 什么是 I/O 下面以“流”&#xff08;stream&#xff09;和冯诺依曼体系架构的视角来简单回顾一下什么是 I/O&#xff1a; I/O可以理解…

Linux网络编程- recvfrom() sendto()

recvfrom() recvfrom() 函数是一个系统调用&#xff0c;用于从套接字接收数据。该函数通常与无连接的数据报服务&#xff08;如 UDP&#xff09;一起使用&#xff0c;但也可以与其他类型的套接字使用。与简单的 recv() 函数不同&#xff0c;recvfrom() 可以返回数据来源的地址…

scrapy爬虫系列之安装及入门介绍

前面介绍了很多Selenium基于自动测试的Python爬虫程序,主要利用它的xpath语句,通过分析网页DOM树结构进行爬取内容,同时可以结合Phantomjs模拟浏览器进行鼠标或键盘操作。但是,更为广泛使用的Python爬虫框架是——Scrapy爬虫。这是一篇在Windows系统下介绍 Scrapy爬虫安装及…

2023全新小红书图集和视频解析去水印网站源码

2023全新小红书图集和视频解析去水印网站源码 小红书视频图集解析网站源码&#xff0c;在红书看到好看的图片以及好看的头像&#xff0c;但是直接下载又有水印就非常难受&#xff0c;这个可以一键解析去除水印&#xff0c;支持统计解析次数&#xff0c;本地接口。 源码下载&a…

Django 数据库迁移(Django-04)

一 数据库迁移 数据库迁移是一种数据库管理技术&#xff0c;它用于在应用程序的开发过程中&#xff0c;根据模型&#xff08;Model&#xff09;的变化自动更新数据库结构&#xff0c;以保持数据库与代码模型的一致性。数据库迁移的主要目的是确保数据库与应用程序的模型定义同…

【C++】指针与引用(学习笔记)

一、左值与右值 左值&#xff1a;编译器为其单独分配了一块存储空间&#xff0c;可以取其地址的&#xff0c;可以放在赋值运算符左边 右值&#xff1a;数据本身。不能取到其自身地址&#xff0c;只能赋值运算右边 左值最常见的情况如西数和数据成员的名字 右值是没有标识符、…

【Linux常用命令4】系统状态监测命令---2

last&#xff1a;查看所有系统的登录记录 执行last命令时&#xff0c;它会读取/var/log目录下名称为wtmp的文件&#xff0c;并把该文件记录的登录系统或终端的用户名单全部显示出来。默认显示wtmp的记录&#xff0c;btmp能显示的更详细&#xff0c;可以显示远程登录&#xff0…

k8s 集群安装(vagrant + virtualbox + CentOS8)

主机环境&#xff1a;windows 11 k8s版本&#xff1a;v1.25 dashboard版本&#xff1a;v2.7.0 calico版本&#xff1a; v3.26.1 CentOS8版本&#xff1a;4.18.0-348.7.1.el8_5.x86_64 用到的脚本&#xff1a; https://gitcode.net/sundongsdu/k8s_cluster 1. Vagrant创建…

3d 贴图下载quixel

Quixel Megascans https://polyhaven.com/a/studio_small_03 Quixel Bridge&#xff1a;3D艺术家的宝库 在3D建模和渲染的世界中&#xff0c;找到高质量、适合项目的贴图素材至关重要。Quixel Bridge就是这样一个为3D艺术家提供大量免费贴图素材的资源库。在本文中&#xff…

2023去水印小程序源码修复版-前端后端内置接口+第三方接口

去水印小程序源码&#xff0c;前端后端&#xff0c;内置接口第三方接口&#xff0c;修复数据库账号密码错误问题&#xff0c;内置接口支持替换第三方接口&#xff0c;看了一下文件挺全的&#xff0c;可以添加流量主代码&#xff0c;搭建需要准备一台服务器&#xff0c;备案域名…