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

教材学习内容总结

ISA

一个处理器支持的指令和指令的字节级编码称为ISA,即指令集体系结构。

Y86-64指令集体系结构

  • 程序员可见的状态

Y86程序中的每条指令都会读取或修改处理器状态的某些部分,称为程序员可见状态。其中包括:

  • Y86-64指令

1)movq:irmovq、rrmovq、mrmovq、rmmovq。第一个字母表明源的类型,i(立即数)、r(寄存器)或m(内存),第二个字母代表目的,可以是r(寄存器)或者m(内存)。

2)不允许从一个存储器地址直接传送到另一个存储器地址,也不允许将立即数传送到存储器。

3)四个整数操作指令(OPq):addq、subq、andq和xorq。只对寄存器数据进行操作,还允许对内存数据进行这些操作。

七个跳转指令(jXX):jmp、jle、jl、je、jne、jge和jg,根据分支指令的类型和条件代码的设置来选择分支。

六个条件传送指令(cmovXX):cmovle、cmovl、cmove、cmovne、cmovge和comvg,指令格式与寄存器-寄存器传送指令rrmovl一样,但只有当条件码满足所需要的约束时才会更新目的寄存器的值。

call和ret指令:call指令将返回地址入栈,然后跳转到目的地址,ret指令从这样的过程调用中返回。

pushq和popq:实现了入栈和出栈。

halt:停止指令的执行。

  • 指令编码

1)高4位为代码部分,低四位为功能部分,代码值为0~0xB,功能值只有在一组相关指令共用一个代码时才有用。

2)程序寄存器存在CPU中的一个寄存器文件中,这个文件就是一个小的、以寄存器ID作为地址的随机访问存储器。

3)分支指令和调用指令的目的是一个绝对地址。

4)所有整数采用小端法编码。

5)字节编码必须有唯一的解释。

练习题4-1

练习题4-2

  • 异常

1)状态码Stat:描述程序执行的总体状态。

2)

  • 逻辑设计和硬件控制语言HCL

1)

2)为了产生时序电路,必须引入按位存储信息的设备,存储设备都由同一个时钟信号控制。

3)考虑两类存储器设备:

时钟寄存器:存储单个位或字,时钟信号控制寄存器加载输入值。
随机访问存储器:存储多个字,用地址来选择应该读写哪个字。

练习题4-11、4-12

  • Y86顺序实现

取指:从存储器读取指令字节,地址为程序计数器(PC)的值。指令指示符字节两个四位部分,称为icode(指令代码)和ifun(指令功能)。vaIP(下一条指令的地址)=PC+已取出指令的长度。

译码:从寄存器文件读入最多两个操作数,得到valA和/或valB。

执行:算数逻辑单元(ALU)根据ifun的值执行指令指明的操作,计算存储器引用的有效地址,或者增加或减少栈指针。得到的值称为valE。也可根据条件码执行跳转。

访存:将数据写入存储器,或者从存储器读出数据。读出的值为valM。

写回:写会阶段最多可以写两个结果到寄存器文件。

更新PC:将PC设置成下一条指令的地址。

  • SEQ硬件实现

硬件单元与各个处理阶段相关联:

取指:将程序计数器寄存器作为地址,指令存储器读取指令的字节。PC增加器计算valP,即增加了的程序计数器。

译码:寄存器文件有两个读端口A和B,从这两个端口同时读寄存器的值valA和valB。

执行:根据指令类型将算数/逻辑单元(ALU)用于不同的目的。条件码寄存器有三个条件码位,ALU负责计算条件码的新值,当执行跳转指令时会根据条件码和跳转类型来计算分支信号Cnd。

访存:数据存储器读出或写入一个存储器字。指令和数据存储器访问的是相同的存储器位置,但用于不同的目的。

写回:寄存器文件有两个写端口,E用来写ALU计算出来的值,M用来写从数据存储器中读出来的值。

  • SEQ阶段的实现

1)取指阶段:包括指令内存硬件单元。

2)译码和写回阶段:寄存器文件有四个接口,支持同时进行两个读和两个写,每个端口有一个地址连接和一个数据连接,既可以作为寄存器文件的输出字,又可以作为它的输入字。

3)执行阶段:包括算数/逻辑单元(ALU),输出就是valE信号。

4)访存阶段:读或者写程序数据。两个控制块产生存储器地址和存储器输入数据的值。另外两个块产生表明应该执行读还是写操作的控制信号。当执行读操作时,数据存储器产生valM。

5)更新PC阶段:产生程序计数器的新值,依据指令的类型和是否要选择分支,新的PC可能是valC、valM或valP。

Y86模拟器安装

以下为在自己虚拟机中的安装过程:

1)安装bison和flex词法分析工具,在终端中输入sudo apt-get install bison flex

下载sim解压。地址http://csapp.cs.cmu.edu/public/students.html,这里我用的是自己手机开的热点,使用内网太慢了,一直打不开。

出现问题无权限

解决办法:无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用)

1.终端输入 ps -aux ,列出进程,找到含有apt-get的进程,直接sudo kill PID解决。

2.强制解锁--命令:

sudo rm /var/cache/apt/archives/lock
sudo rm /var/lib/dpkg/lock

2)找到 Chapter 4: Processor Architecture,点击Source distribution (README)如下图所示,下载后在虚拟机中解压。

3)图形界面须要安装Tcl/Tk

4)在终端中输入sudo apt-get install tcl8.5-dev tk8.5-dev tcl8.5 tk8.5

5)在解压后的sim文件夹中找到makefile文件,作如下图改动并保存。

6)编译 在sim文件夹下右键选择在终端中打开,输入make clean;make

试了无数次后,在自己的机子上不能安装完成,于是在实验楼上进行安装。

1)首先在Code目录下创建shiyanlou_cs413文件夹,打开后在文件夹里输入sudo wget http://labfile.oss.aliyuncs.com/courses/413/sim.tar

tar -xvf sim.tar

2)在sim文件夹中输入 sudo apt-get install bison flex tk

3)输入sudo ln -s /usr/lib/x86_64-linux-gnu/libtk8.6.so /usr/lib/libtk.so

4)sudo ln -s /usr/lib/x86_64-linux-gnu/libtcl8.6.so /usr/lib/libtcl.so

5)make

6)修改makefile

7)打开测试代码asuml.ys,可以通过make asuml.yo进行汇编,asuml.yo就是汇编后的结果。

make all可以汇编运行所有代码结果。

8)在文件夹y86-code中新建文档输入P251页代码,命名文4-6.ys,

9)make 4-6.yo

10)make all

查阅资料后得知应该make clean一下,然后这时只剩.ys文件了,然后可以make 4-6.yo,

然后可以cat 4-6.yo查看,如下图所示,make all可以汇编运行所有代码

查看j-cc.yo

教材学习中的问题和解决过程

1.终端输入 ps -aux ,列出进程,找到含有apt-get的进程,直接sudo kill PID解决。

2.强制解锁--命令:

sudo rm /var/cache/apt/archives/lock
sudo rm /var/lib/dpkg/lock

代码调试中的问题和解决过程

  • 问题1:看书上的汇编代码时,感觉代码晦涩难懂,其实主要是因为对汇编指令不熟悉。

  • 问题1解决方案:将汇编指令都标注好其意义,写了一两个后感觉轻松了不少

  • 问题2:输入make all指令时出现 make:没有什么可以做的为'all'

  • 问题2解决方案:搜索后得知需要先make clean 一下,然后再make all

代码托管

截图代码

PS:这周的课程学习代码大多在实验楼中,但是我在下载实验楼代码时出错了,显示代码被破坏,所以无法展示。

本周结对学习情况

- [20155320](博客链接)
- 结对照片

- 结对学习内容
    - 教材第四章内容
    - Y86模拟器的安装

其他(感悟、思考等,可选)

这两周的内容都与汇编有关,对于上学期没有学好会变有点后悔,但是其实这些代码细细的看还是能看懂的。将基本指令掌握就没问题。在安装Y86模拟器时出了很多问题,后来发现在自己的虚拟机上安不好,转而在实验楼中安装,但是有一个缺点是每次想使用时必须再打开实验楼安装一次。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 0/0 1/1 10/20
第二周 57/100 1/1 20/30
第三周 100/100 1/1 30/30
第四周 233/200 1/1 20/20
第五周 267/200 1/1 20/20
第六周 220/2000 3/1 40/20
第七周 362/300 1/1 30/30

尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

参考:软件工程软件的估计为什么这么难软件工程 估计方法

  • 计划学习时间:30小时

  • 实际学习时间:30小时

  • 改进情况:

(有空多看看现代软件工程 课件
软件工程师能力自我评价表
)

参考资料