uboot 和 内存地址

前言

在使用 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【2023】COMAP美赛数模中的大型语言模型LLM和生成式人工智能工具的使用

COMAP比赛中的大型语言模型和生成式人工智能工具的使用 写在最前面GitHub Copilot工具 说明局限性 团队指南引文和引用说明人工智能使用报告 英文原版 Use of Large Language Models and Generative AI Tools in COMAP ContestslimitationsGuidance for teamsCitation and Refe…

基于SpringBoot+Vue的体育馆管理系统

基于SpringBootVue的体育馆管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 器材详情 登录界面 管理员界面 摘要 SpringBootVue的体育馆管理系统是…

【OpenCV实现图像:用OpenCV图像处理技巧之白平衡算法】

文章目录 概要加载样例图像统计数据分析White Patch Algorithm小结 概要 白平衡技术在摄影和图像处理中扮演着至关重要的角色。在不同的光照条件下&#xff0c;相机可能无法准确地捕捉到物体的真实颜色&#xff0c;导致图像呈现出暗淡、色调不自然或者褪色的效果。为了解决这个…

【经验模态分解】3.EMD模态分解算法设计与准备工作

/*** poject 经验模态分解及其衍生算法的研究及其在语音信号处理中的应用* file EMD模态分解算法设计与准备工作* author jUicE_g2R(qq:3406291309)* * language MATLAB* EDA Base on matlabR2022b* editor Obsidian&#xff08;黑曜石笔记软…

Linux安装DMETL4

Linux安装DMETL4 产品与环境介绍1 规划安装路径2 DM8安装路径2.1 达梦数据库程序安装路径2.2 初始化达梦数据库2.3 创建数据库用户名 DMETL 3 安装DMETL3.1 查看安装包与授权3.2 安装DMETL程序3.3 DMETL安装日志 4 启动DMETL5 DMETL连接数据库后会自动创建相关资源表6 达梦数据…

MySQL索引的数据结构

1. 索引及其优缺点 1.1 索引概述 MySQL官方对索引的定义为&#xff1a;索引&#xff08;Index&#xff09;是帮助MySQL高效获取数据的数据结构。 索引的本质&#xff1a;索引是数据结构。你可以简单理解为“排好序的快速查找数据结构”&#xff0c;满足特定查找算法。这些数据结…

【每日一题】咒语和药水的成功对数

文章目录 Tag题目来源解题思路方法一&#xff1a;排序二分 写在最后 Tag 【排序二分】【数组】【2023-11-10】 题目来源 2300. 咒语和药水的成功对数 解题思路 方法一&#xff1a;排序二分 我们首先对 points 进行升序排序&#xff0c;然后枚举 spells 中的 x&#xff0c;需…

IDEA 编译项目时报错:java: java.lang.OutOfMemoryError:GC overhead limit exceeded解决方法

1.问题简述 在Intellij IDEA下编译Java项目&#xff0c;报错&#xff1a;java.lang.OutOfMemoryError: …(此处忽略) GC overhead limit exceeded 2.问题分析 错误是发生在编译阶段&#xff0c;而不是运行阶段。通过查询相关资料发现&#xff0c; 1.idea编译Java项目使用的虚…

Adobe Photoshop 2020给证件照换底

1.导入图片 2.用魔法棒点击图片 3.点选择&#xff0c;反选 4.选择&#xff0c;选择并遮住 5.用画笔修饰证件照边缘 6. 7.更换要换的底的颜色 8.新建图层 9.使用快捷键altdelete键填充颜色。 10.移动图层&#xff0c;完成换底。

《开箱元宇宙》:认识香港麦当劳通过 The Sandbox McNuggets Land 的 Web3 成功经验

McNuggets Land 是 The Sandbox 于 2023 年发布的最受欢迎的体验之一。在本期的《开箱元宇宙》系列中&#xff0c;我们采访了香港麦当劳数位顾客体验暨合作伙伴资深总监 Kai Tsang&#xff0c;来了解这一成功案例背后的策略。 在不断发展的市场营销和品牌推广领域&#xff0c;不…

面试复习整理

redis持久化方式和原理 Redis持久化是指将Redis内存中的数据以某种形式保存到磁盘上&#xff0c;以保证在Redis重启后数据不会丢失。Redis支持两种持久化方式&#xff1a;RDB&#xff08;Redis DataBase&#xff09;和AOF&#xff08;Append Only File&#xff09;。 RDB持久…

深度学习之基于Python+OpenCV(DNN)性别和年龄识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 基于Python和OpenCV的深度学习性别和年龄识别系统是一种利用深度学习模型来自动识别人脸照片中的性别和年龄的技术。…

2013年108计网

第33题 在 OSI 参考模型中, 下列功能需由应用层的相邻层实现的是()A. 对话管理B. 数据格式转换C. 路由选择D. 可靠数据传输 很显然&#xff0c;题目所问的应用层的相邻层是表示层。该层实现与数据表示相关的功能。选项a中的对话管理属于会话层。选项c中的路由选择属于网络层。…

从内存优化视角再看 Glide 图片加载库

前置背景 Glide 作为常用的图片加载框架&#xff0c;框架层面已经对内存方面有不少优化&#xff0c;但作为一个图片框架&#xff0c;确保正确性一定是第一位的&#xff0c;因此在应用层还可以在适当的场景做一些额外的优化&#xff0c;当然你需要了解优化设置可能产生的问题。…

隧道技术的三种应用场景(IPv6,多播,VPN)

目录 1.IPv6的隧道技术 2.多播路由选择 (1)洪泛 (2)隧道技术 (3)基于核心的发现技术 3.隧道技术实现&#xff08;VPN&#xff09;虚拟专用网 1.IPv6的隧道技术 IPv6与IPv4的过渡技术中包含了IPv6的隧道技术&#xff1a; http://t.csdnimg.cn/wuvXY 2.多播路由选择 转发…

通达OA V12 引入thinkphp5.1框架,读取OA的.ini文件

通达OA V12 引入thinkphp5.1框架&#xff0c;读取OA的.ini文件 内容绝对原创&#xff0c;希望对您有帮助。您的打赏&#xff0c;是让我持续更新的牛奶和面包 找到ini文件的绝对路径。$path“”;使用parse_ini_file($path,true,INI_SCANNER_RAW)&#xff0c;读取ini文件。 代码如…

【Python3】【力扣题】232. 用栈实现队列

【力扣题】题目描述&#xff1a; 栈&#xff1a;线性集合。后进先出。 队列&#xff1a;线性集合。先进先出。 【Python3】代码&#xff1a; 解题思路&#xff1a;两个栈&#xff0c;一个入队的栈&#xff0c;一个出队的栈。出栈时&#xff0c;若出队的栈为空&#xff0c;才将…

Unreal UnLua + Lua Protobuf

Unreal UnLua Lua Protobuf https://protobuf.dev/ protobuf wire format&#xff1a;pb 编译到底层的数据协议 https://github.com/starwing/lua-protobuf/blob/master/README.zh.md buffer 处理 lua string 可以当 buffer 用&#xff0c;# len 不会遇到 0 截断&#xf…

【Word自定义配置,超简单,图文并茂】自定义Word中的默认配置,比如标题大小与颜色(参考科研作图配色),正文字体等

▚ 01 自定义样式Styles中的默认标题模板 自定义标题的显示效果&#xff0c;如下图所示&#xff1a; 1.1 自定义标题的模板Normal.dotm 1.1.1 选择所需修改的标题 新建一个空白Word文档&#xff0c;依次选择菜单栏的开始Home&#xff0c;样式Styles&#xff0c;鼠标右键选择…

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

目录 前言&#xff1a; 一、概述 二、CPU操作和显示 三、安装 四、CPU的选择 前言&#xff1a; 一、概述 西门子S7-1500系列是一系列高性能工业自动化控制器&#xff0c;广泛应用于制造业、自动化生产、物流等领域。这个系列的控制器是设计用来满足高性能、高效能要求的复…