当前位置: 首页 > news >正文

uboot启动流程-uboot内存分配

一.  uboot启动流程

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

具体分析 board_init_f函数的第二部分:内存分配代码。

本文继上一篇文章的学习,地址如下:

uboot启动流程-涉及board_init_f 函数-CSDN博客

二.  uboot内存分配

下面具体分析 board_init_f 函数的后半部分:内存分配代码。

board_init_f 函数里面有大量的条件编译代码,这里为了缩小篇幅,将条件编译部分删除掉了,去掉条件编译以后的board_init_f 函数 后半部分代码如下:

1 static init_fnc_t init_sequence_f[] = {
2 setup_mon_len,
......
32 /*
33 * Now that we have DRAM mapped and working, we can
34 * relocate the code and continue running from DRAM.
35 *
36 * Reserve memory at end of RAM for (top down in that order):
37 * - area that won't get touched by U-Boot and Linux (optional)
38 * - kernel log buffer
39 * - protected RAM
40 * - LCD framebuffer
41 * - monitor code
42 * - board info struct
43 */
44 setup_dest_addr, 
45 reserve_round_4k, 
46 reserve_mmu, 
47 reserve_trace, 
48 reserve_uboot, 
49 reserve_malloc, 
50 reserve_board, 
51 setup_machine, 
52 reserve_global_data, 
53 reserve_fdt, 
54 reserve_arch, 
55 reserve_stacks, 
56 setup_dram_config, 
57 show_dram_config, 
58 display_new_sp, 
59 INIT_FUNC_WATCHDOG_RESET
60 reloc_fdt, 
61 setup_reloc, 
62 NULL,
63 };

44 行, setup_dest_addr 函数,设置目的地址,设 gd->ram_size gd->ram_top gd->relocaddr
这三个的值。 我可以修改 uboot 代码,直接将这些值通过串口打印出来,比如这里我们修改文件
common/board_f.c ,因为 setup_dest_addr 函数定义在文件 common/board_f.c 中。

setup_dest_addr 函数加入打印如下:

    printf("gd->ram_size: %#x\n", gd->ram_size);printf("gd->ram_top: %#x\n", gd->ram_top);printf("gd->relocaddr: %#x\n", gd->relocaddr);

重新编译 uboot源码后,生成 u-boot.bin。将 u-boot.bin拷贝到 ubuntu的 tftp服务设置目录下。

通过 tftp服务将 u-boot.bin下载到开发板。开发板uboot命令模式下输入如下:

=> tftp 0x87800000 u-boot.bin
Using FEC1 device
TFTP from server 192.168.1.66; our IP address is 192.168.1.50
Filename 'u-boot.bin'.
Load address: 0x87800000
Loading: #################################2.7 MiB/s
done
Bytes transferred = 476700 (7461c hex)

运行下载到开发板的 DRAM的uboot。操作如下:

=> go 0x87800000
## Starting application at 0x87800000 ...U-Boot 2016.03 (Oct 02 2023 - 21:20:41 +0800)CPU:   Freescale i.MX6ULL rev1.1 69 MHz (running at 396 MHz)
CPU:   Industrial temperature grade (-40C to 105C) at 44C
Reset cause: unknown reset
Board: MX6ULL ALIENTEK NAND
I2C:   ready
DRAM:  gd->ram_size: 0x10000000
gd->ram_top: 0x90000000
gd->relocaddr: 0x90000000
256 MiB
......

可以看出, 这里三个参数:

gd->ram_size = 0X10000000 //ram 大小为 0X10000000= 256 MB
gd->ram_top = 0X90000000 //ram 最高地址为 0X80000000+0X10000000=0X90000000
gd->relocaddr = 0X90000000 //重定位后最高地址为 0X90000000

45 行 , reserve_round_4k 函数用于对 gd->relocaddr 4KB 对 齐 , 因 为gd->relocaddr=0XA0000000 ,已经是 4K 对齐了,所以调整后不变。

46 行, reserve_mmu 函数,留出 MMU TLB 表的位置,分配 MMU TLB 表内存以后,会对 gd->relocaddr 64K 字节对齐。完成以后, gd->arch.tlb_size gd->arch.tlb_addr gd->relocaddr如下所示:
DRAM:  gd->arch.tlb_size: 0x4000  //MMU 的 TLB 表大小
gd->arch.tlb_addr: 0x8fff0000     //MMU 的 TLB 表起始地址,64KB 对齐以后
gd->relocaddr: 0x8fff0000         //relocaddr 地址

47 行,reserve_trace 函数,留出跟踪调试的内存,I.MX6ULL 没有用到!

48 行, reserve_uboot 函数, 留出重定位后的 uboot 所占用的内存区域, uboot 所占用大小由gd->mon_len 所指定,留出 uboot 的空间以后还要对 gd->relocaddr 4K 字节对齐,并且重新设 gd->start_addr_sp ,打印如下:
 
DRAM:  gd->mon_len: 0xb7394
gd->start_addr_sp: 0x8ff38000
gd->relocaddr: 0x8ff38000

49 行, reserve_malloc 函数,留出 malloc 区域,调整 gd->start_addr_sp 位置, malloc 区域由宏
TOTAL_MALLOC_LEN 定义,打印如下:

DRAM:  TOTAL_MALLOC_LEN:    0x1020000
gd->start_addr_sp: 0x8ef18000      //0X8FF38000-16MB-4MB=0X8EF18000

相关文章:

uboot启动流程-uboot内存分配

一. uboot启动流程 _main 函数中会调用 board_init_f 函数,本文继续简单分析一下 board_init_f 函数。 具体分析 board_init_f函数的第二部分:内存分配代码。 本文继上一篇文章的学习,地址如下: uboot启动流程-涉及board_init…...

LeetCode 面试题 08.02. 迷路的机器人

文章目录 一、题目二、C# 题解 一、题目 设想有个机器人坐在一个网格的左上角,网格 r 行 c 列。机器人只能向下或向右移动,但不能走到一些被禁止的网格(有障碍物)。设计一种算法,寻找机器人从左上角移动到右下角的路径…...

画CMB天图使用Planck配色方案

使用Planck的配色方案: 全天图: 或者方形图: 使用下面设置即可: import pspy, pixell from pspy.so_config import DEFAULT_DATA_DIR pixell.colorize.mpl_setdefault("planck")此方法不会改变matplotlib默认配色方案…...

成都瀚网科技有限公司:抖店精选联盟怎么用?

抖音精选联盟是抖音电商平台提供的一项服务,旨在为商家提供更多的推广机会和销售渠道。然而,很多人对于如何使用抖店精选联盟以及如何开通这项服务不太了解。本文将为您详细介绍抖店精选联盟的使用和激活流程。 第一节:如何使用抖店精选联盟 …...

第二章:最新版零基础学习 PYTHON 教程(第五节 - Python 输入/输出–如何在Python中打印而不换行?)

一般来说,从 C/C++ 切换到 Python 的人想知道如何在 python 中打印两个或多个变量或语句而不进入新行。由于Python print() 函数默认以换行符结尾。Python 有一个预定义的格式,如果你使用 print(a_variable) 那么它会自动转到下一行。 例子: # 输入:[csdn, csdnforcsdn] …...

C++实现集群聊天服务器

C实现集群聊天服务器 JSON Json是一种轻量级的数据交换模式(也叫做数据序列化方式)。Json采用完全独立于编程语言的文本格式来存储和表示数据。见解和清晰的层次结构使得Json称为理想的数据交换语言。易于阅读和编写。同时也易于支持机器解析和生成&am…...

40 二叉树的直径

二叉树的直径 总结:两个节点之间最长路径 路径的结点数 - 1题解1 递归——DFS 给你一棵二叉树的根节点,返回该树的 直径。 二叉树的直径是指树中任意两个节点之间最长路径的长度。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的长度由…...

Thread.sleep(0)的作用是什么?

Thread.sleep(0) 的作用是让当前线程放弃剩余的时间片,允许其他具有相同优先级的线程运行。这种操作有时被称为“主动让出CPU时间片”或“线程主动让步”。 通常情况下,当一个线程执行到一段代码时,它会占用CPU的时间片,直到时间…...

浏览器指定DNS

edge--设置 https://dns.alidns.com/dns-query...

虚拟机安装 centos

title: 虚拟机安装 centos createTime: 2020-12-13 12:00:27 updateTime: 2020-12-13 12:00:27 categories: linux tags: 虚拟机安装 centos 路线图 主机(宿主机) —> centos --> docker --> docker 镜像 --> docker 容器 — docker 服务 1.前期准备 一台 主机 或…...

【计算机网络笔记九】I/O 多路复用

阻塞 IO 和 非阻塞 IO 阻塞 I/O 和 非阻塞 I/O 的主要区别: 阻塞 I/O 执行用户程序操作是同步的,调用线程会被阻塞挂起,会一直等待内核的 I/O 操作完成才返回用户进程,唤醒挂起线程非阻塞 I/O 执行用户程序操作是异步的&#xf…...

踩坑日记 《正确的使用Vuex》基于 uniapp Vue3 setup 语法糖 vuex4 项目 太多坑了要吐了

踩坑日记 《正确的使用Vuex》基于 uniapp Vue3 setup 语法糖 vuex4 项目 太多坑了要吐了 完美解决页面数据不刷新 或者数据慢一步刷新 页面使用html <template><view><template v-if"cartData.data.length>0"><!-- 自定义导航栏 --><…...

Python无废话-办公自动化Excel修改数据

如何修改Excel 符合条件的数据&#xff1f;用Python 几行代码搞定。 需求&#xff1a;将销售明细表的产品名称为PG手机、HW手机、HW电脑的零售价格分别修改为4500、5500、7500&#xff0c;并保存Excel文件。如下图 Python 修改Excel 数据&#xff0c;常见步骤&#xff1a; 1&…...

MySQL系统架构设计

MySQL 一、MySQL整体架构1.1 SQL接口1.2 解析器 Parser1.3 查询优化器 Optimizer1.3.1 逻辑优化1.3.2 物理优化1.3.3 explain1.4 缓存 Cache1.5 存储引擎 Stroage Management1.6 一条查询SQL的执行流程二、缓存池(Buffer Pool)2.1 Buffer Pool 预读机制2.2 Buffer Pool free链…...

Google vs IBM vs Microsoft: 哪个在线数据分析师证书最好

Google vs IBM vs Microsoft: 哪个在线数据分析师证书最好&#xff1f; 对目前市场上前三个数据分析师证书进行审查和比较|Madison Hunter 似乎每个重要的公司都推出了自己版本的同一事物&#xff1a;专业数据分析师认证&#xff0c;旨在使您成为雇主的下一个热门商品。 随着…...

数据链路层 MTU 对 IP 协议的影响

在介绍主要内容之前&#xff0c;我们先来了解一下数据链路层中的"以太网" 。 “以太网”不是一种具体的网络&#xff0c;而是一种技术标准&#xff1b;既包含了数据链路层的内容&#xff0c;也包含了一些物理层的内容。 下面我们再来了解一下以太网数据帧&#xff…...

一文拿捏基于redis的分布式锁、lua、分布式性能提升

1.分布式锁 jdk的锁&#xff1a; 1、显示锁&#xff1a;Lock 2、隐式锁&#xff1a;synchronized 使用jdk锁保证线程的安全性要求&#xff1a;要求多个线程必须运行在同一个jvm中 但现在的系统基本都是分布式部署的&#xff0c;一个应用会被部署到多台服务器上&#xff0c;s…...

机器学习必修课 - 如何处理缺失数据

运行环境&#xff1a;Google Colab 处理缺失数据可简单分为两种方法&#xff1a;1. 删除具有缺失值的列 2. 填充 !git clone https://github.com/JeffereyWu/Housing-prices-data.git下载数据集 import pandas as pd from sklearn.model_selection import train_test_split导…...

阿里云服务器方升架构、自研硬件、AliFlash技术创新

阿里云服务器技术创新&#xff1a;服务器方升架构及自研硬件、自研存储硬件AliFlash和阿里云异构计算加速平台&#xff0c;阿里云百科分享阿里云服务器有哪些技术创新&#xff1a; 目录 服务器技术创新 服务器方升架构及自研硬件 自研存储硬件AliFlash 阿里云异构计算加速…...

知识工程---neo4j 5.12.0+GDS2.4.6安装

&#xff08;已安装好neo4j community 5.12.0&#xff09; 一. GDS下载 jar包下载地址&#xff1a;https://neo4j.com/graph-data-science-software/ 下载得到一个zip压缩包&#xff0c;解压后得到jar包。 二. GDS安装及配置 将解压得到的jar包放入neo4j安装目录下的plugi…...

【FastAPI 2.0流式AI响应终极指南】:20年架构师亲授异步SSE/Chunked Transfer实战避坑清单

第一章&#xff1a;FastAPI 2.0流式AI响应面试概览在现代AI应用开发中&#xff0c;面试场景下的实时交互体验正成为关键评估维度。FastAPI 2.0 引入了对原生异步流式响应&#xff08;StreamingResponse&#xff09;的深度优化&#xff0c;支持 Server-Sent Events&#xff08;S…...

告别卡顿闪烁!在Cesium 1.134中集成SOG格式,让400万高斯秒级加载

突破性能瓶颈&#xff1a;Cesium 1.134集成SOG格式实现400万高斯秒级渲染 在三维地理空间可视化领域&#xff0c;Cesium一直是开发者构建高精度场景的首选引擎。但当项目涉及数百万级高斯泼溅数据时&#xff0c;传统加载方式往往导致令人崩溃的卡顿和视角移动时的闪烁问题。最近…...

dfs:飞机降落

题目&#xff1a;P9241 [蓝桥杯 2023 省 B] 飞机降落 - 洛谷 做题目之前一定要先看数据范围。这道题的数据范围&#xff0c;T,N均<10&#xff0c;可以用暴力搜索。 这道题是排序&#xff0c;假设有3辆飞机。顺序可以是123&#xff0c;132&#xff0c;213&#xff0c;231&am…...

第12课:从 SPI 环路、CAN 通信到 SD 与 eMMC 存储实战

本节路线图 先把三条主线分开:控制总 → SPI环路测试:先把时序 → CAN:换一条总线,世界 小猫提醒 这节有分区、烧录或删除类操作,先确认盘符和路径,再按回车。 如果说上一课的关键词是“事件、时间和系统能力”,那这一课的关键词就是“总线、协议和数据落地”。 我们要…...

手把手教你用ThinkPHP6和Uniapp从零搭建一个物业设备巡检小程序(附完整源码)

从零构建物业设备巡检系统&#xff1a;ThinkPHP6与Uniapp全栈实战指南 物业设备巡检是保障设施安全运行的关键环节&#xff0c;传统纸质记录方式效率低下且难以追溯。本教程将带您从零开始&#xff0c;基于ThinkPHP6后端框架与Uniapp跨端方案&#xff0c;构建一个功能完整的移动…...

esp-hosted 方案深度解析:从架构选型到性能调优实战

1. 为什么选择esp-hosted方案&#xff1f; 如果你正在为嵌入式系统寻找稳定可靠的无线连接方案&#xff0c;esp-hosted绝对值得考虑。这个由乐鑫推出的开源方案&#xff0c;本质上是通过ESP32系列芯片为Linux主机或MCU设备提供Wi-Fi和蓝牙连接能力。我曾在多个工业物联网项目中…...

Umi-OCR插件技术方案:5款引擎深度对比与实战配置指南

Umi-OCR插件技术方案&#xff1a;5款引擎深度对比与实战配置指南 【免费下载链接】Umi-OCR_plugins Umi-OCR 插件库 项目地址: https://gitcode.com/gh_mirrors/um/Umi-OCR_plugins Umi-OCR插件库为开源OCR工具提供了丰富的引擎选择&#xff0c;从本地CPU加速到云端AI识…...

CI/CD 流水线性能优化:从构建到部署

CI/CD 流水线性能优化&#xff1a;从构建到部署 前言 哥们&#xff0c;别整那些花里胡哨的理论。今天直接上硬菜——我在大厂一线优化 CI/CD 流水线性能的真实经验总结。作为一个白天写前端、晚上打鼓的硬核工程师&#xff0c;我对效率的追求就像对鼓点节奏的把控一样严格。 背…...

ArXiv:为何大模型无法拥有意识|Erik Hoel

导语当AI能流畅谈论“自我感受”&#xff0c;当Anthropic赋予Claude“对话退出权”&#xff0c;我们是否可以说它有意识&#xff1f;2026年初&#xff0c;神经科学家Erik Hoel在ArXiv发布论文《大语言模型意识证伪&#xff1a;持续学习对意识存在的必要性》&#xff08;A Dispr…...

Ubuntu20.04.2LTS下AutoDock4-GPU的编译优化与性能调优实战

1. 环境准备与CUDA版本选择 在Ubuntu20.04.2LTS上部署AutoDock4-GPU之前&#xff0c;最关键的就是搭建合适的CUDA环境。我遇到过不少因为CUDA版本不匹配导致的编译失败问题&#xff0c;这里分享几个实用经验。 首先检查你的GPU型号和驱动版本。以我的NVIDIA RTX 2080 Ti为例&am…...