课程地址:https://www.bilibili.com/video/BV1yC4y1s74C

一、实验目的

  • 了解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.cui_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 实验报告的更多相关文章

  1. ucoreOS_lab3 实验报告

    所有的实验报告将会在 Github 同步更新,更多内容请移步至Github:https://github.com/AngelKitty/review_the_national_post-graduat ...

  2. ucoreOS_lab2 实验报告

    所有的实验报告将会在 Github 同步更新,更多内容请移步至Github:https://github.com/AngelKitty/review_the_national_post-graduat ...

  3. JAVA实验报告及第七周总结

    JAVA第六周作业 实验报告五 第一题 1.设计一个类层次,定义一个抽象类--形状,其中包括有求形状的面积的抽象方法. 继承该抽象类定义三角型.矩形.圆. 分别创建一个三角形.矩形.圆存对象,将各类图 ...

  4. 第五次java实验报告

    Java实验报告 班级 计科二班 学号 20188437 姓名 何磊 完成时间2019/10/10 评分等级 实验四 类的继承 实验目的 理解抽象类与接口的使用: 了解包的作用,掌握包的设计方法. 实 ...

  5. 第七周总结&第五次实验报告

    学习总结 这周我们加深了对抽象类与接口的学习,获得的知识点也比上周多了许多,抽象类与接口很相似,就比如别人还没有做完的是交给你来做,而他那些样式都做好了,你只需要完善即可 但也有不同点. 区别点 抽象 ...

  6. 第七周课程总结 & 实验报告(五)

    第七周课程总结 一.抽象类与接口的应用 1.实例化 2.实际应用 ---模板设计(抽象类) ---制定标准(接口) 3.设计模式 ---工厂设计 ---代理设计 ---适配器设计 二.抽象类与接口之间 ...

  7. 第七周&实验报告五

    实验四 类的继承 •实验目的 •理解抽象类与接口的使用: •了解包的作用,掌握包的设计方法. •实验要求 •掌握使用抽象类的方法. •掌握使用系统接口的技术和创建自定义接口的方法. •了解 Java ...

  8. 2019JAVA第五次实验报告

    Java实验报告 班级 计科二班 学号 20188442 姓名 吴怡君 完成时间2019/10/11 评分等级 实验四 类的继承 实验目的 理解抽象类与接口的使用: 了解包的作用,掌握包的设计方法. ...

  9. 实验报告5&第七周课程总结

    实验四 类的继承 实验目的 理解抽象类与接口的使用: 了解包的作用,掌握包的设计方法. 实验要求 掌握使用抽象类的方法. 掌握使用系统接口的技术和创建自定义接口的方法. 了解 Java 系统包的结构. ...

  10. 北京电子科技学院(BESTI)实验报告5

    北京电子科技学院(BESTI)实验报告5 课程: 信息安全系统设计基础 班级:1452.1453 姓名:(按贡献大小排名) 郑凯杰.周恩德 学号:(按贡献大小排名) 20145314.20145217 ...

随机推荐

  1. 每天学五分钟 Liunx 001 | 用户及用户组

    Liunx 文件权限 [root@controller-0 ~]# ll -al heihei -rw-r--r--. 1 root root 0 Mar 3 07:39 heihei 第一列 -rw ...

  2. RLHF · PbRL | 速通 ICLR 2024 RLHF

    检索关键词:ICLR 2024.reinforcement learning.preference.human feedback. https://openreview.net/search?term ...

  3. Ubuntu解决Github无法访问的问题

    技术背景 由于IP设置的问题,有时候会出现Github无法访问的问题,经过一番的资料检索之后,发现如下的方案可以成功解决在Ubuntu下无法正常访问Github的问题(有时候可以打开,有时候又不行). ...

  4. AHB2APB设计

    AHB2APB Bridge位置 AHB子系统时钟在200Mhz左右,APB时钟在几十Khz到几十Mhz 所以要进行跨时钟域处理,从AHB高时钟频率转到APB低时钟频率 AHB2APB Bridge规 ...

  5. MongoDB 部署分片集群

    部署配置服务器:configsvr 先生成.conf文件 mkdir -p /data/mongodb/configsvr vim /data/mongodb/configsvr/configsvr. ...

  6. GoMusic-歌单迁移工具网站 一键迁移网易云/QQ音乐歌单至 Apple/Youtube/Spotify Music

    GoMusic是什么: GoMusic是一个在线歌单迁移工具网站,帮助用户一键迁移网易云/QQ音乐歌单至 Apple/Youtube/Spotify Music,直接输入歌单链接,复制查询结果,打开 ...

  7. [转帖]Oracle安装 - shmmax和shmall设置

    https://www.cnblogs.com/ddzj01/p/16108010.html 一.概述 在Linux上安装oracle,需要对内核参数进行调整,其中有shmmax和shmall这两个参 ...

  8. minio性能测试

    minio性能测试 minio的使用 前期使用了s3fs 但是想验证一下性能相关, 所以使用今天简单验证了一下, 其实也可以使用一下fio 但是s3fs 是对象存储 没有修改 只有上传, 所以感觉还是 ...

  9. [转帖]查看请求在nginx中消耗的时间

    需求:查看请求在nginx中消耗的时间,不包括程序响应时间. 1.声明日志的格式,在nginx配置文件nginx.conf里的http下添加如下内容: log_format test '$remote ...

  10. [转帖]xargs详解

    https://www.cnblogs.com/xiaofeng666/p/10800939.html xargs与find经常结合来进行文件操作,平时删日志的时候只是习惯的去删除,比如 # find ...