一生一芯 预学习阶段 NEMU代码学习(2)
接上回:一生一芯 预学习阶段 NEMU代码学习(1)
上次说到这里
static int cmd_c(char *args) {cpu_exec(-1);return 0;
}
当输入c时,会执行:cpu_exec(-1);
void cpu_exec(uint64_t n) {g_print_step = (n < MAX_INST_TO_PRINT);switch (nemu_state.state) {case NEMU_END: case NEMU_ABORT:printf("Program execution has ended. To restart the program, exit NEMU and run again.\n");return;default: nemu_state.state = NEMU_RUNNING;}uint64_t timer_start = get_time();execute(n);uint64_t timer_end = get_time();g_timer += timer_end - timer_start;switch (nemu_state.state) {case NEMU_RUNNING: nemu_state.state = NEMU_STOP; break;case NEMU_END: case NEMU_ABORT:Log("nemu: %s at pc = " FMT_WORD,(nemu_state.state == NEMU_ABORT ? ANSI_FMT("ABORT", ANSI_FG_RED) :(nemu_state.halt_ret == 0 ? ANSI_FMT("HIT GOOD TRAP", ANSI_FG_GREEN) :ANSI_FMT("HIT BAD TRAP", ANSI_FG_RED))),nemu_state.halt_pc);// fall throughcase NEMU_QUIT: statistic();}
}
g_print_step 是一个全局变量,用于控制是否逐步输出执行的指令信息;
如果要执行的指令数量 n 小于预定义的常量 MAX_INST_TO_PRINT,则将 g_print_step 置为 true,表示会逐步打印指令执行的过程。
uint64_t timer_start = get_time();
uint64_t timer_end = get_time();
get_time() 函数返回当前的时间,用于记录 CPU 执行开始的时间以及指令执行结束时的时间。
并将执行的时间差累加到全局变量 g_timer 中。
最后,根据执行完后的 nemu_state.state 状态值进行判断;
如果 nemu_state.state == NEMU_ABORT:说明程序处于 "中止" 状态,输出 "ABORT",并且使用 ANSI_FG_RED 红色格式化显示。
否则,检查 nemu_state.halt_ret:
如果 halt_ret == 0,表示程序正常终止(触发了 "GOOD TRAP"),输出 "HIT GOOD TRAP",并使用 ANSI_FG_GREEN 绿色显示。
如果 halt_ret != 0,表示程序遇到错误终止(触发了 "BAD TRAP"),输出 "HIT BAD TRAP",并使用 ANSI_FG_RED 红色显示。
再看(execute(n);):
static void execute(uint64_t n) {Decode s;for (;n > 0; n --) {exec_once(&s, cpu.pc);g_nr_guest_inst ++;trace_and_difftest(&s, cpu.pc);if (nemu_state.state != NEMU_RUNNING) break;IFDEF(CONFIG_DEVICE, device_update());}
}
这个 execute 函数的作用是在 NEMU 中执行模拟 CPU 的指令。它会循环执行传入的 n 条指令,并在每次执行后进行跟踪、差异测试和设备状态更新。
exec_once(&s, cpu.pc);
static void exec_once(Decode *s, vaddr_t pc) {s->pc = pc;s->snpc = pc;isa_exec_once(s);cpu.pc = s->dnpc;
#ifdef CONFIG_ITRACEchar *p = s->logbuf;p += snprintf(p, sizeof(s->logbuf), FMT_WORD ":", s->pc);int ilen = s->snpc - s->pc;int i;uint8_t *inst = (uint8_t *)&s->isa.inst.val;for (i = ilen - 1; i >= 0; i --) {p += snprintf(p, 4, " %02x", inst[i]);}int ilen_max = MUXDEF(CONFIG_ISA_x86, 8, 4);int space_len = ilen_max - ilen;if (space_len < 0) space_len = 0;space_len = space_len * 3 + 1;memset(p, ' ', space_len);p += space_len;#ifndef CONFIG_ISA_loongarch32rvoid disassemble(char *str, int size, uint64_t pc, uint8_t *code, int nbyte);disassemble(p, s->logbuf + sizeof(s->logbuf) - p,MUXDEF(CONFIG_ISA_x86, s->snpc, s->pc), (uint8_t *)&s->isa.inst.val, ilen);
#elsep[0] = '\0'; // the upstream llvm does not support loongarch32r
#endif
#endif
}
相关文章:
一生一芯 预学习阶段 NEMU代码学习(2)
接上回:一生一芯 预学习阶段 NEMU代码学习(1) 上次说到这里 static int cmd_c(char *args) {cpu_exec(-1);return 0; } 当输入c时,会执行:cpu_exec(-1); void cpu_exec(uint64_t n) {g_print_step (n < MAX_IN…...
《手写Spring渐进式源码实践》实践笔记(第二十章 实现简单ORM框架)
文章目录 第二十章 简单ORM框架实现背景技术背景基本概念工作原理优点缺点常见的ORM框架 业务背景 目标设计实现代码结构类图实现步骤 测试事先准备属性配置文件测试用例(selectOne)测试结果测试用例(selectList)测试结果 总结 第二十章 简单ORM框架实现 背景 技术背景 ORM&…...
AI技术赋能电商行业:创新应用与未来展望
💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《热点时事》 期待您的关注 引言 随着科技的飞速发展,人工智能(AI)技术正逐步渗透到各行各业&a…...
windows 11编译安装ffmpeg(包含ffplay)
一、源码及安装包下载 1.1,ffmpeg源码包下载 下载地址:Download FFmpeg 1.2,mysys下载 下载地址:MSYS2 1.3,libx264源码包下载 下载地址:x264, the best H.264/AVC encoder - VideoLAN 二、软件安装 2.1&…...
系统启动时将自动加载环境变量,并后台启动 MinIO、Nacos 和 Redis 服务
服务器信息 服务器 IP:192.168.1.44服务器用户:changzhou用户密码:XXXXXXXX Nacos 数据库用户信息: 账号:cz_nacos密码:XXXXXXXX Nacos 内网地址:http://192.168.1.44:8848/nacos 账号&#x…...
[ACTF2020 新生赛]Upload 1--详细解析
信息收集 题目告诉我们是一道upload,也就是文件上传漏洞题目。 进入界面,是一个灯泡,将鼠标放在图标上就会出现文件上传的相应位置: 思路 文件上传漏洞,先看看有没有前端校验。 在js源码中找到了前端校验ÿ…...
power bi中的related函数解析
在Power BI中,RELATED函数是一种用于检索相关表中数据的函数。它用于在一个表中检索与当前行相关联的另一个表中的数据。 销售成本 [销售数量]*related(商品表[进价])...
目前区块链服务商备案支持的区块链技术类型
status"success"data1-name"比特币/Bitcoin/BTC"3-name"以太坊/Ethereum/ETH"875-name"超级账本/Hyperledger"5-name"柚子/EOS/EOS"6-name"恒星链/Stellar/XLM"1055-name"Quorum"7-name"莱特币/Li…...
CatBoost中的预测偏移和排序提升
在 CatBoost 中,预测偏移(Prediction Shift) 和 排序提升(Ordered Boosting) 是其关键概念和创新点。CatBoost 通过引入 排序提升 解决了梯度提升决策树(GBDT)算法中常见的 预测偏移问题&#x…...
python: postgreSQL using psycopg2 or psycopg
psycopg2 # encoding: utf-8 # 版权所有 2024 ©涂聚文有限公司 # 許可資訊查看:言語成了邀功的功臣,還需要行爲每日來值班嗎? # 描述: pip install --upgrade pip PostgreSQL database adapter for Python # pip install…...
从 MySQL 5.7 到 8.0:理解 GROUP BY 的新规则与实战优化20241112
🎯 从 MySQL 5.7 到 8.0:理解 GROUP BY 的新规则与实战优化 🔎 引言 随着 MySQL 的不断升级,从 5.7 到 8.0,不仅性能得到提升,其对 SQL 标准的严格执行也显著提高。GROUP BY 的行为变化就是一个典型例子。…...
npm完整发包流程(亲测可验证)
1. 准备工作 (1) 在npm官网上注册一个账号 (2) 注册成功之后,npm会发送一封邮件给你,点击邮件里面的链接,做确认关联操作(必需) 2. 创建自己的npm包 (…...
学习threejs,使用JSON格式保存和加载模型
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE toJSON()方法 二、&a…...
中国首部《能源法》正式问世,它的亮点有哪些呢?
2024年11月8日,《中华人民共和国能源法》经十四届全国人大常委会第十二次会议审议通过,正式出台,将于明年1月1日起施行。 中国首部《能源法》正式问世,它的亮点有哪些呢? 一、填补立法空白,完善能源法律体…...
【外包】软件行业的原始形态,项目外包与独立开发者
【外包】互联网软件行业的原始形态,项目外包与独立开发者 本科期间写的一些东西,最近整理东西看到了,大致整理一下放出来,部分内容来自其他文章,均已引用。 文章目录 1、互联网软件行业的原始形态2、项目订单ÿ…...
工程数学线性代数(同济第七版)附册课后习题答案PDF
《线性代数附册 学习辅导与习题全解》是与同济大学数学科学学院编《工程数学 线性代数》第七版教材配套的教学辅导书,由同济大学作者团队根据教材内容和要求编写而成。本书在《工程数学 线性代数》第六版附册(即辅导书)的基础上修改而成。全书…...
【Ubuntu24.04】部署服务(基础)
目录 0 背景1 设置静态IP2 连接服务器3 部署服务3.1 安装JDK3.2 下载并安装MySQL8.43.2.1 从官网下载 APT Repository 配置文件3.2.2 安装 MySQL8.43.2.3 配置远程连接 3.3 下载并配置Redis3.4 上传jar包并部署应用3.5 开放端口 4 总结 0 背景 在成功安装了Ubuntu24.04操作系统…...
Linux符号使用记录
~ 账户 home 目录,如果是 root 账户就是 /root . 当前目录 .. 上层目录 | 管道符 & 后台工作,放在完整指令列的最后端,表示将该指令列放入后台中工作。 > 输出重定向,重新…...
初阶C++之C++入门基础
大家好!欢迎来到C篇学习,这篇文章的内容不会很难,为c的引入,c的重点内容将在第二篇的文章中讲解,届时难度会陡然上升,请做好准备! 我们先看网络上的一个梗:21天内⾃学精通C 好了&am…...
ODOO学习笔记(7):模块化架构(按需安装)
一、Odoo模块化架构概述 Odoo是一个功能强大的企业资源规划(ERP)系统,其模块化架构是它的核心优势之一。这种架构允许系统通过添加、移除或修改不同的模块来灵活地适应企业的各种业务需求。 核心模块与自定义模块: Odoo本身带有一…...
USB Cheat Sheet:从物理层到协议栈的终极解码指南
USB Cheat Sheet:从物理层到协议栈的终极解码指南 USB,这个我们每天都在使用的接口,背后隐藏着远超想象的复杂技术体系。从1996年USB 1.0的1.5Mbps,到如今USB4 Version 2.0的80Gbps,传输速率提升了超过五万倍。但更让人…...
3分钟学会Switch破解:TegraRcmGUI图形化注入工具完全指南
3分钟学会Switch破解:TegraRcmGUI图形化注入工具完全指南 【免费下载链接】TegraRcmGUI C GUI for TegraRcmSmash (Fuse Gele exploit for Nintendo Switch) 项目地址: https://gitcode.com/gh_mirrors/te/TegraRcmGUI TegraRcmGUI是一款专为Windows平台设计…...
Skelerealms:Godot开放世界的数据驱动架构解析
1. 这不是又一个“Godot RPG模板”,而是一套为开放世界量身定制的底层骨架我第一次在GitHub上看到Skelerealms这个仓库时,没点开README就直接关掉了——标题里带“RPG框架”“Godot”“开放世界”的项目,过去三年我至少扫过四十七个ÿ…...
Linux kernel目录、配置文件介绍
1. linux代码目录结构: kernel/ -------内核核心代码,进程调度相关模块 mm/------------内存管理子系统 fs/------------文件子系统 net/-----------不包含网络驱动的网络子系统 ipc/-----------进程间通信子系统 arch/----------体系架构相关代码 arch/…...
厂房分区控温需求,水冷空调按需布设灵活调配
在工业生产与商业运营中,高温作业环境长期困扰着企业和劳动者。一方面,传统中央空调的高昂安装与运营成本让大多数中小企业望而却步;另一方面,超大厂房、物流仓库、汽车制造车间等开放或半开放场景,难以实现完全密封&a…...
2026 AI搜索迭代下的获客革新:SEOGEO双引擎战略落地实战方案
2026 AI搜索迭代下的获客革新:SEO&GEO双引擎战略落地实战方案摘要:2026年生成式AI全面渗透搜索场景,传统关键词SEO流量遭遇结构性下滑,零点击搜索成为行业常态。本文以泉州本地中小企业数字化服务场景为依托,深度剖…...
脉冲相机与NeRF结合的高速场景三维重建技术
1. 高速场景重建的技术挑战与解决方案在计算机视觉领域,高速场景的三维重建一直是个棘手的问题。传统RGB相机受限于曝光时间和帧率,在拍摄快速运动物体时会产生严重的运动模糊。这种模糊不仅影响视觉效果,更会破坏三维重建所需的几何和纹理信…...
HarmonyOS ArkUI实战:从零构建购物社交应用UI界面
1. 项目概述与核心价值如果你正在学习HarmonyOS应用开发,或者已经从其他移动端框架(如Android、Flutter)转过来,那么构建一个美观、交互流畅的UI界面,往往是上手实践的第一步,也是最直观检验学习成果的一步…...
ngx_http_set_virtual_server
1 定义 ngx_http_set_virtual_server 函数 定义在 ./nginx-1.24.0/src/http/ngx_http_request.cstatic ngx_int_t ngx_http_set_virtual_server(ngx_http_request_t *r, ngx_str_t *host) {ngx_int_t rc;ngx_http_connection_t *hc;ngx_http_core_loc_con…...
抖音无水印下载终极指南:douyin-downloader让你轻松保存喜欢的视频
抖音无水印下载终极指南:douyin-downloader让你轻松保存喜欢的视频 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fa…...
