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.mzph.cn/news/773980.shtml

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

相关文章

DCS系统在工业场合中的功能是什么?为你揭秘常见DCS系统的应用场景

一.DCS系统的功能和应用 DCS系统的主要功能包括数据采集和处理、监控和报警、控制和调节、历史数据记录和趋势分析等。通过这些功能,DCS系统可以实现自动化控制、优化生产过程、提高生产效率和质量等目标。DCS系统广泛应用于各个行业,如化工、电力、制药…

【爬虫基础】第2讲 使用Urllib库创建第一个爬虫程序

Urllib 是 Python 的标准库,它提供了一系列用于处理 URL 的函数和类,包括发送 HTTP 请求、处理 HTTP 响应、解析 URL 等功能。可以使用 urllib 来编写简单的网络爬虫。 request:它是最基本的HTTP请求模块,可以用来模拟发送请求。只…

大学教材《C语言程序设计》(浙大版)课后习题解析 | 第三、四章

概述 本文主要提供《C语言程序设计》(浙大版) 第三、四章的课后习题解析,以方便同学们完成题目后作为参考对照。后续将更新第五、六章节课后习题解析,如想了解更多,请持续关注该专栏。 专栏直达链接:《C语言程序设计》(浙大版)_孟…

R折线图(自备)

目录 折线图基础 创建散点和折线图 复杂折现加图例 折线图柱状图 数据处理 进行差异检验 基础绘图折线 基础绘图箱线 进行合并 双轴柱状与折线图 数据 折线图基础 创建散点和折线图 rm(list ls()) opar <-par(no.readonlyTRUE)##自带orange数据集 par(mfrowc…

鸿蒙(HarmonyOS)Navigation如何实现多场景UI适配?

场景介绍 应用在不同屏幕大小的设备上运行时&#xff0c;往往有不同的UI适配&#xff0c;以聊天应用举例&#xff1a; 在窄屏设备上&#xff0c;联系人和聊天区在多窗口中体现。在宽屏设备上&#xff0c;联系人和聊天区在同一窗口体现。 要做好适配&#xff0c;往往需要开发…

DevStack 部署 OpenStack 多节点

DevStack 部署 OpenStack 多节点 DevStack 支持OpenStack多节点部署&#xff0c;下面以一个控制节点和一个计算节点为例&#xff0c;介绍多节点多网卡部署流程。 官方文档&#xff1a; https://docs.openstack.org/devstack/latest/guides/multinode-lab.html https://docs…

探秘 RabbitMQ 的设计理念与核心技术要点

目录 一、消息中间件介绍 1.1 消息中间件的作用 二、RabbitMQ 2.1 核心概念 2.2 生产者发送消息过程 2.3 消费者接收消息过程 2.4 RabbitMQ 为何要引入信道(channel) 2.5 消费模式 一、消息中间件介绍 消息队列中间件&#xff08;message queue middleWare, MQ&#xff09;指…

刷题之贪心3

前言 大家好&#xff0c;我是jiantaoyab&#xff0c;这篇文章将给大家介绍贪心算法和贪心算法题目的练习和解析&#xff0c;贪心算法的本质就是每一个阶段都是局部最优&#xff0c;从而实现全局最优。加上这篇文章一共有30道贪心题目了&#xff0c;加油! 坏了的计算器 题目分析…

【学习】软件测试行业有哪些从业方向

从事任何一个行业&#xff0c;不论想入行的新人还是已经在职的从业人员&#xff0c;一定要系统化的掌握自身的学习路线和发展方向&#xff0c;随时对自身的优劣点掌握清楚。尤其是对于软件测试这个岗位。测试职业所涉及的技能范围比较广&#xff0c;测试流程、测试计划、缺陷管…

考研数学|《1800》《1000》《880》《660》最佳搭配使用方法

直接说结论&#xff1a;基础不好先做1800、强化之前660&#xff0c;强化可选880/1000题。 首先&#xff0c;传统习题册存在的一个问题是题量较大&#xff0c;但难度波动较大。《汤家凤1800》和《张宇1000》题量庞大&#xff0c;但有些题目难度不够平衡&#xff0c;有些过于简单…

财务收支系统怎么做,财务收支记账软件管理系统教程

财务收支系统怎么做&#xff0c;财务收支记账软件管理系统教程 一、前言 以下软件操作教程以 佳易王财务收支记账软件V17.0为例说明 件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 财务收支记账管理系统软件可按需定制 1、权限设置&#xff1a;管理员账…

【Java程序设计】【C00345】基于Springboot的船舶监造管理系统(有论文)

基于Springboot的船舶监造管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 项目获取 &#x1f345;文末点击卡片获取源码&#x1f345; 开发环境 运行环境&#xff1a;推荐jdk1.8&#xff1b; 开发工具&#xff1a;eclipse以及i…

第四届数字信号与计算机通信国际学术会议(DSCC 2024)

#高录用&#xff0c;稳检索# #高校背书&#xff0c;更可靠# DSCC 2024已通过SPIE出版社审核&#xff0c;ISSN号已确定&#xff1a;ISSN: 0277-786X&#xff0c;往届均已见刊EI检索&#xff01; 第四届数字信号与计算机通信国际学术会议&#xff08;DSCC 2024&#xff09; 2024 …

智慧校园数据可视化有什么好处?怎么推进数字化校园方案?

在当今数字化时代&#xff0c;越来越多学校开始实施智慧校园计划&#xff0c;旨在为学生和教师提供更高效、便捷的学习和教学环境。智慧校园运用互联网、大数据、人工智能等技术&#xff0c;对校园内各信息进行收集、整合、分析和应用&#xff0c;实现教学、管理、服务等多方面…

python和Vue开发的RBAC用户角色权限管理系统

后端框架&#xff1a;python的FastAPI作为后端服务和python-jose作为JWT认证 前端框架&#xff1a;Vue3构建页面和Vue Router作为路由管理&#xff0c;Pinia作为数据存储&#xff0c;Vite作为打包工具 可以实现菜单控制和路由控制&#xff0c;页面里面有按钮权限控制&#xf…

java解决跨域问题

浏览器js在访问服务器中的资源时&#xff0c;会出现同一页面或者不同域名(协议&#xff0c;IP&#xff0c;端口)不可访问 例如:file://d://test.html页面(file协议)中通过ajax访问服务器api.test.com的接口(http协议)&#xff0c;由于协议不同&#xff0c;此时会出现浏览器访问…

相对全面的四足机器人驱动规划MATLAB和Simulink实现方式(足端摆线规划,Hopf-CPG,Kimura-CPG)

许久没更新四足机器人相关的博客文章&#xff0c;由于去年一整年都在干各种各样的~活&#xff0c;终于把硕士毕业论文给写好&#xff0c;才有点时间更新自己的所学和感悟。步态规划和足端规划只是为了在运动学层面获取四足机器人各关节的期望角位移和速度信号&#xff0c;再由底…

Nacos部署(二)Linux部署Nacos2.3.x集群环境

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; Nacos部署&#xff08;二&#xff09;Linux部署Nacos2.3.x集群环境 ⏱️…

Xshell连接虚拟机非常慢

问题&#xff1a; 打开虚拟机连接时发现过了几分钟依然卡着在&#xff0c;但是主机可以ping通虚拟机&#xff0c;虚拟机也可以ping通主机感觉很奇怪&#xff0c;查询后得知需要修改ssh设置 打开配置 vim /etc/ssh/sshd_config 修改配置 找到 UseDNS&#xff0c;去掉前面的#号…

React中 类组件 与 函数组件 的区别

类组件 与 函数组件 的区别 1. 类组件2. 函数组件HookuseStateuseEffectuseCallbackuseMemouseContextuseRef 3. 函数组件与类组件的区别3.1 表面差异3.2 最大不同原因 1. 类组件 在React中&#xff0c;类组件就是基于ES6语法&#xff0c;通过继承 React.component 得到的组件…