ARMV8 RK3399 u-boot TPL启动流程分析 --crt0.S

上一篇介绍到start.S 最后一个指令是跳转到_main, 接下来分析 __main 都做了什么

arch/arm/lib/crt0.S

__main 注释写的很详细,主要分为5步

1. 准备board_init_f的运行环境

2. 跳转到board_init_f

3. 设置broad_init_f 申请的stack 和 GD

4. 完整u-boot 执行relocate_code, 将u-boot 搬到board_init_f计算出的目的地址, tpl, spl 跳回crt0

5. 设置board_init_r运行环境,完整u-boot 有些cpu 剩余工作由c_runtime_cpu_setup完成

6. 跳转到board_init_r

详细分析如下:

1. CONFIG_TPL_NEEDS_SEPARATE_STACK=1 CONFIG_TPL_STACK 0xff8effff

	bic	r0, r0, #7	/* 8-byte alignment for ABI compliance */mov	sp, r0bl	board_init_f_alloc_reservemov	sp, r0/* set up gd here, outside any C code */mov	r9, r0bl	board_init_f_init_reservebl	board_init_f_boot_flagsbl	board_init_f

2. board_init_f

代码位于arch/arm/mach-rockchip/tpl.c

CONFIG_SPL_FRAMEWORK=1

CONFIG_TINY_FRAMEWORK=n

CONFIG_DEBUG_UART=1

CONFIG_TPL_SERIAL=1

debug_uart_init => 到此可以用简单版的print, c标准printf 还不能用

rockchip_stimer_init => timer 相关,暂时用不到

2.1 spl_early_init

 tpl/spl 中的大部分工作都是在这个函数中完成,代码位置 common\spl\spl.c, 主要完成

a. fdtdec_setup, 设置fdt,

b. dm_init_and_scan, 初始化所有挂在dm 架构上的驱动

tpl 中目前有如下几个,其中就包含了TPL 的主要功能,初始化DRAM, 即 .u_boot_list_2_driver_2_dmc_rk3399

 .u_boot_list_2_driver_2_clk_fixed_rate
 .u_boot_list_2_driver_2_clk_rk3399
 .u_boot_list_2_driver_2_dmc_rk3399
 .u_boot_list_2_driver_2_firmware
 .u_boot_list_2_driver_2_generic_syscon
 .u_boot_list_2_driver_2_psci
 .u_boot_list_2_driver_2_rockchip_efuse
 .u_boot_list_2_driver_2_rockchip_rk3399_pmuclk
 .u_boot_list_2_driver_2_root_driver
 .u_boot_list_2_driver_2_simple_bus_drv
 .u_boot_list_2_driver_2_syscon_rk3399

2.2 返回BROM

back_to_bootrom 调用 longjmp(brom_ctx, BROM_BOOT_NEXTSTAGE);

x0 为 brom_ctx, x1 为BROM_BOOT_NEXTSTAGE=1

通过longjump 返回到上一篇中的setjmp 下一条指令,并且ret 被替换为longjmp 返回值,

ret=0, 可以boot next stage,  不过目前还不知具体原理,有了解的欢迎评论区讨论

        /*
         * To instruct the BROM to boot the next stage, we
         * need to return 0 to it: i.e. we need to rewrite
         * the return code once more.
         */
        ret = 0;

#if defined(CONFIG_TPL_ROCKCHIP_BACK_TO_BROM) && !defined(CONFIG_TPL_BOARD_INIT)back_to_bootrom(BROM_BOOT_NEXTSTAGE);
#endif
ENTRY(longjmp)ldp  x19, x20, [x0,#0]ldp  x21, x22, [x0,#16]ldp  x23, x24, [x0,#32]ldp  x25, x26, [x0,#48]ldp  x27, x28, [x0,#64]ldp  x29, x30, [x0,#80]ldr  x2, [x0,#96]mov  sp, x2/* Move the return value in place, but return 1 if passed 0. */adds x0, xzr, x1csinc x0, x0, xzr, ne/* invalid icache for cortex a35 */
branch_if_a35_core x1, __asm_invalidate_icache_allret
ENDPROC(longjmp)

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

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

相关文章

RabbitMQ--进阶篇

RabbitMQ 客户端整合Spring Boot 添加相关的依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency> 编写配置文件&#xff0c;配置RabbitMQ的服务信息 spri…

Redis--基础知识点--27--redis缓存分类树

在 Redis 中存储分类树&#xff0c;通常需要选择合适的数据结构来表现层级关系。以下是使用 字符串&#xff08;String&#xff09; 和 哈希&#xff08;Hash&#xff09; 两种常见方案的举例说明&#xff0c;结合电商分类场景&#xff08;如 电子产品 > 手机 > 智能手机…

【C++】汇编角度分析栈攻击

栈攻击 介绍原理示例代码汇编分析 介绍原理 核心原理是通过 缓冲区溢出&#xff08;Buffer Overflow&#xff09; 等漏洞&#xff0c;覆盖栈上的关键数据&#xff08;如返回地址、函数指针&#xff09;&#xff0c;从而改变程序执行流程&#xff1b; 在 C 中&#xff0c;每个…

访问 Docker 官方镜像源(包括代理)全部被“重置连接”或超时

华为云轻量应用服务器&#xff08;Ubuntu 系统&#xff09; 遇到的问题是&#xff1a; &#x1f512; 访问 Docker 官方镜像源&#xff08;包括代理&#xff09;全部被“重置连接”或超时了&#xff0c;说明你这台服务器的出境网络对这些国外域名限制很严格&#xff0c;常见于华…

Java语言

本文来源 &#xff1a; 腾讯元宝 Java是一种面向对象、跨平台的高级编程语言&#xff0c;最初由Sun Microsystems&#xff08;现为Oracle公司所有&#xff09;于1995年推出&#xff0c;广泛应用于Web开发、移动应用、大数据处理、嵌入式系统等领域。以下是其核心特点和应用概述…

无偿帮写毕业论文(看不懂的可以私信博主)

以下教程教你如何利用相关网站和AI免费帮你写一个毕业论文。毕竟毕业论文只要过就行&#xff0c;脱产学习这么多年&#xff0c;终于熬出头了&#xff0c;完成毕设后有空就去多看看亲人好友&#xff0c;祝好&#xff01; 一、找一个论文模板 废话不多说&#xff0c;先上干货Ov…

python打卡day26

函数、参数、变量 知识点回顾&#xff1a; 函数的定义变量作用域&#xff1a;局部变量和全局变量函数的参数类型&#xff1a;位置参数、默认参数、不定参数传递参数的手段&#xff1a;关键词参数传递参数的顺序&#xff1a;同时出现三种参数类型时 def function_name(parameter…

LeetCode 热题 100 437. 路径总和 III

LeetCode 热题 100 | 437. 路径总和 III 大家好&#xff0c;今天我们来解决一道经典的二叉树问题——路径总和 III。这道题在 LeetCode 上被标记为中等难度&#xff0c;要求计算二叉树中节点值之和等于给定目标值 targetSum 的路径数目。 问题描述 给定一个二叉树的根节点 ro…

vue3学习-局部使用vue框架案例

目录 局部使用vue框架步骤 简单案例1 简单案例2【 结构化赋值语法】 简单案例3【使用模块化开发模式】 基本数据的简单应用&#xff0c;对象的简单应用 数组的简单应用 局部使用vue框架步骤 1 引用 vue框架的核心文件和 涉及ES6语法的文件 注意&#xff1a;这里文件&am…

初识Linux · IP分片

目录 前言&#xff1a; IP分片 分片vs不分片 如何分片 分片举例 三个字段 前言&#xff1a; 前文IP协议上和IP协议下我们已经把IP协议的报头的大多数字段介绍了&#xff0c;唯独有三个字段现在还有介绍&#xff0c;即16位标识&#xff0c;8位协议&#xff0c;13位片偏移…

u3d 定义列表详细过程

层级结构 - Canvas - Scroll View - Viewport - Content (Vertical Layout Group) - Item1 (Prefab) - Item2 (Prefab) ... 详细设置步骤 1. 创建 Canvas 2. 添加 Scroll View 组件 3. 在 Scroll View 下创建 Content 子对象 4. 添加 …

产品方法论与 AI Agent 技术的深度融合:从决策智能到价值创造

一、引言&#xff1a;智能化时代的产品范式革命 在数字化转型的深水区&#xff0c;产品开发正经历着从 “功能定义” 到 “体验设计” 再到 “智能演化” 的范式跃迁。麦肯锡 2024 年报告指出&#xff0c;采用 AI 驱动产品方法论的企业&#xff0c;新品研发周期平均缩短 40%&a…

力扣.1471数组的k个最强值,力扣.1471数组的k个最强值力扣1576.替换所有的问号力扣1419.数青蛙​编辑力扣300.最长递增子序列

目录 力扣.1471数组的k个最强值 力扣1576.替换所有的问号 力扣1419.数青蛙​编辑 力扣300.最长递增子序列 力扣.1471数组的k个最强值 class Solution {public static int[] getStrongest(int[] arr,int k) {if(karr.length){return arr;}int []retnew int[k];int narr.lengt…

使用docker安装clickhouse集群

1、简介 clickhouse 作为大数据场景中&#xff0c;实现快速检索的常用列式存储数据库&#xff0c;采用物理机部署&#xff0c;会在数据量大的场景中&#xff0c;物理机器存储达到阈值需要扩容&#xff0c;会带来比较大的问题&#xff0c;因此&#xff0c;使用docker部署clickho…

package-lock.json能否直接删除?

package-lock.json能否直接删除&#xff1f; package-lock.json 生成工具&#xff1a;由 npm 自动生成。 触发条件&#xff1a;当运行 npm install 时&#xff0c;如果不存在 package-lock.json&#xff0c;npm 会创建它&#xff1b;如果已存在&#xff0c;npm 会根据它精确安…

如何在 Windows 命令提示符中创建多个文件夹和多个文件

如何在 Windows 命令提示符中创建多个文件夹和多个文件 虽然大多数用户习惯使用 Windows 图形界面来创建文件夹&#xff0c;但如果你需要一次性创建多个文件夹或文件&#xff0c;如同在类Unix系统中可以使用mkdir和touch命令一样&#xff0c;windows下也有创建目录和文件的对应…

leetcode - 滑动窗口问题集

目录 前言 题1 长度最小的子数组&#xff1a; 思考&#xff1a; 参考代码1&#xff1a; 参考代码2&#xff1a; 题2 无重复字符的最长子串&#xff1a; 思考&#xff1a; 参考代码1&#xff1a; 参考代码2&#xff1a; 题3 最大连续1的个数 III&#xff1a; 思考&am…

Ubuntu20.04下如何源码编译Carla,使用UE4源码开跑,踩坑集合

一、简介 作为一个从事算法研究的人员,无人驾驶仿真一直是比较重要的一部分,但是现在比较常见的算法验证都是在carla这个开源仿真平台上做的,所以我有二次开发carla的需求,今天就来讲讲编译CARLA。 网上的教材很多,但还是推荐大家看官网教程:Linux build - CARLA Simul…

Linux云计算训练营笔记day09(MySQL数据库)

Linux云计算训练营笔记day09&#xff08;MySQL数据库&#xff09; 目录 Linux云计算训练营笔记day09&#xff08;MySQL数据库&#xff09;外键约束数据的导入和导出数据的导出数据的导入 DQL 数据查询语言查指定字段查所有字段where 过滤条件and 和 orin 和 not inbetween...an…

对心理幸福感含义的探索 | 幸福就是一切吗?

注&#xff1a;机翻&#xff0c;未校。 Happiness Is Everything, or Is It? Explorations on the Meaning of Psychological Well-Being 幸福就是一切吗&#xff1f;对心理幸福感含义的探索 Journal of Personality and Social Psychology 1989, Vol. 57, No. 6,1069-1081 …