PA1记录

4月6日开始阅读PA1手册,准备开始PA,但发现和lab完全不一样,PA是直接关于计算机原理实现的技术,需要自己去实现。

完成结构体定义CPU_state和宏定义reg_b(index)

任务:完成nemu/src/isa/x86/include/isa/reg.h的CPU_state结构体定义,并补全该文件中获取寄存器字节的宏定义reg_b(index)

进展步骤及过程中遇到的问题

一、阅读reg.c中的reg_test() 函数

1.不知道前面三个常量字符串指针数组用于做什么,推测是其他地方要用。
在reg.c中reg_name()函数有用到,如果没有extern,会报错:(搜extern的时候不小心删掉了)
2. srand(time(0)); 由当前时间time(0)给出随机数种子,rand()生成随机数
3.for循环中的R_EAX是在reg.h中给出定义的enum变量
4.测试方法
for循环中直接通过assert进行测试,保证了reg_w(i) 就是reg_l(i) 的低八位。
用sample对reg_b进行测试
再用cpu.eax等对sample进行测试。
5.assert(pc_sample == cpu.pc); ??
6.cpu.eax是如何定义的??是什么意思???推测是有地方将CPU_state define为了cpu
在exec_once()函数(在nemu/src/cpu/cpu.c中定义)中有:
CPU_state cpu;
不是define,因为CPU_state就是一个结构体定义

二、尝试完成任务

(不会做直接看了学姐的orz
结构体定义给出了提示需要用到union,于是最开始将gpr[8]的struct改为union,但是发现并不能成功,仔细阅读测试文件发现需要eax 与前面的union都可以存在,所以需要将两者定义为一个大的union,eax等定义为一个struct,否则eax等不能同时存在,彼此都是union形式。

三、宏定义,直接根据提示编写代码得

之后发现可以简化

四、遇到的其他错误

1.在endif后面加了extern导致报错
2.Git的问题:
Gitlog的问题,最开始没有把pa0中的merge到master分支中,导致从master中新开出来的分支pa1中的makefile.git并没有修改,所以名字不符合自己之前修改的,需要重新修改。(之前pa0命名为了PA0导致merge时不成功!!!以后要注意!!!记得写操作文档!!!这一次就算是操作文档的尝试)

Gitlog和是否merge无关,会对所有操作进行记录

特定的文件夹有git,并不是整个电脑有git(不知道如何准确描述这件事,之后可以再系统学习一下git!!!)

git diff [] 和git add [].都可以有[Filename]也可以没有,没有默认时当前目录下所有文件。

git diff是判断当前目录与临时仓库内容是不是一样。git add .之后把当前目录下文件添加到了临时仓库,所以之后git diff没有输出
上网查到了git log有图像化的查看方式,所以下载了这个功能用于图像化查询git log,使用方法:gitk --follow filename

五、阅读

用户界面主循环ui_mainloop(),定义在nemu/src/monitor/debug/ui.c中,是monitor的核心功能, 我们可以在命令提示符中输入命令, 对客户计算机的运行状态进行监控和调试。框架代码已经实现了几个简单的命令, 它们的功能和GDB是很类似的。

指令执行的主循环cpu-exec()(在nemu/src/cpu/cpu.c中定义),模拟了cpu的工作方式,不断的执行指令;其中有一个函数exec_once()(在nemu/src/cpu/cpu.c中定义)让CPU执行当前PC指向的一条指令, 然后更新PC,并返回已经执行的这条指令。

已经执行的指令会输出到日志文件nemu/build/nemu-log.txt中, 可以打开日志文件来查看它们。

具体的指令定义代码位于nemu/src/isa/x86/exec/目录下。其中一个重要的部分是定义在nemu/src/isa/x86/exec/exec.c文件中的opcode_table数组, 在这个数组中, 你可以看到框架代码中都已经实现了哪些指令。其中EMPTY代表对应的指令还没有实现(也可能是不存在该指令)。

由于刚才我们运行NEMU的时候并未给出客户程序的镜像文件, 此时NEMU将会运行上文提到的内置客户程序。
内置客户程序的行为非常简单, 它只包含少数几条指令, 甚至算不上在做一些有意义的事情。定义在在nemu/src/isa/x86/init.c中,其中进行了三个工作:
1.Test the implementation of the `CPU_state’ structure.
2. Setup physical memory address space.
3. Initialize this virtual computer system.

NEMU将不断执行指令, 直到遇到以下情况之一, 才会退出指令执行的循环:
1.达到要求的循环次数.
2.客户程序执行了nemu_trap指令.
这是一条特殊的指令, 在ISA手册中并不存在, 它是为了在NEMU中让客户程序指示执行的结束而加入的. 为了表示客户程序是否成功结束, nemu_trap指令还会接收一个表示结束状态的参数. 当客户程序执行了这条指令之后, NEMU将会根据这个结束状态参数来设置NEMU的结束状态, 并根据不同的状态输出不同的结束信息, 包括三种:
HIT GOOD TRAP - 客户程序正确地结束执行
HIT BAD TRAP - 客户程序错误地结束执行
ABORT - 客户程序意外终止, 并未结束执行

退出cpu_exec()之后, NEMU将返回到ui_mainloop(), 等待用户输入命令。
但为了再次运行程序(客户程序), 需要键入q退出NEMU, 然后重新运行。

思考题

在nemu/src/monitor/debug/ui.c中,cmd_c()函数(用于处理我们输入的字符c)在调用cpu_exec(uint64_t )中传入了参数-1,请思考-1代表的意义,可以查看cpu_exec()源码进行思考。

答:因为cpu_exec()的参数类型定义的是64位无符号整型,所以传入-1相当于传入的是64位的1;在之后执行for循环方便进行多次循环。(是最多有这么多指令吗???

debug函数

三个对调试有用的宏(在nemu/include/debug.h中定义)
1.Log()是printf()的升级版, 专门用来输出调试信息, 同时还会输出使用Log()所在的源文件, 行号和函数。
当输出的调试信息过多的时候, 可以很方便地定位到代码中的相关位置

2.Assert()是assert()的升级版, 当测试条件为假时, 在assertion fail之前可以输出一些信息

3.panic()用于输出信息并结束程序, 相当于无条件的assertion fail

表达式求值1

具体任务:
• 合法的token集合为:数字、0x、+、-、*、/、(、)、空格、==、a-f/A-F。其中0x表示数字是16进制的
• 将token对应的正则表达式pattern填入rules数组中(需要补全enmu、rules)
• 完成make_token()函数,该函数对表达式提取token,并将token类型和内容存入tokens中
• 完成expr()函数,该函数对表达式解析后的tokens进行求值
完成对应函数后,我们会在下一节中介绍怎么进行测试。因此你也可以先浏览完所有章节,然后再完成对应作业,这也是我们建议的方式。

学习:

此处的表达式求值需要这四个条件:
1.合法的token集合
2.合法的表达式
3.解析合法表达式
4.对解析后的表达式求值

1.token集合:允许在表达式中出现的字符或字符集、数字、运算符等。比如数字0-9,字符或字符集a-f/A-F,(指针解引用), 0x(16进制数),运算符+,-,,/等等。

2.合法的表达式:合法的token集合构造的表达式

3.用BNF表示表达式。BNF是什么,如何表示,如何看懂???

4.表达式求值的定性描述:正则表达式,根据合法的token集合,定义特定的正则表达式模板pattern,然后扫描输入的表达式,依次匹配各个模板,将得到的token保存至tokens里面,完成表达式解析;
进一步求具体值,采用分治法。根据我们对表达式的BNF定义,大的表达式由小的表达式组合而来,先求得小表达式(元表达式)的值之后,再根据小表达式求大表达式的值即可。

5.代码层面解释:
nemu/src/monitor/debug/expr.c中定义了枚举常量,你需要在里面定义不同token对应的整数值

6.说明:
见文档

7.正则表达式
之前看python的时候学习的一些知识,但是记不得具体的语法了。
忘记了可以再复习一遍菜鸟教程中的语法:https://www.runoob.com/regexp/regexp-syntax.html

\b 匹配这样的位置:它的前一个字符和后一个字符不全是(一个是,一个不是或不存在) \w。
\w 匹配字母、数字、下划线。等价于’[A-Za-z0-9_]’。

简易调试器1

熟悉框架代码???
实现几个调试器功能

做完了但没同步整理,有时间再整理吧

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值