20145231熊梓宏《信息安全系统设计基础》第六周学习总结
20145231信息安全系统设计基础第6周学习总结
教材学习内容总结
第四章 处理器体系结构
一个处理器支持的指令和指令的字节级编码称为它的指令集体系结构,ISA。
Y86指令集体系结构
程序员可见状态
Y86程序中的每条指令都会读取或修改处理器状态的某些部分,称为程序员可见状态。其中包括:
8个程序寄存器:%eax,%ecx,%edx,%ebx,%esi,%edi,%esp和%ebp。
条件码:ZF(零)、SF(符号)、OF(有符号溢出)
程序计数器(PC):存放当前正在执行的指令的地址
存储器:很大的字节数组,保存着程序和数据。Y86系统用虚拟地址来引用存储器的位置,硬件和操作系统软件联合起来将虚拟地址翻译成实际或者物理地址。
状态码(stat):表明程序执行的总体状态。
Y86指令
movl:irmovl、rrmovl、mrmovl、rmmovl,分别显式地指明源和目的地的格式。第一个字母表明源的类型,i(立即数)、r(寄存器)或m(存储器 ),第二个字母代表目的,可以是r或者m。
整数操作指令OPl:addl、subl、andl和xorl。只对寄存器数据进行操作,同时还设置条件码。
跳转指令jXX:jmp、jle、jl、je、jne、jge、jg,根据分支指令的类型和条件码的设置来选择分支。
条件传送指令cmovXX:cmovle、cmovl、cmove、cmovne、cmovge和comvg,与寄存器-寄存器传送指令rrmovl一样,但只有当条件码满足所需要的约束时才会更新目的寄存器的值。
call指令将返回地址入栈,然后跳转到目的地址。ret指令从这样的过程调用中返回。
pushl和popl:入栈和出栈。
halt:停止指令的执行。
指令编码
每条指令的第一个字节表明指令的类型,高4位为代码部分,低4位为功能部分,功能值只有在一组相关指令共用一个代码时才有用。
8个程序寄存器当中,每个都有相应的0~7的寄存器标识符。程序寄存器存在CPU中的一个寄存器文件中,这个文件就是一个小的、以寄存器ID作为地址的随机访问存储器。
附加4字节的常数字:作为irmovl的立即数数据,rmmovl和mrmovl的地址指示符的偏移量,以及分支指令和调用指令的目的地址。
分支指令和调用指令的目的地址是一个绝对地址。所有整数采用小端法编码。
指令集的一个重要性质就是字节编码必须有唯一的解释。
Y86异常
状态码Stat:描述程序执行的总体状态。
值 名字 含义
1 AOK 正常操作
2 HLT 处理器执行halt指令(指令停止)
3 ADR 遇到非法地址
4 INS 遇到非法指令
逻辑设计和硬件控制语言HCL
实现一个数字系统需要的三个组成部分:计算对位进行操作的函数的组合逻辑、存储位的存储器元素,以及控制存储器元素更新的时钟信号。
逻辑门
逻辑门是数字电路的基本计算元素,输出等于输入位值的某个布尔函数。
AND用&&表示,OR用||表示,NOT用!表示。
逻辑门总是活动的。
组合电路和HCL布尔表达式
组合电路:很多逻辑门组合成一个网,构建的计算块。构建这些网有两条限制:1.两个以上的逻辑门的输出不能连接在一起,否则可能使线上信号矛盾,导致一个不合法的电压或电路故障。2.这个网必须是无环的,否则会导致网络计算有歧义。
多路复用器:根据输入控制信号的值,从一组不同的数据信号中选出一个。
字级的组合电路和HCL整数表达式
HCL中,所有字级的信号都声明为int,不指定字的大小。
多路复用函数是用情况表达式来描述的。
[
select1 : expr_1
select2 : expr_2
......
selectk : expr_k]
算数/逻辑单元(ALU):三个输入分别为标号为A和B的两个数据输入,和一个控制输入。
集合关系:判断集合关系的通用格式是
iexpr in {iexpr1,iexpr2,....iexprk}
其中被测试和待匹配的值均为整数表达式。
存储器和时钟
为了产生时序电路,必须引入按位存储信息的设备,存储设备由同一个时钟信号控制。两类存储设备:
时钟寄存器:存储单个位或字,时钟信号控制寄存器加载输入值。
随机访问存储器:存储多个字,用地址来选择应该读写哪个字。
寄存器首先保持稳定(输出等于当前状态),时钟上升沿来到时,加载输入信号。Y86处理器用时钟寄存器保存程序计数器(PC),条件代码(CC)和程序状态(Stat)。
寄存器文件有两个读端口(A和B),一个写端口(W),允许同时进行多端口读写操作。
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时序
SEQ的实现包括组合逻辑和两种存储器设备:时钟存储器(程序计数器和条件码寄存器),随机访问存储器(寄存器文件、指令存储器和数据存储器)。
Y86指令集的计算原则:处理器从来不需要为了完成一条指令的执行而去读由该指令更新了的状态。
SEQ阶段的实现
取指阶段:包括指令存储器硬件单元。
译码和写回阶段:寄存器文件,支持同时进行两个读和两个写,每个端口有一个地址连接(寄存器ID)和一个数据连接(32根线路),既可以作为寄存器文件的输出字,又可以作为他的输入字。
执行阶段:算数逻辑单元(ALU),输出为valE信号。
访存阶段:读或者写程序数据,两个控制块产生存储器地址和存储器输入数据的值。另外两个块产生控制信号表明应该执行读还是写操作。当执行读操作时,数据存储器产生valM。
更新PC阶段:产生程序计数器的新值,依据指令的类型和是否要选择分支,新的PC可能是valC、valM或者valP。
实验楼学习总结
在虚拟机中安装Y86模拟器(根据实验楼步骤,及老师提供的CSAPP Y86.zip)
过程:略(可参考同学博客)
敲入书上例子的代码:Abssum函数,并与书上的汇编器结果进行比对。
p329敲入代码示例:
学习过程中的问题和解决过程
教材学习中遇到的问题
1、传送指令和movl指令的区别?
传送指令是有条件的,只有当条件码满足需要的约束时,才会更新目的寄存器的值;而movl指令只需要指明数据传送类型即可。
2、练习题4.1中第三条指令立即数-3的十六进制表示?
负数以其绝对值的补码形式表达:原码到补码:按位取反加一。
补码到原码:取反加一。
3、p238 伸缩寻址模式指的是?
参见[12级同学博客](http://www.cnblogs.com/zzzz5/p/4889360.html)
4、练习题4.4 使用条件跳转指令时比较的是什么?
-待解决
5、理解:执行pushl %esp指令时处理器行为的不确定性:
因为pushl指令存在两个操作:栈指针键减4,将一个寄存器值写入存储器中,所以,可能压入的是%esp的原始值,可能压入的是减去4的%esp的值。
6、p250 理解:简单的存储器设计可以用于较小的系统,它提供了较为复杂系统的处理器的抽象。
任何复杂的系统都是以这种基本的存储器设计为基础的,他们基本的原理和模型是相同的。
7、理解SEQ阶段实现中HCL语言的描述。
实践中遇到的问题
安装Y86模拟器时,在make时出现问题,经过make clean
指令解决。
代码托管截图
心得体会
本周的学习还是以课本的阅读学习,以及课后习题的理解消化为主,安装了Y86模拟器,在虚拟机中敲入相关部分的代码进行了演练,从汇编代码来深入的理解处理器对每条指令的解析,尤其是经过了习题4.11-4.16之后,对于处理器处理一条指令的具体流程有所了解,这周的学习是继上周从C语言到汇编之后对从机器指令到具体实现的更深一层的解析。了解了能实现这样流程的SEQ硬件结构(指令在硬件上如何实现),还知道了时序对于指令执行的影响,但是,对于该部分的HCL语言理解还是有点吃力,因为对各指令的执行不是很清晰···
学习进度条
博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|
目标 | 30篇 | 400小时 | |
第一周 | 2/2 | 20/20 | 学习了Linux核心命令 |
第二周 | 2/4 | 21/41 | 学习了vim、gcc、gdb指令 |
第三周 | 2/6 | 20/61 | 学习了信息的表示和处理,了解了二进制在计算机系统中的重要性 |
第五周 | 2/8 | 20/81 | 学习了机器级程序,读懂汇编代码 |
第六周 | 2/10 | 19/100 | 了解了处理器对于指令的处理过程 |