uboot启动流程-uboot链接接脚本

news2024/11/25 1:07:44

一.  uboot 启动流程

本文我们来详细的分析一下 uboot 的启动流程,理清 uboot 是如何启动的。通过对 uboot 启动流程的梳理。

们就可以掌握一些外设是在哪里被初始化的,这样当我们需要修改这些外设驱动的时候就会心里有数。另外,通过分析 uboot 的启动流程可以了解 Linux 内核是如何被启动的。

注意: 分析 uboot启动流程的前提是,uboot源码需要经过编译。

二.   链接脚本 u-boot.lds

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

程序的链接是由链接脚本来决定的,所以通过链接脚本可以找到程序的入口。连接脚本在uboot的根目录下u-boot.lds文件。
注意:如果没有编译过 uboot 的话链接脚本为 arch/arm/cpu/u-boot.lds。但这个不是最终使用的链接脚本,最终的链接脚本是在这个链接脚本的基础上生成的。编译一下 uboot,编译完成以后就会在 uboot 根目录下生成 u-boot.lds 文件。
只有编译 u-boot 以后才会在根目录下出现 u-boot.lds 文件!!!

打开 u-boot.lds ,内容如下:
1 OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
2 OUTPUT_ARCH(arm)
3 ENTRY(_start)
4 SECTIONS
5 {
6 . = 0x00000000;
7 . = ALIGN(4);
8 .text :
9 {
10 *(.__image_copy_start)
11 *(.vectors)
12 arch/arm/cpu/armv7/start.o (.text*)
13 *(.text*)
14 }
15 . = ALIGN(4);
16 .rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
17 . = ALIGN(4);
18 .data : {
19 *(.data*)
20 }
21 . = ALIGN(4);
22 . = .;
23 . = ALIGN(4);
24 .u_boot_list : {
25 KEEP(*(SORT(.u_boot_list*)));
26 }
27 . = ALIGN(4);
28 .image_copy_end :
29 {
30 *(.__image_copy_end)
31 }
32 .rel_dyn_start :
33 {
34 *(.__rel_dyn_start)
35 }
36 .rel.dyn : {
37 *(.rel*)
38 }
39 .rel_dyn_end :
40 {
41 *(.__rel_dyn_end)
42 }
43 .end :
44 {
45 *(.__end)
46 }
47 _image_binary_end = .;
48 . = ALIGN(4096);
49 .mmutable : {
50 *(.mmutable)
51 }
52 .bss_start __rel_dyn_start (OVERLAY) : {
53 KEEP(*(.__bss_start));
54 __bss_base = .;
55 }
56 .bss __bss_base (OVERLAY) : {
57 *(.bss*)
58 . = ALIGN(4);
59 __bss_limit = .;
60 }
61 .bss_end __bss_limit (OVERLAY) : {
62 KEEP(*(.__bss_end));
63 }
......
73 .gnu.linkonce.armexidx : { *(.gnu.linkonce.armexidx.*) }
74 }

3 行为代码当前入口点: _start ,_start 在文件 arch/arm/lib/vectors.S 中有定义。vectors.S 如下所示:
从 vectors.S 中 可以看出, _start 后面就是中断向量表,从图中的 “ .section ".vectors", "ax ”可以得到,此代码存放在 .vectors 段里面。
u-boot.map uboot 的内存映射文件,打开 u-boot.map:
从 u-boot.map 可以看到,某个文件或者函数链接到了哪个地址,  第 958 行可以看到 __image_copy_start 0X87800000 ,而 .text 的起始地址也是 0X87800000
继续链接脚本 u-boot.lds,
11 行是 vectors 段, vectors 段保存中断向量表,从vectors.S 中我们知道了 vectors.S 的代码是存在 vectors 段中的。 u-boot.map 文件可以看出:vectors 段的起始地址也是 0X87800000 ,说明整个 uboot 的起始地址就是 0X87800000 ,这也是为什么我们裸机 例程的链接起始地址选择 0X87800000 了,目的就是为了和 uboot 一致。

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

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

相关文章

华为云云耀云服务器L实例评测 | 实例场景体验之搭建个人博客:通过华为云云耀云服务器构建个人博客

华为云云耀云服务器L实例评测 | 实例场景体验之搭建个人博客:通过华为云云耀云服务器构建个人博客 介绍华为云云耀云服务器 华为云云耀云服务器 (目前已经全新升级为 华为云云耀云服务器L实例) 华为云云耀云服务器是什么华为云云耀…

COCO 数据集 人体关键点格式

图片与标注数据在 COCO官网 均提供下载 标注格式 COCO 的标注中包含 4 个部分/字段,"info" 描述数据集,"licenses" 描述图片来源,"images" 和 "annotations" 是主体部分 "images" 部分…

数学术语之源——纤维(fiber)

1. 数学术语“纤维”(英英“fibre”,美英“fiber”)在数学中的起源 fiber[ˈfaɪbə(r)]这个词始于14世纪晚期,词义为“肝叶的一瓣(a lobe of the liver)”,也指“内脏(entrails)”。来自中世纪拉丁语“fibre”,其又源自拉丁语“fibra”,词义为“纤维(a fiber)、细…

Logistic map混沌掩盖信号

开学接触了一些有关混沌知识的学习,阅读量一些混沌通信的论文,对于混沌掩盖信号以确保加密通信有一定的兴趣。混沌的产生我选用的是logistic map映射产生混沌,主要就是一个递推公式: 对于这样一个式子,可以看出&#x…

300元开放式耳机哪款好、百元开放式耳机推荐

我是一个非常喜欢戴着耳机出门的社恐宅男,但看了一些文章后发现长期戴耳机对耳朵也是有危害的,比如长时间佩戴耳机容易导致耳朵潮湿,从而增加细菌滋生的风险,其次,长时间高音量使用耳机可能会造成听力损伤以及长期佩戴…

功率放大器有哪些要求和标准参数

功率放大器是一种常见的电子设备,用于将输入信号增强到更高的功率级别。为了满足不同应用需求,功率放大器需要符合一些特定的要求和标准参数。 在现代电子设备中,功率放大器广泛应用于各种领域,如通信、音频放大、射频放大等。它们…

Vue之transition组件

Vue提供了transition组件,使用户可以更便捷地添加过渡动画效果。 transition组件 transition组件也是一个抽象组件,并不会渲染出真实dom。Vue会在其第一个真实子元素上添加过渡效果。 props render 这里将render分为两部分,第一部分界定真…

Golang的性能优化

欢迎,学习者们,来到Golang性能优化的令人兴奋的世界!作为开发者,我们都努力创建高效、闪电般快速的应用程序,以提供出色的用户体验。在本文中,我们将探讨优化Golang应用程序性能的基本技巧。所以&#xff0…

XPD738协议系列-USB Type-C PD 和 Type-A 双口控制器

产品描述: XPD738 是一款集成 USB Type-C、USB Power Delivery(PD)2.0/3.0 以及 PPS、QC3.0/QC3.0/QC2.0 快充协议、华为 FCP/SCP/HVSCP 快充协议、三星 AFC 快充协议、BC1.2 DCP 以及苹果设备 2.4A 充电规范的多功能 USB Type-C 和 Type-A …

通达信筹码获利比例选股指标公式,寻找二次探底

获利比例的意思是当前价格的获利盘比例,从筹码分布理论的角度来说,获利比例越低,说明越少的人处于获利状态;获利比例越高,说明越多的人处于获利状态。当然这只是理论分析,获利比例是通过历史数据按照一定的…

蛋糕烘焙外卖配送小程序商城的效果是什么

随着人们消费水平提升,蛋糕烘焙成为餐饮行业重要的细分赛道之一,市场中大小品牌众多,同时又相对聚集,由于城市中消费者众多,每个商家都有一定生意,但想要破圈进一步增长却很困难,加之线上电商冲…

华为云云耀云服务器L实例评测 | 实例评测使用之软件性能评测:华为云云耀云服务器下的 Redis 性能评测

华为云云耀云服务器L实例评测 | 实例评测使用之软件性能评测:华为云云耀云服务器下的 Redis 性能评测 介绍华为云云耀云服务器 华为云云耀云服务器 (目前已经全新升级为 华为云云耀云服务器L实例) 华为云云耀云服务器是什么华为云…

SW免安装的toolbox只读问题

把SOLIDWORKSDATA 整体复制到另外的目录,然后这里设置目录位置。不然原始位置有只读属性

ngrok内网穿透以及原理

〇、前言 如果要想在本地部署一个服务,且要向不在本局域网的用户展示我们的服务,此时就要用内网穿透工具,把我们的服务变成公网服务。ngrok就是一个很好的工具,操作简单,服务稳定。 一、使用 ngrok 1. 下载ngrok 下…

nextTick源码解读

📝个人主页:爱吃炫迈 💌系列专栏:Vue 🧑‍💻座右铭:道阻且长,行则将至💗 文章目录 nextTick原理nextTicktimerFuncflushCallbacks 异步更新流程updatequeueWatcherflushS…

uniapp小程序 - 隐私协议保护指引接入教程

文章目录 前提:__usePrivacyCheck__: true步骤一、封装弹窗组件步骤二、单个页面引用一、被动监听二、主动查询 前言:官方发布公告,自2023年9月15日起,对于涉及处理用户个人信息的小程序开发者,仅当开发者主动向平台同…

什么是GraphQL?它与传统的REST API有什么不同?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 什么是GraphQL?⭐ 与传统的REST API 的不同⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣…

基于51单片机数字电压表仿真设计_数码管显示(程序+仿真+原理图+PCB+报告+讲解视频)

基于51单片机数字电压表仿真设计_数码管显示(程序仿真原理图PCB报告讲解视频) 原理图:Altium Designer 仿真版本:proteus 7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0…

机器学习之神经网络的层次

文章目录 神经网络组成神经网络根据结构分类神经网络的信号传递 神经网络组成 大脑是一个巨大的神经元网络,所以神经网络是一个节点网络。根据节点的连接方式,可以创建多种神经网络。最常用的神经网络类型之一采用了如图所示的节点分层结构 正方形节点组…

【强化学习】04 ——动态规划算法

文章目录 1. 简介2. 策略迭代算法2.1 策略评估Example12.2 策略提升2.3 策略迭代算法Example2:Jacks Car Rental 3. 价值迭代算法Example1 4. 价值迭代VS.策略迭代总结DP扩展代码悬崖漫步(Cliff Walking)冰湖(Frozen Lake) 参考 1…