TinyEMU源码分析之启动流程

news2024/11/17 14:42:45

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(;;) {
		// 获取PC
		s->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.coloradmin.cn/o/1548451.html

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

相关文章

夜晚水闸3D可视化:科技魔法点亮水利新纪元

在宁静的夜晚,当城市的霓虹灯逐渐暗淡,你是否曾想过,那些默默守护着城市安全的水闸,在科技的魔力下,正焕发出别样的光彩?今天,就让我们一起走进夜晚水闸3D模型,感受科技为水利带来的…

AI足球教练上岗利物浦,射门机会提高13%!来自DeepMind,网友:这不公平

梦晨 发自 凹非寺 量子位 | 公众号 QbitAI AI足球教练登上Nature子刊,谷歌DeepMind与利物浦队合作三年打造: 如同AlphaGo颠覆围棋一样,改变了球队制定战术的方式。 像是进攻方把球传给谁更容易创造射门机会,防守方如何调整布阵……

【双指针】Leetcode 四数之和

题目解析 18. 四数之和 这道题的思路和三数之和的思路相同,都是固定一个数,然后在剩下的区间中寻找和为目标值的元组,其次最重要的是要进行去重 算法讲解 1. 完成排序 2. 固定一个数,求剩下区间中三元组的和等于 target - nums[…

用易查分制作承诺书签订,在线手写签名,一键导出打印

假期将至,为积极落实安全管理规定,单位通常需要下发安全承诺书进行签字确认。 易查分可以实现网上下发安全承诺书通知,让查询者进行签名确认,还可以生成PDF,方便打印一人一张的纸质版承诺书,本次就来介绍如…

flask各种版本的项目,终端命令运行方式的实现

目录 写在前面 一、Flask项目的基本结构 二、使用终端命令运行Flask项目 1. 安装Flask 2. 创建Flask应用 3. 配置FLASK_APP环境变量 4. 运行Flask应用 5. 访问Flask应用 三、Flask CLI的其他功能 1. 创建Flask应用 2. 运行开发服务器 3. 清理缓存文件 4. 运行单元…

补题集合2

VJ 409组队赛2 C - Find a Number 没想到这是一个签到题,因为数据量小,状态并不多,所以可以使用 b f s bfs bfs 去跑每一个状态。令 m o d mod mod 是余数, s u m sum sum 是累加和,那么状态最多就只有 500 ∗ 5…

微信小程序的页面交互1

一、page()函数 每个页面的s代码全部写入对应的js文件的page()函数里面。点击编译,就可以显示js代码的运行效果。注意,每个页面的page()函数是唯一的。 page(&#xff…

Oracle参数文件详解

1、参数文件的作用 参数文件用于存放实例所需要的初始化参数,因为多数初始化参数都具有默认值,所以参数文件实际存放了非默认的初始化参数。 2、参数文件类型 1)服务端参数文件,又称为 spfile 二进制的文件,命名规则…

【CSDN活动】程序员职业生涯的分水岭:年龄还是经验?

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 程序员职业生涯的分水岭:年龄还是经验?引言技术更新换代…

Vue3中使用paper.js

目录 Paper.js的使用安装Paper引入Paper.js创建画布实例化Paper、Project以及Tool画圆画点和线画矩形导入图片画文字Item组曲线监听键盘事件监听鼠标事件设置动画下载成图片完整代码 Paper.js的使用 安装Paper npm install paper引入Paper.js import * as Paper from "p…

arduino 2.0以上版本上传项目data目录内文件到ESP8266闪存中

开发测试环境: arduino IDE : 2.3.2 开发板 ESP8266 系统:WINDOWS 10 截止目前,arduino版本为2.3.2,在开发项目的时候,发现一个问题,就是项目目录中data内的文件没有办法和主文件.ino一同上传到ESP8266的f…

学习笔记:MYSQL数据库基础知识

MYSQL数据库基础知识学习笔记 MYSQL基础学习数据库相关概念现主流数据库排名数据模型SQL分类SQL数据库基础操作 2024/3/27 学习资料:黑马程序员:MYSQL MYSQL基础学习 数据库和数据库管理系统(DBMS) 数据库: 是存储数据的集合,包括表、视图、索引等对象…

面试八股文之JAVA基础

JAVA基础 DNS、CDN?如何实现对象克隆?父子类静态代码块, 非静态代码块, 构造方法执行顺序?String s new String("abc") 创建了几个对象, 分别放到哪里?OSI网络模型七层?应用层协议?http协议和https协议区别?传输层协…

STM32学习笔记(7_1)- ADC模数转换器

无人问津也好,技不如人也罢,都应静下心来,去做该做的事。 最近在学STM32,所以也开贴记录一下主要内容,省的过目即忘。视频教程为江科大(改名江协科技),网站jiangxiekeji.com 本期开…

QGIS开发笔记(一):QGIS介绍、软件下载和加载shp地图数据Demo

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/136888334 红胖子网络科技博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

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

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

【Python】进阶学习:pandas--describe()函数的使用介绍

🐍【Python】进阶学习:pandas——describe()函数的使用介绍 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&am…

抖音弹幕游戏开发:打造全新互动体验,引领潮流风尚

在数字科技迅猛发展的时代,抖音作为一款领先的短视频平台,始终走在创新的前沿。为了满足用户日益增长的互动需求,我们投入大量研发力量,成功推出了抖音弹幕游戏开发项目,旨在为用户带来一种全新的、沉浸式的互动体验。…

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

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

Alpha律所管理系统,助力律师团队管理提效再升级

律师团队管理,是律所成长与发展经久不衰的议题。无论是律所的创办还是扩张,管理者首先要考虑的就是管理模式的选择与更新问题,这几乎成为一个律所能否长远发展的关键“七寸”。那么,到底为什么团队管理如此重要,做好管…