auipc指令在NEMU中的执行过程 - Zeeh

news/2025/10/16 12:26:42/文章来源:https://www.cnblogs.com/Zeeh-Lin/p/19145313

假设

  1. 指令集为RV64I

  2. 内存地址开始于0x8000 0000

  3. 使用如下的代码:

    static const uint32_t img [] = {0x00000297,  // auipc t0,00x00028823,  // sb  zero,16(t0)0x0102c503,  // lbu a0,16(t0)0x00100073,  // ebreak (used as nemu_trap)0xdeadbeef,  // some data
    };
    
  4. Decode的定义如下

    typedef struct Decode {uint64_t pc;uint64_t snpc; // static next pcuint64_t dnpc; // dynamic next pcstruct {uint32_t inst;} isa;
    } Decode;
    
  5. cpu.pc初始值为0x8000 0000

  6. 从调用exec_once()并开始执行auipc开始考虑

  7. 忽略trace和difftest相关的操作

exec_once(&s, cpu.pc);

调用exec_once(&s, cpu.pc),当前cpu.pc值为0x8000 0000

进入exec_once()后,更新s

s->pc = 0x80000000;
s->snpc = 0x80000000;

调用isa_exec_once(s)

isa_exec_once(s)

利用inst_fetch(&s->snpc, 4)更新sinst_fetch返回snpc对应的指令地址(uint32_t类型),并且更新snpc为下一条指令所在地址(s->snpc += 4, 即0x8000 0004)。
更新后的s:

s->pc = 0x80000000;
s->snpc = 0x80000004;
s->isa.inst = 0x80000000;

之后执行decode_exec(s)并将其结果返回.

decode_exec(s)

更新s->dnpc = s->snpc, 此时s:

s->pc = 0x80000000;
s->snpc = 0x80000004;
s->dnpc = 0x80000004;
s->isa.inst = 0x80000000;

定义标签地址, 用于之后跳转:

const void * __instpat_end = &&__instpat_end_;

指令匹配:

INSTPAT("??????? ????? ????? ??? ????? 00101 11", auipc  , U, R(rd) = s->pc + imm);
INSTPAT("??????? ????? ????? 100 ????? 00000 11", lbu    , I, R(rd) = Mr(src1 + imm, 1));
INSTPAT("??????? ????? ????? 000 ????? 01000 11", sb     , S, Mw(src1 + imm, 1, src2));INSTPAT("0000000 00001 00000 000 00000 11100 11", ebreak , N, NEMUTRAP(s->pc, R(10))); // R(10) is $a0
INSTPAT("??????? ????? ????? ??? ????? ????? ??", inv    , N, INV(s->pc));

INSTPAT() 指令匹配宏

宏展开后, 匹配成功第一条规则:

do {uint64_t key, mask, shift;pattern_decode("??????? ????? ????? ??? ????? 00101 11",(sizeof("??????? ????? ????? ??? ????? 00101 11") - 1), &key, &mask, &shift);if ((((uint64_t)((s)->isa.inst) >> shift) & mask) == key) {{int rd = 0;word_t src1 = 0, src2 = 0, imm = 0;decode_operand(s, &rd, &src1, &src2, &imm, TYPE_U);(cpu.gpr[check_reg_idx(rd)]) = s->pc + imm ;};goto *(__instpat_end);}} while (0)

其中(sizeof("??????? ????? ????? ??? ????? 00101 11") - 1) == 38

pattern_decode() 解码宏

进入pattern_decode()宏后, 定义临时变量uint64_t __key = 0, __mask = 0, __shift = 0;. 之后pattern_decode() 会利用辅助宏macro(i).
macro(i)中:

  1. str[i]'1', __key左移并且低位补1; 若不是, __key左移并且低位补0;
  2. str[i]'?', __mask左移并且低位补0;
    若不是, __mask左移并且低位补1
  3. str[i]'?', __shift加1, 否则立刻清0

通过:

#define macro2(i)  macro(i);   macro((i) + 1)
#define macro4(i)  macro2(i);  macro2((i) + 2)
#define macro8(i)  macro4(i);  macro4((i) + 4)
#define macro16(i) macro8(i);  macro8((i) + 8)
#define macro32(i) macro16(i); macro16((i) + 16)
#define macro64(i) macro32(i); macro32((i) + 32)macro64(0);

处理指令掩码中的38个字符.
本例中, __key最终为0010111, __mask最终为000...00(共25个0)1111111, __shift最终为0
跳转到finish标签后执行:

finish:*key = __key >> __shift;*mask = __mask >> __shift;*shift = __shift;

然后退出pattern_decode()宏, 进入INSTPAT宏的:

if ((((uint64_t)INSTPAT_INST(s) >> shift) & mask) == key) { \
INSTPAT_MATCH(s, ##__VA_ARGS__); \
goto *(__instpat_end); \
} \

(uint64_t)INSTPAT_INST(s)即执行的指令inst. inst被右移shift位, 然后和mask按位与, 判断是否和key完全相等
如果相等, 则执行:

INSTPAT_MATCH(s, ##__VA_ARGS__); \
goto *(__instpat_end); \

ISNT_MATCH() 执行指令宏

在这个宏里, 会利用decode_operand()函数来译码出rd, src, src2, imm. 然后执行__VA_ARGS__ ;. __VA_ARGS__就是在INSTPAT()中传入的指令的具体操作. 对于auipc这条指令, __VA_ARGS就是R(rd) = s->pc + imm.

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

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

相关文章

如何在AutoCAD中进行GIS空间查询?

借助GIS4CAD插件,可以在AutoCAD中像ArcGIS一样对图形数据进行空间查询,通过图层间的相交或包含关系,可以根据条件将符合要求的图形快速选中。这样可以快速筛选出符合特定空间位置条件的图形元素,显著提升CAD数据处…

initContainers实现整个数据目录的挂载

在部署mysql、oracle、tomcat测试时,面对配置文件非常多的情况下一个个挂载配置文件会显得非常麻烦,这时就可以通过将服务的整个数据目录给挂载下来,以方便修改配置和数据,但是因为服务需要初始化,直接挂载目录会…

消息队列常见问题克服(偏kafka)—顺序消费、消息积压、消息丢失、消息积压、分布式事务

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年屋脊通风天窗厂家最新权威推荐榜:工业厂房自然通风解决方案优选品牌

2025年屋脊通风天窗厂家最新权威推荐榜:工业厂房自然通风解决方案优选品牌随着工业建筑节能环保要求的不断提高,屋脊通风天窗作为工业厂房自然通风系统的核心设备,其技术性能与产品质量日益受到行业重视。在碳中和目…

学霸的期末 解题报告

简要题意 给定 \(n\) 个点 \(m\) 条边的有向图,在不改变图的连通性的前提下,删除任意条边后,最少可以保留多少条边;和任意加边后,最多可以包含多少条边。 数据范围:\(nm \le 5 \times 10 ^7,n \le 10^3,m\le 10^…

一种适用于正整数值域的无旋平衡树

介绍 如题,这是一种适用于正整数值域的平衡树。其主要特点如下:不带旋常数小实现简单,好理解与此同时,该算法具有以下局限性:只适用于正整数值域时间复杂度依赖于值域大小似乎只能解决传统平衡树问题目前暂不清楚…

详细介绍:FPGA实现SRIO图像视频传输,基于Serial Rapidlo Gen2,提供6套工程源码和技术支持

详细介绍:FPGA实现SRIO图像视频传输,基于Serial Rapidlo Gen2,提供6套工程源码和技术支持pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !impor…

2025 年电子散热器厂家 TOP 企业品牌推荐排行榜,电子 / 型材 / 插片 / 电源 / 固态 / 变频器 / 铝合金 / 逆变器散热器 / 散热器铝型材公司推荐

2025 年电子散热器行业迎来规模突破千亿元的增长周期,但市场竞争与发展挑战并存。受全球能源结构调整与电子设备功耗上升驱动,行业对散热效率的要求持续提高,而新国标将热阻值门槛提高 20%,进一步加剧了行业压力。…

禁用sentinel

禁用sentinel在配置文件(如application.properties)中增加配置:spring.cloud.sentinel.enabled=falsespring: cloud:sentinel:enabled: false

LobeHub

LobeHubLobeHub - LobeChat:个人 LLM 效能工具,超越 ChatGPT / OLLaMA 使用体验 漫思

[temporary] Arkady and rectangles

#include<bits/stdc++.h> using namespace std; typedef long long LL; const LL N=1e5+10,LG=18,inf=1e8; LL n,o[N]; struct Mat { LL a,b,c,d; }tk[N]; struct Miku {LL bin[N*2],tot;void ins(LL x) { bin[+…

跨境电商智能选品的未来:从经验到算法的革命

跨境电商智能选品的未来:从经验到算法的革命在全球化贸易和数字经济的浪潮中,跨境电商正在以前所未有的速度发展。无论是 亚马逊(Amazon)、TikTok Shop,还是 Shopee、Temu 等平台,都在不断拓展新的市场空间。然而…

静态网站宣言:用IPFS重建开放网络的乐趣

本文探讨了基于IPFS构建静态网站的技术优势,包括内容寻址、版本控制和去中心化存储。通过Orbiter平台案例,展示了如何简化现代网站部署流程,让Web开发重新变得简单高效。静态网站宣言 | IPFS 博客与新闻 构建网站曾…

收敛数列的性质

唯一性 若 \(x_n\) 收敛,则极限唯一。 有界性若 \(x_n\) 收敛,则 \(x_n\) 有界。 若 \(x_n\) 无界,则 \(x_n\) 一定发散。 若 \(x_n\) 有界,则 \(x_n\) 不一定收敛。保号性 \(\lim_{n\rightarrow \infty}x_n=a,a&g…

Eclipse Mosquitto MQTT 代理中持久性引擎(database.c 概念)的作用分析报告 - 指南

Eclipse Mosquitto MQTT 代理中持久性引擎(database.c 概念)的作用分析报告 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; f…

详细介绍:macOS 下安装 zsh、zsh-syntax-highlighting、powerlevel9k、nerd-font

详细介绍:macOS 下安装 zsh、zsh-syntax-highlighting、powerlevel9k、nerd-fontpre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font…

AWS | Linux 硬盘挂载综合教程 - 实践

AWS | Linux 硬盘挂载综合教程 - 实践2025-10-16 11:55 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !i…

FFmpeg 实现视频批量剪辑

随着课程视频的增多,需要转化几个百视频,常规操作方式已经无法满足要求了,需要实现视频自动化剪辑。 前提条件 视频剪辑功能,均使用 FFmpeg 工具完成https://ffmpeg.org/FFmpeg 是一个用来做视频处理的开源工具,支…

2023盘古石 物联网取证部分

2023盘古石 物联网取证部分物联网取证 1、分析扫地机器人数据,robot1.bin采用的压缩算法是?[答案格式:xxxx] binwalk分析,采用的是LZMA压缩算法2、扫地机器人使用的软件版本是?[答案格式:0.0.0][★★☆☆☆☆] 010…

2025 年自润滑轴承厂家联系方式推荐,宁波索力特复合材料有限公司专业产品与可靠服务指南

在当前工业制造领域不断升级的背景下,机械设备对核心零部件的性能要求愈发严苛,尤其是自润滑轴承这类关键部件,其质量与稳定性直接关系到设备的运行效率和使用寿命。随着工程机械、医疗机械、新能源、航空航天等行业…