2017-2018-1 20155320 《信息安全系统设计基础》第七周学习总结
参考老师提供的教材内容导读
教材学习内容总结
4.1
- ISA(集体系结构):一个处理器支持的指令和指令的字节级编码
- 程序员可见状态:Y86-64程序中的每条指令都会读取或修改处理器状态的某些部分
15个寄存器(省略%r15)每个程序存储一个64位字
寄存器%rsp被入栈、出栈、调用和返回指令作为栈指针
3个一位条件码(ZF、SF和OF):他们保存着最近的算术或逻辑指令所造成影响的有关信息
程序计数器(PC)存放当前正在执行指令的地址
- 内存从概念上来说就是一个很大的字节数组,保存着程序和数据。
Y86-64程序用虚拟地址来引用内存位置。
- 程序状态的最后一部分是状态码Stat,其可表明程序的总体状态,会指示是正常运行还是出现了异常。
Y-86
- Y86-64指令集基本上是x86-64指令集的一个子集,只包括8字节整数操作,寻址方式比较少,操作也较少。
- 不允许从一个内存地址直接传送到另一个内存地址,也不允许将立即数传送到内存。
- movq指令分成了4个不同的指令:irmovq、rrmovq、mrmovq、rmmovq。第一个字母就表明了源的类型,第二个字母指明了目的的类型
- 四个操作数指令:addq、subq、andq、xorq。只允许对寄存器数进行操作。
- 7个跳转指令:jmp、jle、jl、je、jne、jge、jg。
- halt: 停止指令的执行(x86-64中的指令hlt与之相当)。x86-64中应用程序不允许使用这条指令,因为它会导致整个系统暂停运行。对于Y86而言,执行halt指令会导致处理器停 止,并将状态码设置为HLT。
指令编码
- 每条指令需要1-10x个字节不等。每条指令的第一个字节表明指令的类型。这个字节分为两个部分,每部分4位:高4位是代码部分,低4位是功能部分。代码值为0~0xB功能值只有在一组相关指令共用一个代码时才有用。
- 15个寄存器中每个都有一个相对应的范围在0到0xE之间的寄存器标识符。
- 有的指令需要一个附加的4字节常数字作为立即数数据或地址指示符偏移量或分支指令和调用指令的目的地址。所有整数采用小端法编码。
Y86异常
- 代码值除AOK外都表示程序异常
- 当遇到异常时,我们就简单地让处理器停止执行命令。
更完整的的设计中,处理器通常会调用一个异常处理程序
4.2 逻辑设计和硬件控制语言HCL
- 逻辑1是用高电压表示的,逻辑0使用低电压表示的。
- 实现一个数字系统需要三个主要的组成部分:计算对位进行操作的函数的组合逻辑、存储位的存储器元素,以及控制存储器元素更新的时钟信号
逻辑门
- 逻辑门是数字电路的基本计算单元。
输出=输入位值的某个布尔函数。
只对单个位的数进行操作,而不是整个字
- 对应HCL表达式
1.AND:&&
2.OR:||
3.NOT:!
- 逻辑门总是活动的。一旦输入变化,极短的时间内,输出就会相应变化。
组合电路和HCL布尔表达式
- 很多逻辑门组合成一个网构建的计算块。注意两个或多个输出不能连接在一起,并且必须无环。
- HCL表达式与C语言中的表达式的区别如下:
1.由于组合电路是由一系列的逻辑门组成。HCL中输出会持续随着输入变化而变化。而C语言中只有在程序执行到的时候才进行求值。
2.C语言中,0是FLASE,除了0以外的所有整数都是TRUE,而HCL只对0和1操作。
3.C中&&和||这两种,是优先求值,(&和|并不是)第一个值就能确定结果的话,它不会去计算第二个值。但是HCL中并没有这样的规则。
-
HCL中,将所有字级的信号都声明为int,不指定字的大小,HCL允许比较字是否相等
-
多路复用函数是用情况表达式来描述的。与C不同其不要求不同的选择表达式之间互斥
-
组合电路从本质上讲,不存储任何信息。他们只是简单地响应输入信号,产生属于输入的某个函数的输出。
-
时序电路:有状态并在这个状态上进行计算的系统
-
时钟寄存器:存储单个位或字,时钟信号控制寄存器加载输入值
-
随机访问存储器(存储器)存储字,用地址来选择该读或该写那个字。
-
寄存器作为电路不同部分中的组合逻辑之间的屏障,每当每个时钟到达上升沿的时候,值才会从寄存器的输入传送到输出
4.3 Y86的顺序实现
- 取值:将程序计数器寄存器作为地址,指令存储器读取指令的字节
- 译码:两个读端口,读寄存器valA和valB
- 执行:根据指令的类型,将算数/逻辑单元用于不同的目的
- 访存:数据存储器读出或写入一个存储器字
- SEQ的实现包括组合逻辑和两种存储器设备:时钟寄存器、随机访问存储器两种寄存器设备
- 要控制处理器中活动的时序,只需要寄存器和内存的时钟控制
- SEQ阶段的实现
1.取指阶段
2.译码和写回阶段
3.执行阶段:执行阶段包括算术/逻辑单元(ALU)第一步每条指令的ALU计算,执行阶段还包括条件码寄存器
4.访存阶段:访存阶段的任务是读或者写程序数据,两个控制块产生存储器地址和存储器输入数据的值,另外两个块产生控制信号表明应该执行读操作还是写操作。
5.更新PC阶段:SEQ中最后一个阶段会产生程序计数器的新值,依据指令的类型和是否要选择分支,新的PC可能是valC、valM、valP
实验楼——Y86模拟器
构建YIS环境
-
新建一个20155320的文件夹
-
输入指令wget http://labfile.oss.aliyuncs.com/courses/413/sim.tar
- 显示保存后输入指令sudo tar -xvf sim.tar
-
进入 sim 文件夹,输入指令sudo apt-get install tk
-
解析完成后输入指令sudo ln -s /usr/lib/x86_64-linux-gnu/libtk8.6.so /usr/lib/libtk.so和sudo ln -s /usr/lib/x86_64-linux-gnu/libtcl8.6.so /usr/lib/libtcl.so并输入sudo make指令
-YIS测试:
cd y86-code
进入测试代码,教材p239页代码为asuml.ys,可以通过
make asuml.yo
进行汇编,asuml.yo就是汇编后的结果,见教材p238。
make all
代码调试中的问题和解决过程
- 问题1:在做实验楼中的实验时,发现按实验楼中给出的指令输入,总会出现权限不够的提示:
- 问题1解决方案:后来发现在命令前加上sudo,给予root权限就可以了
代码托管
由于本周虚拟机重安了一遍
结对及互评
本周结对学习情况
- 20155326
- 结对照片
-
结对学习内容
- 第四章内容
其他(感悟、思考等,可选)
本周学习的内容与以前学过的HDL和汇编的相关联性很强,感觉学习起来相对更容易上手一些,觉得融会贯通的学习起来效果更好。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 200小时 | |
第一周 | 5/5 | 1/1 | 15/15 | |
第二周 | 1/2 | 23/38 | ||
第三周 | 206/327 | 1/3 | 28/66 | |
第四周 | 206/327 | 1/4 | 10/77 | |
第五周 | 285/568 | 1/5 | 20/97 | 主要学习了汇编及反汇编的相关知识 |
第六周 | 160/683 | 3/8 | 20/107 | |
第七周 | ? / 769 | 2/10 | 20/127 | 第四章学习内容和第二次实验 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:20小时
-
实际学习时间:20小时
-
改进情况:本周的学习时间用在课本第四章的学习和第二次实验
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)