uboot 和 内存地址

news2024/11/25 16:30:55

前言

在使用 uboot 升级的时候,有个疑问:
通过 tftp 下载的 bin 文件,我该暂存在哪段内存空间?换句话说,哪段内存空间可供我存放临时数据?
带着这个疑问,开启今天的 uboot 和 内存地址 研究之旅。

环境

硬件:OrangePi PC(H3)

bdinfo

在 uboot 命令行中,使用 bdinfo 命令查看板子信息

=> bdinfo
boot_params = 0x40000100
DRAM bank   = 0x00000000
-> start    = 0x40000000
-> size     = 0x40000000
memstart    = 0x40000000
memsize     = 0x40000000
flashstart  = 0x00000000
flashsize   = 0x00000000
flashoffset = 0x00000000
baudrate    = 115200 bps
relocaddr   = 0x7df96000
reloc off   = 0x33f96000
Build       = 32-bit
current eth = ethernet@1c30000
ethaddr     = 02:81:e6:56:d9:1f
IP addr     = <NULL>
fdt_blob    = 0x79f6ef30
new_fdt     = 0x79f6ef30
fdt_size    = 0x00006fa0
FB base     = 0x7e000000
lmb_dump_all:
    memory.cnt		   = 0x1
    memory.size		   = 0x0
    memory.reg[0x0].base   = 0x40000000
		   .size   = 0x40000000

    reserved.cnt	   = 0x1
    reserved.size	   = 0x0
    reserved.reg[0x0].base = 0x79f6dd24
		     .size = 0x60922dc
arch_number = 0x00000000
TLB addr    = 0x7fff0000
irq_sp      = 0x79f6ef20
sp start    = 0x79f6ef10
Early malloc usage: 2b8 / 400

可以看到,内存起始地址为 0x40000000,大小为 0x40000000,所以范围是 0x40000000~0x7FFFFFFF,这和我们在内核中查看 /proc/iomem 得到的内存范围一致

# cat /proc/iomem 
...
40000000-7fffffff : System RAM
  40008000-40afffff : Kernel code
  40c00000-40d268d7 : Kernel data

内存起始地址

又冒出一个疑问,内存起始地址 0x40000000 是谁规定的?
这个通常是在 SoC 数据手册中 Memory mapping 这一节规定的,查看 H3 芯片的数据手册
在这里插入图片描述
看到 DRAM 使用的物理地址范围为 0x40000000-0xBFFFFFFF,共 2G 范围,这也决定了 H3 最大支持 2GB 内存。
我们板子上焊接的是两片 512MB 的 DDR 颗粒,共 1GB,所以内存地址范围是 0x40000000~0x7FFFFFFF。

uboot 起始地址

讲了那么多,uboot 会被加载到内存的哪个地址呢?是内存的起始地址 0x40000000?还是中间位置 0x60000000?
这得从 uboot 源码和链接脚本中找寻。
uboot 是没有使用虚拟内存地址的,直接跑在物理内存上,所以 uboot 在被编译链接时,肯定指定了代码的入口地址,这个地址肯定落在 0x40000000~0x7FFFFFFF 这个范围内

CONFIG_SYS_TEXT_BASE

在 uboot 的 .config 和 Makefile 文件中,使用 CONFIG_SYS_TEXT_BASE 宏来指定代码的入口地址

.config

CONFIG_SYS_TEXT_BASE=0x4a000000

Makefile

LDFLAGS_u-boot += -Ttext $(CONFIG_SYS_TEXT_BASE)

验证

liyongjun@Box:~/project/board/buildroot$ OrangePiPC/host/bin/arm-linux-readelf -h OrangePiPC/build/uboot-2020.10/u-boot
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           ARM
  Version:                           0x1
  Entry point address:               0x4a000000
  Start of program headers:          52 (bytes into file)
  Start of section headers:          3872012 (bytes into file)
  Flags:                             0x5000200, Version5 EABI, soft-float ABI
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         4
  Size of section headers:           40 (bytes)
  Number of section headers:         37
  Section header string table index: 36

可以看到 uboot 的入口地址确实是 0x4a000000

uboot 验证

uboot 读取 0x4a000000
在这里插入图片描述
u-boot.bin 二进制内容
在这里插入图片描述
可以看到,uboot 使用命令从 0x4a000000 处读到的内容就是 u-boot.bin 的内容。
这也充分证实了:SPL 已经将 uboot 程序加载到了内存地址 0x4a000000 处

空闲内存

那么 0x40000000 ~ 0x4a000000 这段内存空间(160MB),uboot 没有使用,我们可以用这段内存来暂存 tftp 下载的文件。

=> tftp 42000000 u-boot-sunxi-with-spl.bin
Using ethernet@1c30000 device
TFTP from server 192.168.31.223; our IP address is 192.168.31.32
Filename 'u-boot-sunxi-with-spl.bin'.
Load address: 0x42000000
Loading: ##################################
	 1.4 MiB/s
done
Bytes transferred = 498944 (79d00 hex)

使用 tftp 命令,从 server 下载 u-boot-sunxi-with-spl.bin,存放在内存 0x42000000 处,大小共 498944B。

写入 SD 卡

=> mmc write 42000000 10 3ce              

MMC write: dev # 0, block # 16, count 974 ... 974 blocks written: OK

将暂存在内存的 u-boot-sunxi-with-spl.bin 文件写入 SD 卡来完成升级操作。
0x42000000 为内存地址
0x10 为 SD 卡的块号,一个块为 512 字节,我们需要从 SD 卡偏移 8KB 的位置开始写入
0x3ce 为写入的块数,0x3ce = 974 = 498944 / 512

写入 SD 卡后,重启就行了

=> reset
resetting ...

U-Boot SPL 2020.10 (Nov 08 2023 - 22:15:30 +0800)
DRAM: 1024 MiB
Trying to boot from MMC1


U-Boot 2020.10 (Nov 08 2023 - 22:15:30 +0800) Allwinner Technology

CPU:   Allwinner H3 (SUN8I 1680)
Model: Xunlong Orange Pi PC
DRAM:  1 GiB
MMC:   mmc@1c0f000: 0

检查编译日期,可以看到升级成功了。

uboot 升级到内存

为了快速验证 uboot 功能,我们可以直接将 uboot 升级到内存,无需写入 SD 卡
以下两组命令都是可以的,使用 u-boot-sunxi-with-spl.bin 的话,要注意计算好 uboot 在该文件中的偏移,使得 uboot 的起始落在 0x4a000000 处就可以了。

setenv serverip 192.168.31.223
setenv ipaddr 192.168.31.32
tftp 0x4a000000 u-boot.bin
go 4a000000
setenv serverip 192.168.31.223
setenv ipaddr 192.168.31.32
tftp 0x49FF7FC0 u-boot-sunxi-with-spl.bin
go 4a000000

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

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

相关文章

CSS特效004:hover图片,显示文字或附加层

css实战中&#xff0c;时常会碰见鼠标放在某个区块上&#xff0c;显示出一段文字或者其他附加信息。思路是利用position的层叠关系&#xff0c;将文字层放在图片的上面&#xff0c;display:none; hover的时候层 display&#xff1a;block。 效果图 源代码 /* * Author: 大剑师…

NR UE capability FeatureSetCombination的查看方法

下面是UEcapability中根据协议中的描述总结的NR CA和EN-DC组合的查看方法&#xff0c;主要内容在38.331/36.331中。比较关键的IE就是FeatureSetCombination。 FeatureSetCombination对应的是FeatureSet entries的二维矩阵。 每个FeatureSetsPerBand 包含适用于相关band combin…

伦敦金股票代码是什么?

伦敦金是跟踪实时的现货黄金价格走势的差价合约交易&#xff0c;它的代码一般是LLG、GOLD&#xff0c;但也有一些货币交易平台会显示为XAU。伦敦金不是股票交易&#xff0c;因此没有四位数或六位数的股票代码&#xff0c;但伦敦金交易品种单一&#xff0c;投资者不用在数千支股…

亚马逊云科技海外服务器初体验

目录 前言亚马逊云科技海外服务器概述注册使用流程实例创建性能表现用户体验服务支持初体验总结 前言 随着云原生技术的飞速发展&#xff0c;越来越多的企业和开发者选择云服务器来作为自己的使用工具&#xff0c;云原生技术的发展也促进了云服务厂商的产品发展&#xff0c;所…

CSS3 2D、3D转换

一、CSS3 2D转换&#xff1a; CSS3转换可以对元素进行移动、缩放、转动、拉长或拉伸。 2D变换的方法&#xff1a;translate()、rolate()、scale()、skew()、matrix()。 <style> div { width:200px; height:100px; background-color:red; /* Rotate div */ tran…

创新功能点展望:探索未来一对一交友App开发的趋势和可能性

随着社交媒体和科技不断进步&#xff0c;一对一交友App开发正处于迅猛发展的阶段。未来&#xff0c;这一领域将出现许多激动人心的创新&#xff0c;为用户带来更加个性化、安全、以及富有情感连接的体验。以下将探讨一些可能性和趋势&#xff0c;以及从中受益的用户和开发者。 …

自动计算零售数据分析指标?BI软件表示可行

随着BI技术的飞速发展&#xff0c;借助系统来计算分析指标也不是什么难事&#xff0c;即便是面对组合多变的零售数据分析指标&#xff0c;奥威BI软件也依旧可以又快又精准地完成指标计算。 BI软件可以自动计算零售数据分析指标&#xff0c;如销售额、库存量、订单量等。在计算…

MyBatis中文网

MyBatis中文网https://mybatis.net.cn/ MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Ja…

软件测试|MySQL WHERE条件查询详解:筛选出需要的数据

简介 在数据库中&#xff0c;我们常常需要从表中筛选出符合特定条件的数据&#xff0c;以便满足业务需求或获取有用的信息。MySQL提供了WHERE条件查询&#xff0c;使我们能够轻松地筛选数据。本文将详细介绍MySQL WHERE条件查询的用法和示例&#xff0c;帮助大家更好地理解和应…

[工业自动化-7]:西门子S7-15xxx编程 - PLC主站 - 电源模块

目录 前言&#xff1a; 一、主站电源PM VS PS 1.1 主站PM电源模块(PM) 1.2 主站PS电源模块 1.3 PM/PS电源模块区别 1.4 如何选择PM/PS电源 1.5 什么时候必须使用PM模块 1.6 什么时候必须使用PS模块 二、背板总线 三、电源模块的安装 前言&#xff1a; 一、主站电源PM…

制作一个用户登录界面

Flask-WTF扩展使用Python类来表示web表单。表单类只是将表单的字段定义为类变量。 再次考虑到分离的问题&#xff0c;我将使用一个新的app/forms.py模块来存储我的web表单类。首先&#xff0c;让我们定义一个用户登录表单&#xff0c;它要求用户输入用户名和密码。表单还将包括…

【C++】类和对象的关系,对象的存储方式以及对象内存的计算

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

【编程实践】黑框框里的打字小游戏,但是汇编语言

开始&#xff1a; 在学习王爽的《汇编语言》的过程中&#xff0c;我就真切地体会到编程实践对于理解的帮助。起初我没有安装书中的实验环境&#xff0c;看到100页左右就开始感觉无趣、吃力&#xff0c;看了后面忘前面&#xff0c;差点就要放弃这本书的学习。好在我后来还是装好…

苹果Ios系统app应用程序开发者如何获取IPA文件签名证书时需要注意什么?

今天呢想和大家介绍介绍苹果App开发者如何获取IPA文件签名证书的步骤和注意事项。对于苹果应用程序开发者而言&#xff0c;获取IPA文件签名证书是发布应用程序至App Store的重要步骤之一。签名证书能够确保应用程序的安全性和可信度&#xff0c;并使其能够在设备上正确运行。 …

芯驰科技出席2023云栖大会,探讨新汽车舱驾融合

10月31日-11月2日&#xff0c;2023云栖大会在杭州成功举办&#xff0c;全场景智能车芯引领者芯驰科技受邀参加斑马智行专场。 芯驰科技资深产品市场总监金辉在「新汽车舱驾融合趋势」研讨会上发表了主题演讲。在随后举办的圆桌论坛上&#xff0c;他和来自智能汽车域控制器、操…

机器学习 - 决策树:技术全解与案例实战

目录 一、引言二、决策树基础决策树模型概述构建决策树的关键概念特征选择决策树的生成 决策树的剪枝 三、算法研究进阶提升树和随机森林提升树&#xff08;Boosted Trees&#xff09;随机森林&#xff08;Random Forests&#xff09; 进化算法与决策树决策树结构的进化 多目标…

动态规划(3)---Leetcode509.斐波那契数

题目 分析 很明显的动态规划&#xff0c;直接写出。之前都是用递归来写。 题解 class Solution {public int fib(int n) {if (n0) return 0;if (n1) return 1;int q0,p1,r0;for(int i2;i<n;i){rqp;int tmpp;pr;qtmp; }return r;}

static关键字的三种用法

在C语言中&#xff0c;关键字"static"可以用于不同的上下文&#xff0c;具有不同的作用。以下是"static"在C语言中的主要作用&#xff1a; 1. 静态变量&#xff08;Static Variables&#xff09;&#xff1a; 在C语言中&#xff0c;使用static关键字来声明…

module ‘torch‘ has no attribute ‘_six‘

主要问题是torchvision的问题 在122服务器上的scvi-env2环境中 import torch import torch.nn as nnimport numpy as npfrom tqdm import tqdm from torchvision.utils import save_image, make_grid # Model Hyperparametersdataset_path ./datasetscuda True DEVICE tor…

18. 深度学习 - 从零理解神经网络

文章目录 本文目标预测趋势与关系波士顿房价预测 Hi, 你好。我是茶桁。 我们终于又开启新的篇章了&#xff0c;从今天这节课开始&#xff0c;我们会花几节课来理解一下深度学习的相关知识&#xff0c;了解神经网络&#xff0c;多层神经网络相关知识。并且&#xff0c;我们会尝…