2017-2018-1 20155303 《信息安全系统设计基础》第七周学习总结

2017-2018-1 20155303 《信息安全系统设计基础》第七周学习总结

————————CONTENTS————————


学习过程中遇到的问题和解决

  • 『问题一』

课本中涉及到了许多Y86-64汇编程序与x86-64汇编程序的比较,如何安装Y86模拟器,并生成汇编程序呢?

  • 『问题一解决』

1.安装bison和flex词法分析工具:

2.在http://csapp.cs.cmu.edu/public/students.html地址下载sim并解压。

3.安装tcl/tk:

4.修改Makefile文件(sim文件夹下的):

  • 首先确定tk.h和tcl.h在自己虚拟机的什么位置:

  • 按如下所示进行修改:

其中,最后一行的路径即为刚才查询的位置。

5.接下来使用make命令编译即可。

『注意』

编译时可能会出现以下提示:

这时,需要先make clean,再make

6.成功编译后,使用cat命令查看Y86-64的汇编程序:

7.我们可以打开模拟器,使其进行更为直观的演示。以pipe文件夹为例,注意到文件夹下有一个名为“psim”的可执行文件,输入./psim -t -g ../y86-code/asum.yo即可打开模拟器:

点击“Go”按钮,下方的“取指阶段”、“译码阶段”、“执行阶段”和“存储阶段”就会一步一步显示其变化,最下面的寄存器堆还可以查看各个寄存器的存储情况。

  • 『问题二』

课本P246图4-2展示了Y86-64指令集,在后面的学习中也经常需要查看并分析这个图表。在这里借助图4-2简要分析一下Y86-64的指令,为后续学习打下基础。

  • 『问题二解决』

阅读上图需要注意以下几个方面:

1.图中左边是指令的汇编码表示,右边是字节编码

2.指令的编码长度从1个字节到10个字节不等。一条指令含有一个单字节的指令提示符,可能含有一个单字节的寄存器指示符,还可能含有一个8字节的常数字。

3.字段fn指明是某个整数操作(Opq)、数据传送条件(cmovXX)或是分支条件(jXX)。

4.每条指令的第一个字节表明指令的类型。这个字节分为两部分,每部分4位:高4位是代码(code)部分,低4位是功能(function)部分。功能码如下:

5.15个程序寄存器中每个都有一个相对应的范围在0到0xE之间的寄存器标识符(register ID)。当需要指明不应该访问任何寄存器时,就用ID值0xF表示。

  • 『问题三』

课本P259提到了字集的多路复用器电路,是如何实现多路复用的呢?

  • 『问题三解决』

查阅资料了解到,多路复用是指以同一传输媒质(线路)承载多路信号进行通信的方式。各路信号在送往传输媒质以前,需按一定的规则进行调制,以利于各路已调信号在媒质中传输,并不致混淆。

如上图所示,这个电路根据控制输入位s,产生一个64位的字Out,等于两个输入字A或者B之中的一个。这个电路由64个相同的子电路组成,每个子电路的结构都是一个位级多路复用器。

可以观察到,这个字级的电路只产生一次!s,然后在每个位的地方都重复使用它,以此减少反处理器和非门的数量。

  • 『问题四』

What is register file

  • 『问题四解决』

register file的概念不难理解。register file是CPU中多个寄存器组成的阵列,通常由快速的静态随机读写存储器(SRAM)实现。这种RAM具有专门的读端口与写端口,可以多路并发访问不同的寄存器。

register file有两个读端口(A和B),还有一个写端口(W)。这样一个多端口随机访问存储器允许同时进行多个读和写的操作。如上图所示的register file中,电路可以读两个程序寄存器的值,同时更新第三个寄存器的状态。每个端口都有一个地址输入,表明该选择哪个程序寄存器,另外还有一个数据输出或对应该程序寄存器的输入值。

向寄存器文件写入字是由时钟信号控制的,控制的方式类似于将值加载到时钟寄存器。每次时钟上升时,输入valW上的值会被写入输入dstW上的寄存器ID指示的程序寄存器。

返回目录


教材部分习题分析

  • 『P248练习题4.2』

确定下列每个字节序列所编码的Y86-64指令序列。如果序列中有不合法的字节,指出指令序列中不合法值出现的位置。每个序列都先给出了起始地址,冒号,然后是字节序列。

A.
0x100: 30f3fcffffffffffffff |   irmovq $-4,%rbx
0x10a: 40630008000000000000 |   rmmovq %rsi,0x800(%rbx)
0x114: 00                   |   halt
  • 分析:根据“30”找到“irmovq”指令,由指令结构可知接下来的8个字节为相应的立即数;同理,取40为“rmmovq”指令;最后的“00”为停止执行指令。
B.
0x200: a06f                 |   pushl %rsi
0x202: 800802000000000000   |   call proc
0x20b: 00                   |   halt
0x20c:                      | proc:
0x20c: 30f30a00000000000000 |   irmovq $10,%rbx
0x216: 90                   |   ret
  • 分析:此代码包含函数调用。其余分析方式与A类似,也是根据指令编码寻找指令;再根据指令的结构选取合适的位数进行切割。由于此代码涉及到了系统调用,所以需要有函数的相关信息(proc),如起始地址等。
C.
0x300: 50540700000000000000 |   mrmovq 7(%rsp),%rbp
0x30a: 10                   |   nop
0x30b: f0                   | .byte 0xf0 # invalid instruction code
0x30c: b01f                 |   popq %rcx
  • 分析:此代码包含非法指令字节0xf0。查询Y86-64的指令集,我们并没有找到f0对应的指令。

综上过程,分析过程的大致思路如下:①根据指令编码的代码部分和功能部分确定相应指令;②根据指令的结构确定所取字节数,以分割字节序列;③另外,需要根据字节数依次类推每一条指令的起始地址。分析时应格外注意非法指令等各种非法情况。

  • 『P278练习题4.19』

写出SEQ实现中信号need_valC的HCL代码。

下图为SEQ的取指阶段,以PC作为起始地址,从指令内存中读取10个字节。根据这些字节,我们产生出各个指令字段。

根据课本上的提示我们可以知道,need_valC的HCL描述可以确定指令是否包含一个常数字。

再根据Y86-64指令集中对各个指令的功能描述,就可以确定哪些有常数字段了。

最终的HCL代码如下:

bool need_valC = [
	icode in {IIRMOVQ, IRMMOVQ, IMRMOVQ, IJXX, ICALL};
]

返回目录


代码托管

返回目录


学习感悟和思考

  • 本周主要学习教材第四章。这一章讲述基本的组合和时序逻辑元素,并展示这些元素如何在数据通路中组合到一起,来执行x86-64指令集的一个称为“Y86-64”的简化子集。同时,教材还提供了模拟器,形成了一种更为直观清晰的表达方式,理解起来也更加方便。
  • 学习过程中从老师那里获取了教材的英文版原著,我认为阅读原版书籍对于概念的理解有非常大的帮助。就以这周学习为例,课本上提到了“寄存器文件”,我对这个概念并不熟悉,于是打算查询资料加深理解。但网上对于“寄存器文件”这个名词的解释寥寥无几,却频繁提到另一个名词——“寄存器堆(register file)”。我猜测两者应该指的是同一个事物,只能是翻译的问题。后来去图书馆找到了英文版的原著,果然其中对“寄存器文件”的描述也为“register file”。由此看来,对于一些经典的外文书籍,由于不同的翻译者的翻译可能千差万别,所以还是应该尽量阅读原版书籍,以获取最权威最正宗的解释。
  • 随着本学期学习进度的不断推进,越发感受到《深入理解计算机系统》这本书的经典所在。章节与章节之间,甚至是学科与学科之间千丝万缕的联系,都在这本教材中充分展现出来。操作系统、汇编语言程序设计、Verilog描述、网络编程等等知识,在这门课程中均有所体现,且更深刻,更详细,更具应用价值。且不谈前几周接触的进程线程与我们“操作系统”课程的部分知识几乎完全契合,单是这周学习的第四章就让我又捡起了好多之前学过又近乎忘记的知识,比如各个汇编指令的功能,比如硬件描述语言。就像娄老师强调的,这本书是一本将计算机软件和硬件理论结合讲述的经典教程,一个学期的时间绝不可能全部理解透彻;即使细细读完全书,随着知识体系的不断扩充,第二次第三次打开时仍会有全新的、更加深刻地理解。其实对于其他经典书籍也是一样的道理,书是死的,但人的思想是活的,我们始终强调lifelong-learning,原因或许就在于,我们可以借助时间的力量,让静态的图书的价值,动态地发挥到极致。

返回目录


学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 20篇 400小时
第一周 50/50 1/1 8/8 了解计算机系统、静态链接与动态链接
第三周 451/501 2/3 27/35 深入学习计算机算术运算的特性
第四周 503 / 1004 1/4 20/55 掌握程序崩溃处理、Linux系统编程等知识,利用所学知识优化myod,并实现head和tail命令
第五周 315 / 1319 3/7 29/84 掌握“进程”的概念,并学习应用相关函数;了解程序如何在机器上表示
第七周 264 / 1583 1/8 15/99 了解处理器的体系结构,学习多线程的概念

返回目录


参考资料

posted @ 2017-11-05 14:26  0x14b7狄  阅读(508)  评论(0编辑  收藏  举报