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 ...
随机推荐
- docker 服务,镜像,容器命令总结
本文为博主原创,未经允许不得转载: 目录: 1. docker 服务相关命令 2. 镜像相关总结 3. 容器相关命令总结 1. docker 服务相关: 1. 查看docker版本及相关信息: doc ...
- Go-包-package-modules-import
- Go-值传递&引用传递
值类型和引用类型 值类型关注其值 引用类型关注其指针 值类型和引用类型区别在于传递值的时候拷贝的对象不同,值传递拷贝是变量的值,引用传递拷贝的是变量的指针 拷贝 -- 传递值 赋值 函数调用 初始化 ...
- [转帖]RAC环境下误操作将数据文件添加到本地存储
https://www.cnblogs.com/jyzhao/p/7986729.html 今天碰到个有意思的事情,有客户在Oracle RAC环境,误操作将新增的数据文件直接创建到了其中一个节点的本 ...
- 【转帖】训练中文LLaMA大规模语言模型
https://zhuanlan.zhihu.com/p/612752963?utm_id=0 https://github.com/CVI-SZU/Linlygithub.com/CVI-SZU/ ...
- [转帖]Python-Mock接口测试
https://www.cnblogs.com/zhangwuxuan/p/12928850.html 前言 今天跟小伙伴们一起来学习一下如何编写Python脚本进行mock测试. 什么是mock? ...
- Inspur CS5280H BMC重装系统的过程
Inspur CS5280H BMC重装系统的过程 背景 公司里面一台信创海光的设备 默认安装了银河麒麟v10的操作系统 但是在进行瀚高数据库压测时 总会出现无缘无故的宕机的情况. 昨天还特别学习了下 ...
- [转帖]一文入门前景广阔的 eBPF
https://zhuanlan.zhihu.com/p/567375673 [摘要]eBPF带来的最大的好处即是可以对内核进行编程性处理,实现对内核中不灵活的部分,实现自定义的处理.这种灵活性使得对 ...
- Gorm实战,轻松掌握数据库增删改查技巧!
Gorm实战,轻松掌握数据库增删改查技巧! CRUD通常指数据库的增删改查操作,本文详细介绍了如何使用GORM实现创建.查询.更新和删除操作. 目录 Gorm实战,轻松掌握数据库增删改查技巧! 一.C ...
- [1] HEVD 学习笔记:HEVD 环境搭建
1. HEVD 概述 + 环境搭建 HEVD作为一个优秀的内核漏洞靶场受到大家的喜欢,这里选择x86的驱动来学习内核漏洞,作为学习笔记记录下来 实验环境 环境 备注 调试主机操作系统 Window ...