NEMU PA 2-3 实验报告
一、实验目的
- 了解ELF符号表的解析
- 进一步完善调试器的功能,理解编译器的设计原理
二、实验步骤
在PA2-1中实现了CPU对指令的解码和执行,在PA2-2中实现了由kernel对ELF文件的程序头表解析以及装载(并且谨记kernel编译出来的指令也是由2-1的CPU来解码的!)。在PA2-3中,我们将要实现对NEMU调试器的完善。例如:给定一个符号(如,全局变量)的名字,返回其在内存中的值。

首先,我们需要了解我们应该怎么去对ELF文件中的符号表和字符串表进行解析。逻辑如下:

其代码位于nemu/src/monitor/elf.c,里面的函数作用是获取解析出来的值,这可以相当于一个个封装好的接口让我们在后面办成对调试器的完善。
对调试器的完善的代码位于nemu/src/monitor/ui.c。
先别急着去写代码,我知道你很急但你先别急。我们先来看看NEMU的启动过程:
首先我们进入了
/nemu/src/中的main.c,这是整个虚拟机的入口。我们来看NEMU的启动命令,参数的输入决定了文件的装载:

single_run函数是怎么处理这参数的呢:
可以看到参数被输入了
load_exec。文件的装载是靠load_exec函数来实现的,装载的关键在于fread的调用(自己去查查fread())。这就解释了ELF文件和kernel.img的去向,是什么时候被装进去的:

接下来我们就继续走进位于
nemu/src/monitor/ui.c的ui_mainloop函数,这个看注释的意思就是这个函数会给你提供NEMU内建的基于字符串界面(CLI)的调试器,让你运行NEMU的时候输入参数来决定NEMU的走向,即调用不同种类的cmd_handler(有一个cmd_table,自己去看源码)

因为我们一开始的参数有一个
--autorun,所以我们在cmd_handler中就进入了cmd_c中,开始不断的执行:

然后我们就来到
nemu/src/cpu/cpu.c中的exec函数了。
好,我们到这里已经理解了NEMU的启动过程,以及这个CLI调试界面是如何工作的。现在我们就要在此之上加上自己的完善,即表达式的求值功能,主要有几个步骤:
实现表达式的词法分析
- 为算术表达式中的各种
token类型添加规则 - 在成功识别出
token后, 将token的信息依次记录到tokens数组中.
- 为算术表达式中的各种
实现表达式的递归求值
- 使用BNF完成递归求值。
添加变量和函数名支持
- 通过符号表建立变量名和其地址之间的映射关系。
完成后的调试器的功能如下:
| 命令 | 格式 | 使用举例 | 说明 |
|---|---|---|---|
| 帮助 | help | help | 打印帮助信息 |
| 继续运行 | c | c | 继续运行被暂停的程序 |
| 退出 | q | q | 退出当前正在运行的程序 |
| 单步执行 | si [N] | si 10 | 单步执行N条指令,N缺省为1 |
| 打印程序状态 | info <r/w> | info r info w | 打印寄存器状态 打印监视点信息 |
| 表达式求值 | p EXPR | p $eax + 1 | 求出表达式EXPR的值(EXPR中可以出现数字,0x开头的十六进制数字,$开头的寄存器,*开头的指针解引用,括号对,和算术运算符) |
| 扫描内存 | x N EXPR | x 10 0x10000 | 以表达式EXPR的值为起始地址,以十六进制形式连续输出N个4字节 |
| 设置监视点 | w EXPR | w *0x2000 | 当表达式EXPR的值发生变化时,暂停程序运行 |
| 设置断点 | b EXPR | b main | 在EXPR处设置断点。除此以外,框架代码还提供了宏BREAK_POINT,可以插入到用户程序中,起到断点的作用 |
| 删除监视点或断点 | d N | d 2 | 删除第N号监视点或断点 |
NEMU PA 2-3 实验报告的更多相关文章
- ucoreOS_lab3 实验报告
所有的实验报告将会在 Github 同步更新,更多内容请移步至Github:https://github.com/AngelKitty/review_the_national_post-graduat ...
- ucoreOS_lab2 实验报告
所有的实验报告将会在 Github 同步更新,更多内容请移步至Github:https://github.com/AngelKitty/review_the_national_post-graduat ...
- JAVA实验报告及第七周总结
JAVA第六周作业 实验报告五 第一题 1.设计一个类层次,定义一个抽象类--形状,其中包括有求形状的面积的抽象方法. 继承该抽象类定义三角型.矩形.圆. 分别创建一个三角形.矩形.圆存对象,将各类图 ...
- 第五次java实验报告
Java实验报告 班级 计科二班 学号 20188437 姓名 何磊 完成时间2019/10/10 评分等级 实验四 类的继承 实验目的 理解抽象类与接口的使用: 了解包的作用,掌握包的设计方法. 实 ...
- 第七周总结&第五次实验报告
学习总结 这周我们加深了对抽象类与接口的学习,获得的知识点也比上周多了许多,抽象类与接口很相似,就比如别人还没有做完的是交给你来做,而他那些样式都做好了,你只需要完善即可 但也有不同点. 区别点 抽象 ...
- 第七周课程总结 & 实验报告(五)
第七周课程总结 一.抽象类与接口的应用 1.实例化 2.实际应用 ---模板设计(抽象类) ---制定标准(接口) 3.设计模式 ---工厂设计 ---代理设计 ---适配器设计 二.抽象类与接口之间 ...
- 第七周&实验报告五
实验四 类的继承 •实验目的 •理解抽象类与接口的使用: •了解包的作用,掌握包的设计方法. •实验要求 •掌握使用抽象类的方法. •掌握使用系统接口的技术和创建自定义接口的方法. •了解 Java ...
- 2019JAVA第五次实验报告
Java实验报告 班级 计科二班 学号 20188442 姓名 吴怡君 完成时间2019/10/11 评分等级 实验四 类的继承 实验目的 理解抽象类与接口的使用: 了解包的作用,掌握包的设计方法. ...
- 实验报告5&第七周课程总结
实验四 类的继承 实验目的 理解抽象类与接口的使用: 了解包的作用,掌握包的设计方法. 实验要求 掌握使用抽象类的方法. 掌握使用系统接口的技术和创建自定义接口的方法. 了解 Java 系统包的结构. ...
- 北京电子科技学院(BESTI)实验报告5
北京电子科技学院(BESTI)实验报告5 课程: 信息安全系统设计基础 班级:1452.1453 姓名:(按贡献大小排名) 郑凯杰.周恩德 学号:(按贡献大小排名) 20145314.20145217 ...
随机推荐
- gitee 创建代码仓库,并提交本地代码
本文为博主原创,转载请注明出处: 1. 配置本地 gitee 的配置: git config --global user.name "xiangBaxiang" git confi ...
- mysql之力扣数据库题目620有趣的电影优化记录
闲着没事儿刷刷力扣的数据库题目,题目编号620:有趣的电影,下面是题目描述: 优化前的sql及执行时间: 优化后的sql及执行时间: 这里对筛选条件进行了优化: 1.select * 的查找效率要比逐 ...
- Angular系列教程之管道
.markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...
- 在Windows 版的Chrome中切换标签页
按住Ctrl+tab键之后使用page up/ page down键左右移动!
- Redis-逻辑库-select
- 代码使我头疼之React初学习
前言 开始了,去年(2020)说要学的React,到现在2021年的12月底了,才来实施--(年底警告!年末总结还没开始写!) 不过前端为啥要学React呢?Vue不是很好用吗?Vue确实很好用,并且 ...
- Net Core中使用EF Core连接Mysql数据库
Entity Framework Core的前身是微软提供并主推的ORM框架,简称EF,其底层是对ADO.NET的封装.EF支持SQLServer.MYSQL.Oracle.Sqlite等所有主流数据 ...
- [转帖]给我一分钟,让你彻底明白MySQL聚簇索引和非聚簇索引
https://zhuanlan.zhihu.com/p/142139541 MySQL的InnoDB索引数据结构是B+树,主键索引叶子节点的值存储的就是MySQL的数据行,普通索引的叶子节点的值存储 ...
- [转帖]Linux系统安装之后,如何调节CPU性能策略
https://baize.cc/posts/efc.html#:~:text=Linux%E7%B3%BB%E7%BB%9F%E5%AE%89%E8%A3%85%E4%B9%8B%E5%90%8E% ...
- [转帖] Linux命令拾遗-入门篇
https://www.cnblogs.com/codelogs/p/16060394.html 原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介# 之前出过很多和 ...