您的位置:首页 > 其它

信息安全系统设计基础第六周学习总结

2015-10-15 17:38 274 查看

处理器体系结构

一、前言

1、计算机系统只限于机器语言程序级。

2、指令被编码为有一个或多个字节序列组成的二进制格式。一个处理器支持的指令和指令的字节级编码称为它的指令集体系结构(ISA)。

3、虽然每个厂商制造的处理器性能和复杂性不断提高,但是不同型号在ISA级别上都保持着兼容。因此,ISA在编译器编写者和处理器设计人员之间提供了一个概念抽象层,编译器编写者只需要知道允许哪些指令,以及他们是如何编码的。而处理器设计者必须建造出执行这些指令的处理器。

4、现代处理器的实际工作方式可能跟ISA隐含的计算模型大相径庭。ISA模型看上去应该是顺序指令执行,也就是先取出一条指令,等到它执行完毕,再开始下一条。

5、在Web浏览器或平衡二叉树和哈希表这样的信息检索数据结构中使用缓存,能够在提高性能的同时,又保持一个更简单、更抽象模型的功能。

6、HCL:一种描述硬件系统控制部分的简单语言,可用于描述处理器设计。

7、在本章中,我们定义一个简单地不完备的指令集,称之为“Y86”指令集。它基于顺序操作、功能正确但有点不实用。由于处理器的每个时钟周期执行一条完整地Y86指令,因此它的时钟必须足够慢,以允许在一个周期内完成所有动作。随后,我们创建一个流水线化的处理器,这个处理器将每条指令的执行分解成五步,每个步骤由一个独立的硬件部分或阶段来处理。指令步经流水线的各个阶段,且每个时钟周期有一条新指令进入流水线,所以处理器可以同时执行五条指令的不同阶段。因此要求处理器能够处理很多冒险或冲突。冒险就是一条指令的位置或操作数依赖于其他仍在流水线中的指令。

二、Y86指令集体系结构

定义一个指令集体系结构,包括定义各种状态元素、指令集和他们的编码、一组编程规范和异常事件处理。

1、程序员可见的状态

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

Y86中包含:

①程序寄存器:%eax,%ecx,%edx,%ebx,%esi,%edi,%esp,%ebp。他们都可以存储一个字。%esp被入栈、出栈、调用和返回指令作为栈指针。

②PC(程序计数器):存放当前正在执行指令的地址。(在IA32中,用%eip表示,指示将要执行的下一条指令在存储器中的地址。)
③程序存储器:就是一个很大的字节数组,保存着程序和数据。Y86用虚拟地址来引用存储器位置,硬件和操作系统软件联合起来将虚拟地址翻译成实际或物理地址,指明数据实际保存在存储器中哪个地方。

④条件码:ZF、OF、SF。都是一位条件码,用来保存最近的算术或逻辑指令所造成影响的有关信息。

⑤Stat:程序状态的最后一个部分是状态码,它表明程序执行的总体状态。它会指示是正常运行还是出现了某种异常。

2、Y86指令

1)几种指令

<<整数操作指令

addl 加
subl 减
andl 与
xorl 异或


并且它们只对寄存器数据进行操作(区别于IA32,后者还允许对存储器数据进行这些操作)。

<<条件码

ZF-零
SF-符号
OF-溢出


<<跳转指令——分支控制

jmp 直接跳转
jle(SF^OF)|ZF 有符号数≤
jl SF^OF 有符号<
je ZF 相等/零
jne ~ZF 不相等/非零
jge ~(SF^OF) 有符号≥
jg ~(SF^OF)&~ZF 有符号>


<<条件传送指令

cmovle
cmovl
cmove
cmovne
cmovge
cmovg


2)指令解析



①在movl指令中,指令名字的第一个字母就表明了源类型。指令第二个字母指明了目的类型。立即数(i)、寄存器(r)、存储器(m)。两个存储器传送指令中的存储器引用方式是简单地基址和偏移量形式。在地址计算中,不支持第二变址寄存器和任何寄存器值的伸缩。不允许从一个存储器地址直接传送到另一个存储器地址,也不允许将立即数传送到存储器。

②addl,subl,andl,xorl是四个整数操作指令,Y86中只允许对寄存器数据进行操作(IA32中还允许对存储器数据进行操作),这些指令会设置条件码ZF、SF、OF。

③jmp,jle,jl,je,jne,jge,jg是七个跳转指令,根据分支指令的类型和条件码的设置来选择分支。

④cmovle,cmovl,cmove,cmovne,cmovge,cmovg是六个条件传送指令,这些指令的格式与寄存器-寄存器传送指令rrmovl一样,但只有当条件码满足所需要的约束时,才会更新目的寄存器的值。

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

⑥pushl和popl指令实现了入栈和出栈。

⑦halt指令停止指令的执行(IA32中的指令hlt)。IA32中应用程序不允许使用这条指令,因为它会导致整个系统暂停运行。对于Y86而言,执行halt指令会导致处理器停止,并将状态码设置为HLT。

3、指令编码

①在上图中还可看见指令的字节级编码。每条指令需要1-6个字节不等。每条指令的第一个字节表明指令的类型。这个字节分为两个部分,每部分4位:高4位是代码部分,低4位是功能部分。功能值只有在一组相关指令共用一个代码时才有用。

②如图,8个程序寄存器中每个都有相应0-7的寄存器标示符,Y86与IA32的寄存器编号一致。程序寄存器存在CPU中的一个寄存器文件中,这个寄存器文件就是一个小的、以寄存器ID为地址的随机访问存储器。当需要指明不应访问任何寄存器时,就用ID值0xF来表示。



③有的指令只有一个字节长,因为可能附加有寄存器指示符字节,指定一个或两个寄存器。这些寄存器字段为rA,rB。有则有,无则无,只有一个的则将第二个设为0xF。

④有的指令需要一个附加的4字节常数字作为立即数数据或地址指示符偏移量或分支指令和调用指令的目的地址。所有整数采用小端法编码。

注意:分支指令和调用指令的目的地址是一个绝对地址,而不是像IA32中那样使用PC相对寻址方式。处理器用PC相对寻址方式,分支指令的编码会更简洁,同时这样也能允许代码从存储器的一部分复制到另一部分,而不需要更新所有的分支目标地址。


例如:



⑤指令集的一个重要性质就是字节编码必须有唯一的解释。这个性质保证了处理器可以无二义性地执行目标代码程序。即使代码嵌入在程序的其他字节中,只要从序列的第一个字节开始处理,我们仍然可以很容易地确定指令序列。反过来说,如果不知道一段代码序列的起始位置,我们就不能准确地确定怎样将序列划分成单独的指令。

4、Y86异常

程序员可见的状态包括状态码Stat,它描述程序执行的总体状态。代码值如下:

①代码值1:命名为AOK,表示程序执行正常,而其他一些代码则表示发生了某种类型的异常。
②代码值2:命名为HLT,表示处理器执行了一条halt指令。
③代码值3:命名为ADR,表示处理器试图从一个非法存储器地址读或者向一个非法存储器地址写,可能是当取指令的时候,也可能是当读或者写数据的时候。我们会限制最大的地址(确切的限定值因实现而异),任何访问超出这个限定值的地址都会印发ADR异常。
④代码值4:命名为INS,表示遇到了非法的指令代码。


遇到异常时,Y86会简便处理使得处理器停止执行指令。在更完整地设计中,处理器会调用一个异常处理程序,这个过程被指定用来处理遇到的某种类型的异常。

5、Y86程序

Y86代码与IA32代码的主要区别在于,它可能需要多条指令来执行一条IA32指令所完成的功能。

Y86没有伸缩寻址模式。

命令指明应该将代码或数据放在什么位置,以及如何对齐。这个程序详细说明了栈的防治、数据初始化、程序初始化和程序结束等问题。

以“.”开头的词是汇编命令,他们告诉汇编器调整地址,以便在那儿产生代码或插入一些数据。命令.pos0告诉编译器应该从地址0处开始产生代码。这个地址是所有Y86程序的起点。

创建Y86代码的唯一工具是汇编器。

指令集模拟器YIS的目的是模拟Y86机器代码程序的执行,而不用试图去模拟任何具体处理器实现的行为。这种形式的模拟有助于在实际硬件可用之前调试程序,也有助于检查模拟硬件或者在硬件上运行程序的结果。

6、一些Y86指令的详情

大多数Y86指令是以一种直接的方式修改程序状态的。

特指popl和pushl,在压入/弹出栈指针%esp的时候,有两种不同的约定:

1.压入/弹出%esp的原始值
2.压入/弹出%esp-/+4后的值


经过试验,发现默认压入弹出的都是原始值

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

1.逻辑门:&&、|| 、!

2.组合电路:很多逻辑门组合成一个网,构建计算块。构建这些网有两条限制。

①两个或多个逻辑门的输出不连接在一起,否则可能会使线上的信号矛盾,导致一个不合法的电压或电路故障
②网必须无环


3.字级的组合电路和HCL整数表达式:一些位级信号代表一个整数或一些控制模式。执行字级计算的组合电路根据输入字的各个位,用逻辑门来计算输出字的各个位。

所有字级的信号都声明为int,不指定字的大小

多路复用函数用情况表达式来描述,具体格式如下:

[
select_1 : expr_1
select_2 : expr_2
……
]


从逻辑上讲,这些选择表达式是顺序求值的。

选择表达式为1时,表示如果前面没有情况被选中,就选择这种情况

不同 选择表达式之间允许不互斥

4.多路复用器:根据输入控制信号的值,从一组不同的数据信号则选出一个。多路复用函数是用情况表达式描述的。

5.算数/逻辑单元是很重要的组合电路,有三个输入,标号为A、B的两个数据输入和一个控制输入。根据控制输入的设置,电路会对数据输入执行不同的算数或逻辑操作。

6.判断集合关系的通用格式

Iexpr in {iexpr1,iexpr2,…,iexprk}


7.两类存储器设备

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


8.Y86处理器会用时钟寄存器保持程序计数器(PC)、条件代码(CC)、程序状态(Stat)

9.寄存器文件有两个读端口(A、B)还有一个写端口(W),多端口随机访问存储器允许同时进行多个读和写操作。

三、Y86的顺序实现

1.将处理组织成阶段

①取指:取指阶段从存储器读取指令字节,地址为程序计数器PC的值
②译码:译码阶段从寄存器文件读入最多两个操作数
③执行:在执行阶段,算数/逻辑单元要么根据ifun的值执行指令指明的操作,计算机存储器引用的有效地址,要么增加或减少栈指针
④访存:访存阶段可以将数据写入存储器,或从存储器读出数据
⑤写回:写回阶段最多可以写两个结果到寄存器文件
⑥更新PC:将PC设置成下一条指令的地址


2.SEQ抽象视图的画法:

程序计数器放在寄存器中,位于左下角PC。
信息随着线流动,方向是先向上再向右
反馈先祖在右边向下
所有硬件单元的处理都在一个时钟周期内完成。
浅灰色方块表示硬件单元
控制逻辑块是用灰色圆角矩形表示的
线路的名字在白色椭圆中说明
宽度为字长或更窄的数据连接用细线
单个位的连接用虚线


3.部分指令执行步骤:

①执行rrmovl指令和执行算术运算类似,不过不需要取第二个寄存器操作数。将ALU的第二个输入设为0,先把它和第一个操作数相加,得到valE=valA,然后再把这个值写到寄存器文件。
②对irmovl的处理与上类似,除了ALU的第一个输入为常数值valC。因为是长指令格式,对于irmovl,程序计数器必须加6。所有这些指令都不改变条件码
③pushl指令开始时很像前面讲过的指令,但在译码阶段,用%esp作为第二个寄存器操作数的标识符,将栈指针赋值为valB。在执行阶段用ALU将栈指针减4,减过4的值就是存储器写的地址,在写回阶段还会存到%esp中。
④popl指令的执行与pushl的执行类似,除了在译码阶段要读两次栈指针以外。popl应该首先读存储器,然后再增加栈指针。
⑤call指令、ret指令和pushl、pop类似。指令call:将call指令后面跟着的那条指令的地址valP压入栈中,在更新PC阶段将PC设为调用目的地valC。指令ret:在更新PC阶段,将从栈中取出的值valM赋值给PC。
⑥SEQ的实现包括组合逻辑和两种存储器设备:时钟寄存器、随机访问存储器。
⑦需要对时序进行明确控制的四个硬件单元——程序计数器、条件码寄存器、数据存储器、寄存器文件。
⑧计算原则:处理器从不需要为了完成一条指令的执行而去读由该指令更新了的状态。在时钟上升开始下一个周期时,处理器就可以同时执行寄存器写和存储器写。


具体通用步骤如下:









有些指令(整数运算)会设置条件码,有些指令(跳转指令)会读取条件码,但没有指令必须既设置又读取条件码。虽然到时钟上升开始下一个周期时才会设置条件码,但是在任何指令试图读之前,它们都会更新。

4.常用常数



5.SEQ阶段的实现

①取指阶段:取指阶段包括指令存储器硬件单元。以PC作为第一个字节(字节0)的地址,这个单元一次从存储器读出6个字节,第一个字节被解释称指令字节,分为两个4位数。标号为“icode”和“ifun”的控制逻辑块计算指令和功能码等于从存储器读出值,或者当指令地址不合法时(imem_error指明),这些值对应于nop指令。
②译码和写回阶段:都要访问寄存器文件。寄存器文件有四个端口,支持同时进行两个读(端口A、B)和两个写(E、M),每个端口都有一个地址连接和一个数据连接。根据指令代码icode以及寄存器指示值rA和rB,可能还会根据执行阶段计算出的Cnd条件信号。
③执行阶段:执行阶段包括算术/逻辑单元(ALU)第一步每条指令的ALU计算,执行阶段还包括条件码寄存器。
④访存阶段:访存阶段的任务是读或者写程序数据,两个控制块产生存储器地址和存储器输入数据的值,另外两个块产生控制信号表明应该执行读操作还是写操作。当执行读操作时数据存储器产生值valM。
⑤更新PC阶段:SEQ中最后一个阶段会产生程序计数器的新值,依据指令的类型和是否要选择分支,新的PC可能是valC、valM、valP


四、遇到的问题及解决方案

1、对于书上的一些流程示意图有些看不懂,理解得有些困难。

2、SEQ的周期跟踪,本来对于跳变原因有些不太理解。后来通过联想,我想到了与大二学过的数字电路的上升沿触发器的原理,发现这两者有些相似,于是很快就理解了。

3、在做习题4.19时,发现自己的答案中比标准答案多了PC项,明明valM也有给PC值,后来看清了题目要求的是“目的寄存器”,而PC不属于寄存器。

4、实验楼操作时遇到的问题:

第一次进入实验楼实验环境时,我发现Code文件夹中不存在shiyanlou_cs413文件夹,于是我手动创建了一个。然后进入终端按照指示一步一步执行命令,成功解析得出以下结果:



有同学反映他们的Code文件夹内已经有shiyanlou_cs413文件夹,并且执行第一条指令进入文件夹以后出现(master)字样,不能解析第二条命令地址。我本以为是我的电脑系统问题侥幸避开这个问题。但是后来由于操作失误必须退出实验楼重新再来,发现自己的执行中也出现了无法解析的问题。导致后面操作无法继续。跪求老师指教。

尝试好多次以后发现还是不能解析。于是我尝试在自己的虚拟机上做,可以解析。并且执行到了最后一步,虽然命令行中提示有一些错误但是还是像模像样的。如图:



但是依旧不知道为什么之前不能。

解答:实验楼支持git 后,课程目录都会自动建立的,Code文件夹中应该存在shiyanlou_cs413。

YIS编译只给了 make clean, make指令;我写指导书发现没有tcl tk的库,我加了安装库的指令。
方法:apt-cache search tk; 查找相关的库,然后sudo apt-get install 安装。安装完还不行,我又用ln -s 建立了快捷方式才可以。
现在的问题是 -lfl 的问题,可以推出缺少libfl.so, 这个是没有flex安装的问题 。

实验楼普通用户不能联外网,所以不可以解析外部的网址,目前外网权限只对会员开放了。

五、实验实践过程

要求:构建YIS环境:

cd ~/Code/shiyanlou_cs413
wget csapp.cs.cmu.edu/2e/sim.tar
tar -xvf sim.tar
cd 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/libtk8.6.so /usr/lib/libtk.so
make

操作如下:

实验楼中部分操作:







进入测试代码,教材p239页代码为asuml.ys,可以通过。将代码输出在屏幕中,与书中一致。









进行汇编,asuml.yo就是汇编后的结果:



六、参考文献

1、《深入理解计算机系统》pdf

2、实验楼实验指导书:https://www.shiyanlou.com/courses/413 实验五
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: