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:在自己的虚拟机里面安装不了 y86模拟器
-
问题1解决方案:参考周七号学长博客在实验楼中安好了。
-
问题2:安装bison和flex词法分析工具时无权限。
-
问题2解决方案:参考无法获得锁 /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
代码调试中的问题和解决过程
-
问题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小时
-
改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)