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 ...
随机推荐
- 机器学习-决策树系列-决策树-ID3算法 -C4.5算法-26
目录 1. 决策树 2. 举个例子 计算信息增益 3. C4.5算法 1. 决策树 决策树是属于有监督机器学习的一种,起源非常早,符合直觉并且非常直观, 模型生成:通过大量数据生成一颗非常好的树,用这 ...
- Clock Domain Crossing
Clock Domain Crossing CDC问题主要有亚稳态问题,多比特信号同步,握手信号同步,异步Fifo等 Topics Describe the SoC Design Issues Und ...
- Oracle索引&约束
Oracle索引&约束 1索引的原理 索引是一种允许直接访问数据表某一数据行的树形结构,为了提高查询效率而引入,是独立于表的对象,可以存放在与表不同的表空间(TABLESPACE)中 索引记录 ...
- MySQL高可用搭建方案之(MMM)
有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top 注意:这篇转载文章,非原创 首发博客地址 原文地址 前言 MySQL的高可用 ...
- 重写SpringCloudGateway路由查找算法,性能提升100倍!
如果你也在做SpringCloudGateway网关开发,希望这篇文章能给你带来一些启发 背景 先说背景,某油项目,通过SpringCloudGateway配置了1.6万个路由规则,实际接口调用过程中 ...
- Oracle19c 多字符集支持的PDB
Oracle19c 多字符集支持的PDB 背景 想在一个数据库里面支持多种字符集 突然发现Oracle12c开始已经可以实现一个CDB下面可以有多个不同字符集的PDB了 所以想着今天验证一下. 环境信 ...
- 阿里云ECS自建K8S_IPV6重启后异常问题解决过程
阿里云ECS自建K8S_IPV6重启后异常问题解决过程 背景 最近安装了一个单节点的K8S_IPV6 昨天不知道何故 突然宕机了. 然后只能在阿里云的控制台后台重启了ECS 启动之后看K8S的状态一开 ...
- [转帖]TiUP Cluster 命令合集
https://docs.pingcap.com/zh/tidb/stable/tiup-component-cluster TiUP Cluster 是 TiUP 提供的使用 Golang 编写的集 ...
- [转帖]Jmeter插件之ServerAgent服务器性能监控工具的安装和使用
https://www.cnblogs.com/pachongshangdexuebi/p/13354201.html 一.前言 性能测试时我们关注的重要指标是:并发用户数,TPS,请求成功率, ...
- [转帖]Full GC (Ergonomics) 产生的原因
发生Full GC,有很多种原因,不仅仅是只有Allocation Failure. 还有以下这么多: #include "precompiled.hpp" #include &q ...