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

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

第六周(10.12-10.18):

学习计时:共12小时
读书:4
代码:1
做业:3
博客:4html

第四章 处理器体系结构

现代微处理器能够称得上是人类创造的最复杂的系统之一。一块手指甲大小的硅片上,能够容纳一个完整的高性能处理器、大的高速缓存,以及用来链接到外部设备的逻辑电路。linux

  1. 到目前为止,咱们看到的计算机系统只限于机器语言程序级。咱们知道处理器必须执行系列指令,每条指令执行某个简单操做,例如两个数相加。指令被编码为由一个或多个字节序列组成的二进制格式。
  2. 不一样的处理器“家族”,例如intel ia32性能和复杂性不断提升,可是不一样的型号在ISA级别上都保持着兼容。一些常见的处理器家族(例如IA32)中的处理器分别由多个厂商提供。

4. 1Y86指令集体系结构

4.1.1程序员可见的状态

  • Y86程序中的每条指令都会读取或修改处理器状态的某些部分。这称为程序员可见状态。这里的“程序员”既能够是用汇编代码写程序的人,也能够是产生机器级代码的编译器。在处理器实现中,只要咱们保证机器级程序可以访问程序员可见状态,就不须要彻底按照ISA隐含的方式来表示和组织这个处理器状态。Y86的处理器状态相似于IA32。
  • 有8个程序寄存器:%eax、%ecx、%edx、%ebx、%esi、%edi、%esp和%ebp。处理器的每一个程序寄存器存储一个字。
  • 程序计数器存放当前正在执行指令的地址。

4.1.2Y86指令

  • Y86指令集基本上是IA32指令集的一个子集。它只包括四字节整数操做,寻址方式比较少,操做也较少。
  • 四字节数据,因此称之为“字”不会有歧义。
  • 汇编代码格式相似于IA32的ATT格式。

4.1.3指令编码

  • 每条指令须要1~6个字节不等,这取决于须要哪些字段。
  • Y86中的寄存器编号跟IA32中的相同。程序寄存器存在CPU中的一个寄存器文件中,这个寄存器文件就
    是一个小的、以寄存器ID做为地址的随机访问存储器。在指令编码中以及在咱们的硬件设计中,当须要指明不该访问任何寄存器时,就用ID值0xF来表示。
  • 有的指令只有一个字节长,而有的须要操做数的指令编码就更长一些。首先,可能有附加的寄存器指示符字节,指定一个或两个寄存器。
  • 从指令的汇编代码表示中能够看到,根据指令类型,指令能够指定用于数据源和目的的寄存器,或是用于地址计算的基址寄存器。没有寄存器操做数的指令,例如分支指令和call指令,就没有寄存器指示符字节。那些只须要一个寄存器操做数的指令将另外一个寄存器指示符设为OxF。这种约定在咱们的处理器实现中很是有用。
  • 有些指令须要一个附加的4字节常数字。

4.1.4Y86异常

对于Y86,当遇到这些异常的时候,咱们就简单地让处理器中止执行指令。在更完整的的设计中,处理器一般会调用一个异常处理程序,这个过程被指定用来处理遇到的某种类型的异常。就像在第8章中讲述的,异常处理程序能够被配置成不一样的结果,例如,放弃程序或者调用一个用户自定义的信号处理程序。程序员

4.1.5Y86程序

程序中以“.”开头的词是汇编器命令。缓存

4.1.6一些Y86的详情

  • 大多数Y86指令是以一种直接的方式修改程序状态的,因此定义每条指令想要达到的结果并不困难。不过,两个特别的指令组合须要特别注意一下。pushl指令会把栈指针减4,而且将一个寄存器值写入存储器中。所以,当执行pushl %esp指令时,处理器的行为是不肯定的,由于要入栈的寄存器会被同一条指令修改。
  • 一般有两种约定:1)压入%esp的原始值,2)压入减去4的%esp的值。

4. 2逻辑设计和硬件控制语言HCL

4.2.1逻辑门

4.2.2组合电路和HCL布尔表达式

图4-11多路复用器根据输入控制信号的值,从一组不一样的数据信号中选出一个,在这个单个位的多路复用器中,两个数据信号是输入位a和b,控制信号是输入位s,当s为1时,输出等于a:而当s为0时,输出等于b。在这个电路中,咱们能够看出两个AND门决定了是否将它们相对应的数据输入传送到OR门。
HCL表达式很清楚地代表了组合逻辑电路和C语言中逻辑表达式的对应之处。它们都是用布尔操做来对输入进行计算的函数。值得注意的是,这两种表达计算的方法之间有如下区别:安全

由于组合电路是由一系列的逻辑门组成,它的属性是输出会持续地响应输入的变化。若是电路的输入变化了,在必定的延时以后,输出也会相应的变化。相比之下,C表达式只会在程序执行过程当中被遇到时才进行求值。
C的逻辑表达式容许参数是任意整数,0表示FALSE,其余任何值都表示TRUE。而逻辑门只对位值0和1进行操做.
C的逻辑表达式有个属性就是它们可能只被部分求值。若是―个AND或OR操做的结果只用对第一个参数求值就能肯定,那么就不会对第二个参数求值了。markdown

4.2.3字级的组合电路和HCL整数表达式

  • 经过将逻辑门组合成大的网,能够构造出能计算更加复杂函数的组合电路。一般,咱们设计能对数据字进行操做的电路。有一些位级信号表明一个整数或一些控制模式。例如咱们的处理器设计将包含有不少字,字的大小为4位和32位,表明整数、地址、指令代码和寄存器标识符。
  • 执行字级计算的组合电路根据输入字的各个位,用逻辑门来计算输出字的各个位。
  • 选择表达式能够是任意的布尔表达式,能够有任意多的状况。这就使得状况表达式能描述带复杂选择标准的、多种输入信号的块。

4.2.4集合关系

在处理器设计中,不少时候都须要将一个信号与许多可能匹配的信号作比较,以此来检测正在处理的某个指令代码是否属于某一类指令代码。app

4.2.5存储器和时钟

为了产生时序电路,咱们必须引入按位存储信息的设备。存储设备都是由同一个时钟控制,时钟是一个周期性信号,决定何时要把新值加载到设备中。考虑两类存储器设备:框架

1.时钟寄存器(简称寄存器)存储单个位或字。时钟信号控制寄存器加载输入值。
2.随机访问存储器(简称存储器)存储多个字,用地址来选择该读或该写哪一个字。随机访问存储器的例子包括:1)处理器的虚拟存储器系统,硬件和操做系统软件结合起来使处理器能够在一个很大的地址空间内访问任意的字;2)寄存器文件,在此,寄存器标识符做为地址。在IA32或Y86处理器中,寄存器文件有8个程序寄存器。函数

大多数时候,寄存器都保持在稳定状态(用×表示)产生的输出等于它的当前状态。信号沿着寄存器前面的组合逻辑传播这时,产生了一个新的寄存器输入(用y表示)但只要时钟是低电位的,寄存器的输出就仍然保持不变。当时钟变成高电位的时候,输入信号就加载到寄存器中,成为下一个状态y直到下一个时钟上升沿,这个状态就一直是寄存器的新输出。关键是寄存器是做为电路不一样部分中的组合逻辑之间的屏障。每当每一个时钟到达上升沿时,值才会从寄存器的输入传送至输出。性能

4.3 y86的顺序(sequential)实现

4.3.1将处理组织成阶段

一般,处理一条指令包括不少操做。将它们组织成某个特殊的阶段序列,即便指令的动做差别很大,但全部的指令都遵循统一的序列。每一步的具体操做取决于正在执行的指令。建立这样的框架,咱们便能设计一个充分利用硬件的处理器。简略描述:

取指
译码
执行
访存
写回
更新PC

咱们面临的一个挑战是将每条不一样指令所须要的计算放入到上述那个通用框架中。咱们会使用图4-17中所示的代码来描述不一样Y86指令的处理。表中的这种格式很容易映射到硬件,表中的每一行都描述了一个信号或存储状态的分配。阅读时能够把它当作是从上至下的顺序求值。当咱们将这些计算映射到硬件时,会发现其实并不须要严格按照顺序来执行这些求值。

4.3.2SEQ硬件结构

硬件单元与各个处理阶段相关联:

  • 取指:将程序计数器寄存器做为地址,指令存储器读取指令的字节。
  • 译码:寄存器文件有两个读端口A和B,从这两个端口同时读寄存器值
  • 执行:执行阶段会根据指令的类型,将算术/逻辑单元用于不一样的目的。对整数操做,它要执行指令所指定的运算。对其余指令,它会做为一个加法器来计算增长或减小栈指针,或者计算有效地址,或者只是简单地加0,将一个输入传递到输出。
  • 访问:在执行访问操做时,数据存储器读出或写入一个存储器字。
  • 写回:寄存器文件有两个写端口。

4.3.3SEQ的时序

SEQ的实现包括组合逻辑和两种存储器设备:时钟寄存器,随机访问存储器(寄存器文件、指令存储器和数据存储器)。组合逻辑不须要任什么时候序或控制。对于较小的存储器来讲(例如寄存器文件)这是一个合理的假设,而对于较大的电路来讲,能够用特殊的时钟电路来模拟这个效果。因为指令存储器只用来读指令,所以咱们能够将这个单元当作是组合逻辑。

4.3.4SEQ阶段的实现

寄存器文件有四个端口,它支持同时进行两个读(在端口A和B上)和两个写(在端口E和M)。每一个端口都有一个地址链接和―个数据链接,地址链接是一个寄存器ID,而数据链接是一组32根线路,既能够做为寄存器文件的输出字,也能够做为它的输入字。若是某个地址端口上的值为特殊标识符0xF,则代表不须要访问寄存器。

4.4 流水线的通用原理

4.4.1计算流水线

在现代逻辑设计中,电路延迟以微微秒,也就是10的负12次方秒为单位来计算。

4.4.2流水线操做的详细说明

为了更好地理解流水线是怎样工做的,详细看看流水线计算的时序和操做。图4-34是三阶段流水线的流水线图,流水线阶段之间的指令转移是由时钟信号来控制的"每隔120ps,信号从0上升至1开始下一组流水线阶段的计算。

4.4.3流水线的局限性

4.4.4带反馈的流水线系统

4.5 y86的流水线实现

4.5.1SEQ+从新安排计算阶段

做为实现流水线化设计的一个过渡步骤,咱们必须稍微调整一下SEQ中五个阶段的顺序,使得更新PC阶段在一个时钟周期开始时执行,而不是结束时才执行。只须要对总体硬件结构作最小的改动,对于流水线阶段中的活动的时序,它能工做得更好。咱们称这和修改过的设计为“SEQ+”。咱们移动PC阶段,使得它的逻辑在时钟周期开始时活动,使它计算当前指令的PC值。

4.5.2插入流水线寄存器

4.5.3对信号进行从新排列和标号

顺序实现SEQ和SEQ+在一个时刻只处理一条指令。在流水线化的设计中,与各个指令相关联的值有多个版本,会随着指令一块儿流过系统。咱们须要很当心以确保使用的是正确版本确版本的信号,不然会致使很严重的错误。经过在信号名前面加上大写的流水线寄存器名字做为前缀,存储在流水线寄存器中的信号能够惟一的被标识。

4.5.4预测下一个PC

在PIPE―设计中,咱们采起了一些措施来正确处理控制相关。流水线化设计的目的就是每一个时钟周期都发射一条新指令,也就是说每一个时钟周期都有一条新指令进入执行阶段并最终完成。要是达到这个目的就意味着吞吐量是每一个时钟周期一条指令。要作到这一点,咱们必须在取出当前指令以后,立刻肯定下一条指令的位置。不幸的是,若是取出的指令是条件分支指令,要到几个周期后,也就是指令经过执行阶段以后,咱们才能知道是否要选择分支。相似地,若是取出的指令是ret,要到指令经过访存阶段,才能肯定返回地址。

4.5.5流水线冒险

PIPE-结构是建立一个流水线化的Y86处理器的好开端。不过,回忆4.44节中的讨论,将流水线技术引入一个带反馈的系统,当相邻指令同存在相关时会致使出现问题。在完成咱们的设计以前,必须解决这个问题。
这些相关有两种形式:

1)数据相关,下一条指令会用到这条指令计算出的结果;
2)控制相关,一条指令要肯定下一条指令的位置,例如在执行跳转、调用或返回指令时,这些相关可能会致使流水线产生计算错误,称为冒险。同相关同样,冒险也能够分为两类:数据冒险和控制冒险。

4.5.6用暂停来避免数据冒险

暂停是避免冒险的―种经常使用技术,暂停时,处理器会中止流水线中一条或多条指令,直到冒险条件再也不知足,让一条指令停顿在译码阶段,直到产生它的源操做数的指令经过了写回阶段,这样咱们的处理器就能避免数据冒险,。它对流水线控制逻辑作了一些简单的增强。当指令addl处于译码阶段时,流水线控制逻辑发现执行、访存或写回阶段中至少有―条指令会更新寄存器。

4.5.7用转发来避免数据冒险

为了充分利用数据转发技术,咱们还能够将新计算出来的值从执行阶段传到译码阶段,以免程序prog4所须要的暂停。在周期4中,译码阶段逻辑发如今访存阶段中有对寄存器%edX未进行的写,并且执行阶段中ALU正在计算的值稍后也会写入寄存器%eaX。它能够将访存阶段中的值做为操做数Va1A也能够将ALU的输出做为操做数~Va1B,注意,使用ALU的输出不会致使任什么时候序问题,译码阶段只要在时钟周期结束以前产生信号Va1A和Va1B,在时钟上升开始下一个周期时,流水线寄存器E就能装载来自译码阶段的值,而在此以前ALU的输出已是合法的了。

4.5.8加载/使用数据冒险

有类数据冒险不能单纯用转发来解决,由于存储器在流水线发生的比较晚。

4.5.9异常处理

咱们的指令集体系结构包括三种不一样的内部产生的异常:1:)halt指令,2)有非法指令和功能码组合的指令, 3)取指或数据读写试图访问一个非法地址。正确处理异常是任何微处理器设计中颇有挑战性的一面。异常可能出如今不可预测的时间,须要明确的中断经过处理器流水线的指令流。

4.5.10PIPE各阶段的实现

4.5.11流水线控制逻辑

如今准备建立流水线控制逻辑,以完成咱们的PIPE设计。这个逻辑必须处理如下4种控制状况,这些状况是其余机制(例如数据转发和分支预测)不能能处理的:

处理ret:流水线必须暂停直到ret指令到达写回阶段。
加载/使用冒险:流水线必须暂停一个周期。
预测错误的分支:在分支逻辑发现不该该选择分支以前,分支目标处的几条指令已经进流水线了。必须从流水线中去掉这些指令。
异常:当―条指令致使异常,咱们想要禁止后面的指令更新程序员可见的状态,并睏异常指令到达写回阶段时,中止执行。
咱们先浏览每种状况所指望的行为,而后再设计处理这些状况的控制逻辑。

4.5.12性能分析

咱们能够看到,全部须要流水线控制逻辑进行特殊处理的条件,都会致使流水线不可以实现每一个时钟周期发射一条新指令的目标。咱们能够经过肯定往流水线中插入气泡的频率,来衡量这种效率的损失。由于插入气泡会引起未使用的流水线周期。一条返回指令会产生三个气泡,一个加载/使用冒险会产生一个,而一个预测错误的分支会产生两个。

4.5.13未完成的工做

  • 多周期指令
  • 与存储系统的接口

4.6 小结

重点

  1. 第六周:学习任务教材 第四章
  2. 本章内容是处理器体系结构,重点掌握ISA,并能触类旁通;本章带着你们设计并实现了一个结合CISC和RISC思想的处理器Y86,一个类IA32体系的处理器;ISA在编译器编写者和处理器设计者之间提供了一个抽象。
  3. 本章重点是4.1-4.3,流水线部分4.4-4.5供学有余力的同窗自学
  4. 练习题:4.1 4.2 4.5 4.6 4.8 4.10 4.11 4.12 4.16 4.17 4.19 4.21 4.24

实验楼实验

过程

  1. 构建YIS环境:
    cd ~/Code/shiyanlou_cs413
    wget http://labfile.oss.aliyuncs.com/courses/413/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

  2. YIS测试:
    cd y86-code
    进入测试代码,教材p239页代码为asuml.ys,能够经过
    make asuml.yo
    进行汇编,asuml.yo就是汇编后的结果,见教材p238。
    make all
    能够汇编运行全部代码结果。

遇到的问题

在实验楼中没法解析主机地址

还有不太清楚实验楼中第一项任务的要求。

解决方法:在答疑论坛中看到了同窗的提问和老师的回复。
实验楼普通用户不能联外网,因此不能够解析外部的网址,目前外网权限只对会员开放了。老师在实验楼工做人员的帮助下,已经修改了实验指导书,把外网地址改为内网地址了。

参考资料

  1. 教材:第四章《处理器体系结构》,详细学习指导:http://group.cnblogs.com/topic/73069.html
  2. 课程资料:https://www.shiyanlou.com/courses/413 实验五,课程邀请码:W7FQKW4Y
  3. 教材中代码运行、思考一下,读代码的学习方法:http://www.cnblogs.com/rocedu/p/4837092.html
  4. 鼓励本身好好读书的连接,但说是入门级的书,但是我仍是东西不少都看不懂:http://www.cnblogs.com/JeffreyZhao/archive/2009/11/23/recommended-reading-3-csapp.html
  5. 无心中翻到的一个程序员的故事:http://mindhacks.cn/2009/05/17/seven-years-in-nju/

感悟

  1. 遇到问题后我用过百度用各类方式查找实验的问题,在不一样的电脑上测试,果真仍是答疑论坛最管用了。。。
  2. markdown真的很方便。
  3. 不少人说这本书是入门级教程,可是仍是以为不容易看懂。
相关文章
相关标签/搜索