TinyEMU源码分析之启动流程

TinyEMU源码分析之启动流程

  • 1 始于0x1000
  • 2 确定BBL入口点
  • 3 mentry.S执行过程
  • 4 启动流程小结

本文属于《 TinyEMU模拟器基础系列教程》之一,欢迎查看其它文章。
本文中使用的代码,均为伪代码,删除了部分源码。

1 始于0x1000

我们沿着TinyEMU的启动流程,依次讲解,以便理解其启动原理。

整个虚拟机,到底从哪里,开始执行第一条指令呢?

我们可以在glue函数的,s->pc = GET_PC()位置处,打上断点,查看第一条指令的PC。

static void no_inline glue(riscv_cpu_interp_x, XLEN)(RISCVCPUState *s, int n_cycles1)
{for(;;) {// 获取PCs->pc = GET_PC(); addr = s->pc;ptr = (uint8_t *)(s->tlb_code[tlb_idx].mem_addend +(uintptr_t)addr);code_ptr = ptr;//根据PC获取一条指令机器码insn = get_insn32(code_ptr); }
}

可以发现,第一条指令的PC为0x1000。
我们回顾一下,《TinyEMU源码分析之虚拟机初始化》中介绍的5条指令。

auipc t0, jump_addr			// t0 = 0x80000000
auipc a1, dtb				// a1 = PC
addi a1, a1, dtb			// a1 = a1 + 0x3c
csrr a0, mhartid			// a0 = mhartid
jalr zero, t0, jump_addr	// PC = t0

这5条指令,就是从0x1000内存地址,开始存放的。
因此,虚拟机可以确定:

  • 第1条指令,从auipc t0, jump_addr开始执行;
  • 第5条指令jalr zero, t0, jump_addr,将PC设置为0x80000000;
  • 因此,第6条指令,必然跳转到0x80000000处执行。

而0x80000000处,我们存放的是BIOS/Bootloader(这里是bbl64.bin);因此0x80000000处为bbl64.bin的第一条指令(入口点),我们需要分析bbl64.bin的源码,找到其入口点。

2 确定BBL入口点

bbl64.bin的源码,包括2部分,汇编文件与C文件。
汇编文件为riscv-pk\machine\mentry.S,一般叫启动文件。

Bootloader的.s启动文件,是汇编语言源代码文件,通常用于嵌入式系统的启动过程。
这个文件包含了系统启动时的底层硬件初始化代码,是用汇编语言编写的,以便直接操作硬件寄存器,完成必要的初始化工作。

在链接器的链接脚本.lds文件内,会定义程序的入口点,即程序的第一条可执行指令。

关于链接器脚本,可参考《【裸机开发】链接脚本(.lds文件)的基本语法》。

因此,编译器对.s和.c文件,执行编译与链接后,程序就可以从该入口点开始执行。
通常入口点,就在汇编文件中,这里就是mentry.S。

我们看,链接脚本riscv-pk\bbl\bbl.lds,如下:
在这里插入图片描述
ENTRY(symbol),这里的symbol指的是符号表中的符号。汇编阶段会生成符号表,符号表中的符号,包括静态变量、全局变量、函数名等。这是将某一个符号symbol的值,设为入口地址。

我们再看,riscv-pk\machine\mentry.S,如下:
在这里插入图片描述
因此bbl.lds指定的入口点,就是mentry.S中的reset_vector处。
即0x80000000处,指令为j do_reset

3 mentry.S执行过程

执行指令j do_reset,跳转到do_reset地址后,后续执行过程,如下所示:
在这里插入图片描述
汇编代码添加了注释,比较简单,主要有以下操作:

  • 主要是初始化x系列寄存器,以及根据misa寄存器判断;
  • 此外,前面讲过的a0与a1寄存器值,作为init_first_hart函数的入参;
  • 保存异常向量表基址,到mtvec寄存器;
  • 准备栈指针sp;
  • 最后,跳转到riscv-pk\machine\minit.c中的init_first_hart函数,进入到C代码阶段。

4 启动流程小结

在bbl64.bin执行完毕后,进入运行OS(kernel-riscv64.bin)阶段。
上述启动流程,可用下图,来简要描述:
在这里插入图片描述

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

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

相关文章

Java 学习和实践笔记(48):怎样用二维数组来存储表格数据?

怎样用数组的方式,来存储下面这个表格的数据? 示例代码如下: import java.util.Arrays;public class Test001 {public static void main(String[] args) {/*object类对象是类层次结构的根。每个类都有Object作为超类。所有对象,包…

第17篇:七段数码管译码器

Q:之前我们设计实现的逻辑电路最终输出结果都是通过LED显示,本篇我们将实现用七段数码管来显示输出结果。 A:七段数码管显示基本原理:DE2-115开发板有8个共阳极数码管,即低电平逻辑值0点亮数码管段、逻辑值1来使数码管…

Docker Stack(堆栈) 部署多服务集群,多服务编排

1、Docker Stack简介 Docker Stack(堆栈) 是在 Swarm 上管理服务堆栈的工具。而在以前文章docker swarm集群搭建 介绍的 Docker Swarm 只能实现对单个服务的简单部署,于是就引出了Docker Stack。 上面我们介绍到 docker-compose:可以在一台机器上使用…

代码随想录算法训练营 DAY 21 | 230.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236.二叉树的最近公共祖先

230.二叉搜索树的最小绝对差 二叉搜索树,用中序遍历 用一个全局变量result存储最小绝对差,prev指针存储 在中的逻辑里去更新result(保证prev不为空),然后更新prevcur。 牢记谦虚遍历的顺序!pre紧跟在cu…

多层陶瓷电容器(MLCC)的基本结构与特点

多层陶瓷电容器(MLCC)是一种电子元件,用于存储电荷和调节电路中的电容值。它们由多个陶瓷层组成,每个层之间夹有金属电极,然后堆叠在一起,并在两端连接上导体引线,形成一个整体结构。在外部通常…

QML | JavaScript作用域和命名解析2

QML | JavaScript作用域和命名解析3.绑定的作用域对象 属性绑定是QML中最常见的JavaScript应用。属性绑定关联了一个JavaScript表达式的结果和对象的一个属性,该属性所归属的对象被称为绑定的作用域对象。在下面的代码中,Item对象就是一个绑定的作用域对象: ​ 绑定可以…

本地运行环境工具UPUPWANK(win)和Navicat数据库管理工具

UPUPWANK安装地址:https://www.upupw.net 1.进入UPUPWANK后点击一键开启 2.新增项目 这里请千万注意80端口,如果80端口被占用了,请记住去任务管理器关闭占用80端口的进程。不然就不会成功显示。(笔者含泪警告,一晚上的…

PostgreSQL技术大讲堂 - 第48讲:PG高可用实现keepalived

PostgreSQL从小白到专家,是从入门逐渐能力提升的一个系列教程,内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容,希望对热爱PG、学习PG的同学们有帮助,欢迎持续关注CUUG PG技术大讲堂。 第48讲&#…

javaSSM公司招聘管理系统IDEA开发mysql数据库web结构计算机java编程maven项目

一、源码特点 IDEA开发SSM公司招聘管理系统是一套完善的完整企业内部系统,结合SSM框架和bootstrap完成本系统,对理解JSP java编程开发语言有帮助系统采用SSM框架(MVC模式开发)MAVEN方式加 载,系统具有完整的源代码和…

设计模式深度解析:深入浅出的揭秘游标尺模式与迭代器模式的神秘面纱 ✨

​🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》 💪🏻 制定明确可量化的目标,坚持默默的做事。 深入浅出的揭秘游标尺模式与迭代器模式的神秘面纱 开篇: 欢迎来到设计模式的神秘…

最小割问题合集,最大权闭合图,最大密度子图,最小权点覆盖,最大权独立子图,OJ练习,代码详解

文章目录 零、回顾1、流网络的割2、最小割问题 一、最小割的应用1.1POJ1966 -- Cable TV Network1.1.1原题链接1.1.2思路分析1.1.3AC代码 1.2ZOJ 2676 Network Wars1.2.1原题链接1.2.2思路分析1.2.3AC代码 1.3OPTM - Optimal Marks1.3.1原题链接1.3.2思路分析1.3.3AC代码 二、最…

ApiPost设置多人协作

有时候一个项目会有多个人一起编写,每个人都有自己的接口,ApiPost提供了一个多人协作功能,可以在一个项目里加入多个成员,每个人新增的接口都可以在项目中看到,从而提高开发效率。 我这边用的是ApiPost7,首…

深入探讨iOS开发:从创建第一个iOS程序到纯代码实现全面解析

iOS开发作为移动应用开发的重要领域之一,对于开发人员具有重要意义。本文将深入探讨iOS开发的各个方面,从创建第一个iOS程序到纯代码实现iOS开发,带领读者全面了解iOS应用程序的开发流程和技术要点。 📱 第一个iOS程序 在创建第…

【蓝桥杯】tarjan算法

一.概述 Tarjan 算法是基于DFS的算法,用于求解图的连通性问题。 Tarjan 算法可以在线性时间内求出: 无向图: 割点与桥双连通分量 有向图: 强连通分量必经点与必经边 1.割点: 若从图中删除节点 x 以及所有与 x 关联的…

【c++】类和对象(四)深入了解拷贝构造函数

🔥个人主页:Quitecoder 🔥专栏:c笔记仓 朋友们大家好啊,本篇内容带大家深入了解拷贝构造函数 目录 1.拷贝构造函数1.1传值调用的无限调用1.2浅拷贝1.3深拷贝1.4深拷贝的实现 1.拷贝构造函数 拷贝构造函数是一种特殊的…

Java版企业电子招标采购系统源码——鸿鹄电子招投标系统的技术特点

在数字化时代,采购管理也正经历着前所未有的变革。全过程数字化采购管理成为了企业追求高效、透明和规范的关键。该系统通过Spring Cloud、Spring Boot2、Mybatis等先进技术,打造了从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通过…

【Java面试题】计算机网络

文章目录 1.计算机网络基础1.1网络分层模型/OSI七层模型是什么?1.2TCP/IP四层模型是什么?每一层的作用?1.2.1TCP四层模型?1.2.2为什么网络要分层? 1.2常见网络协议1.2.1应用层常见的协议1.2.2网络层常见的协议 2.HTTP2…

解决华为云服务器宝塔面板无法访问显示“此站点的连接不安全”问题

已经配置好安全组以及初始化宝塔面板,还是无法访问镜像管理页面,提示此站点的连接不安全。 解决方案 将地址https改为http即可进入。 成功登录后,开启面板SSL即可。

js实现拖放效果

dataTransfer对象 说明:dataTransfer对象用于从被拖动元素向放置目标传递字符串数据。因为这个对象是 event 的属性,所以在拖放事件的事件处理程序外部无法访问 dataTransfer。在事件处理程序内部,可以使用这个对象的属性和方法实现拖放功能…

科学认识并正确运用人工智能技术赋能国际传播

以下文章来源:学习时报 加强国际传播能力建设,全面提升国际传播效能,形成同我国综合国力和国际地位相匹配的话语权,已成为实现中国式现代化需要解决好的一个重大问题。文生视频模型Sora,是继ChatGPT之后又一推动传播智…