2017-2018-1 20155217 《信息安全系统设计基础》第七周学习总结
Posted on 2017-11-05 11:56 20155217杨笛 阅读(172) 评论(0) 编辑 收藏 举报2017-2018-1 20155217 《信息安全系统设计基础》第七周学习总结
教材学习内容总结
第四章 处理器体系结构
指令体系结构:一个处理器支持的指令和指令的字节级编码
4.1Y86指令集体系结构
- Y86:包括定义各种状态元素、指令集和它们的编码、一组编程规范和异常事件处理。Y86指令和IA32代码的主要区别在于,它可能需要多条指令来执行一条IA32指令能完成的所有功能。
- 程序员可见状态
Y86程序中的每条指令都会读取或修改处理器状态的某些部分。
Y86具体包括:8个程序寄存器、3个条件码ZF\SF\OF、程序计数器(PC)
Y86用虚拟地址引用存储器位置。 程序状态的最后一个部分是状态码Stat,它表明程序执行的总体状态。
-
Y86指令集(图片来自网络,需要注意条件码只与整数操作指令有关)
-
指令编码
高4位是代码部分,低4位是功能部分,功能之只有在一组相关指令共用一个代码时才有用。
当需要指明不应访问任何寄存器时,就用ID值0xF来表示。
指令集的一个重要性质:字节编码必须有唯一的解释。
- Y86异常
状态码Stat:描述程序执行的总体状态
代码值1:名字为AOK,表示程序执行正常
代码值2:名字为HLT,表示处理处执行一条halt指令
代码值3:名字为ADR,表示处理器试图从一个非法存储器地址读或者向一个非法存储器地址写,可能是当取指令的时候,也可能是当读或者写数据的时候。
代码值4:名字为INS,表示遇到了非法的指令代码。
逻辑设计和硬件控制语言HCL
-
逻辑门是数字电路的基本计算元素,它们的输出,等于它们输入位值的某个布尔函数。
-
组合电路:将很多的逻辑门组合成一个网,能构建计算块。
构建这些网有2条限制:
(1)两个或多个逻辑门的输出不能连接在一起
(2)这个网必须是无环的。 -
判断集合关系的通用格式是:
iexpr in {iexpr1,iexpr2,……,iexprk}
4.3 Y86的顺序实现
- SEQ处理器:每一个时钟周期上,SEQ执行处理一条完整指令所需的所有步骤。
- 将处理组织成阶段
取址:valP:PC的值加上已取出指令的长度。
译码:读入指令rA和rB字段指明的寄存器。
执行:ALU执行指令指明的操作,计算存储器引用的有效地址,要么增加或者减少栈指针,得到的值为valE;对跳转指令来说,这个阶段会检验条件码和分支条件。
访存:可以将数据写入存储器,或者从存储器读出数据。置为valM。
写回:最多可以写两个结果到寄存器文件。
更新:将PC设置成下一条指令的地址。
- 执行一条指令需要的处理过程
执行指令所表明的操作、计算地址、更新栈指针、确定下一条指令的地址。
对于三种控制转移指令的处理:需要注意位信号Cnd。
在更新PC阶段,检查这个标志,如果这个标志为1,将PC设为valC(跳转目标),如果为0,就设为valP(下一条指令的地址)。
- SEQ硬件结构:实现所有Y86指令所需要的计算可以组织成6个阶段:取值、译码、执行、访存、写回和更新PC。在SEQ中,所有硬件单元的处理都在一个时钟周期内完成。
- SEQ的时序
SEQ的实现包括组合逻辑和两种存储器设备:时钟寄存器(程序计数器和条件码寄存器),随机访问存储器(寄存器文件、指令存储器和数据存储器)。
每个时钟周期,程序计数器都会装在新的指令地址;只有在执行整数运算指令时,才会装载条件码寄存器;只有在执行rmmovl、pushl或call指令时,才会写数据存储器;寄存器文件的两个写端口允许每个时钟周期更新两个程序寄存器。
处理器的原则:
处理器从来不需要为了完成一条指令的执行而去读由该指令更新了的状态。
- SEQ阶段的实现
nop指令:除了将PC加1,不进行任何处理;
halt指令:将处理器状态设置为HLT,导致处理器停止运行。
教材学习中的问题和解决过程
-
问题1:
pushl指令会把栈指针减4,并且将一个寄存器值写入存储器中。由此会导致什么情况出现?
-
问题1解决方案:
要入栈的寄存器会被同一条指令修改,通常有两种约定:
(1)压入%esp的原始值
(2)压入减去4的%esp的值。
-
问题2:
“寄存器”在硬件和机器级编程中的区别是什么?
-
问题2解决方案:
在硬件中,寄存器直接将它的输入和输出线连接到电路的其他部分;
在机器级编程中,寄存器代表的是CPU中为数不多的可寻址的字,这里的地址是寄存器ID。 Y86处理器会用时钟寄存器保存程序计数器(PC)、条件代码(CC)、程序状态(Stat)。
代码调试中的问题和解决过程
构建YIS环境
-
新建了一个以自己学号命名的文件夹
-
输入指令
wget http://labfile.oss.aliyuncs.com/courses/413/sim.tar
-
显示保存后输入指令
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
并输入make指令
YIS测试
cd y86-code
进入测试代码,并对代码为asuml.ys
进行汇编结果为asuml.yo
make all
可以汇编运行所有代码结果。
代码托管
实验楼经常会忘记上传代码导致代码消失,准备找时间重新安装虚拟机
上周考试错题总结
1.下面和代码可移植性相关的C语言属性有(ABC)
A .#define
B .typedef
C .sizeof()
D .union
解析:#define可以定义宏使得变量可移植,typedef可以使得类型可移植,sizeof()使得不同类型长度可移植。
2.short int v=-12345;
unsigned short uv=(unsigned short) v;
那么(AB)
A .v=-12345, uv=53191
B .v=uv=0xcfc7
C .v,uv的底层的位模式不一样
D .v,uv的值在内存中是不一样的
解析:有符号数和无符号数的转换,值不同,位模式不变
练习题
确定下列每一个字节序列所编码的Y86指令序列。如果有不合法字节,指出其位置。
A.
0x100:30f3fcffffff ##irmovl $-4,%ebx
0x106:406300080000 ##rmmovl %esi,0x800(%ebx)
0x10c:00 ##halt
B.
0x200:a06f ##pushl %esi
0x202:8008020000 ##call proc
0x207:00 ##halt
0x208:
0x208:30f30a000000 ##irmovl $10,%ebx
0x20e:90 ##ret
【此题应该是在熟练掌握各项指令(尤其是特殊指令)的编码基础上进行尝试分解编码序列。例如:在以“a0”开头的编码处,就应该意识到这是一个之后2字节的pushl指令;然后下一个以“80”开头的即call指令(只有五字节),这样就可以得出剩余的00一定是halt。】
结对及互评
点评模板:
- 博客中值得学习的或问题:
- xxx
- xxx
- ...
- 代码中值得学习的或问题:
- xxx
- xxx
- ...
- 其他
本周结对学习情况
- [20155236](http://www.cnblogs.com/fcgfcgfcg/)
- 结对照片
- 结对学习内容
-SEQ的实现包括组合逻辑和两种存储器设备:时钟寄存器(程序计数器和条件码寄存器),随机访问存储器(寄存器文件、指令存储器和数据存储器)。
每个时钟周期,程序计数器都会装在新的指令地址;只有在执行整数运算指令时,才会装载条件码寄存器;只有在执行rmmovl、pushl或call指令时,才会写数据存储器;寄存器文件的两个写端口允许每个时钟周期更新两个程序寄存器。
处理器的原则:
处理器从来不需要为了完成一条指令的执行而去读由该指令更新了的状态。
其他(感悟、思考等,可选)
本周我学习了Y86指令集、HCL硬件描述语言和Y86的顺序实现过程。Y86指令与IA32指令很相似,而且更少一些,两个相比较更便于记忆。HCL硬件描述语言的逻辑门的画法和之前学习过的数字电路差不多,时序电路工作原理也一致。Y86的顺序实现部分文字讲解很学术化,大致步骤已经了解,但是每一步的细节还在进一步理解中。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 200/200 | 2/2 | 20/20 | |
第二周 | 300/500 | 2/4 | 18/38 | |
第三周 | 500/1000 | 3/7 | 22/60 | |
第四周 | 300/1300 | 2/9 | 30/90 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:XX小时
-
实际学习时间:XX小时
-
改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)