20145308 《信息安全系统设计基础》第6周学习总结

20145308 《信息安全系统设计基础》第6周学习总结

教材学习内容总结

第四章 处理器体系结构

  • 指令集体系结构(ISA):一个处理器支持的指令和指令的字节级编码
  • 冒险:一条指令的位置或操作数依赖于其他仍在流水线中的指令

4.1 Y86指令集体系结构

  • 4.1.1 程序员可见的状态
    • 程序可见状态:每条指令都会读取或修改处理器状态的某些部分
    • 存储器:Y86用虚拟地址引用存储器位置,硬件和操作系统联合起来将虚拟地址翻译成实际或物理地址
  • 4.1.2 Y86指令
    • 只包括四字节整数操作
    • movl分为irmovl rrmovl mrmovl rmmovl
    • 四个整数指令:addl subl andl xorl
    • 7个跳转指令:jmp jle jl je jne jge jg
    • 6个条件传送指令:cmovle cmovl cmove cmovne cmovge cmovg
    • call ret
    • pushl popl
    • halt指令停止指令的执行
  • 4.1.3 指令编码
    • 指令的字节级编码:每条指令需要1~6个字节不等,第一个字节表示指令类型,分为两部分,高四位是代码部分,低四位是功能部分
    • 寄存器标识符:标识8个程序寄存器
    • 程序寄存器存在CPU中的一个寄存器文件(小的、以寄存器ID作为地址的随机访问存储器)中,指明不应访问任何寄存器时,就用ID值0xF来表示
    • 寄存器指示符字节:指定一个或两个寄存器
    • 分支指令和调用指令的目的地址是一个绝对地址
    • 指令集的一个重要性质就是字节编码必须有唯一的解释,只要从序列的第一个字节开始处理,我们仍然可以很容易的确定指令序列
  • 4.1.4 Y86异常
    • 异常处理程序
    • 信号处理程序
  • 4.1.5 Y86程序
    • 汇编器命令:告诉汇编器调整地址,以便在那产生代码或插入一些数据
    • 指令集模拟器YIS:模拟Y86机器代码程序的执行,而不用试图去模拟任何具体处理器实现的行为
  • 4.1.6 一些Y86指令的详情
    • 根据练习题可知,pushl %esp压栈的是原%esp

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

  • 实现一个数字系统需要三个主要的组成部分:计算对位进行操作的函数的组合逻辑、存储位的存储器元素,以及控制存储器元素更新的时钟信号
  • 4.2.1 逻辑门
    • AND:&&
    • OR:||
    • NOT:!
    • 逻辑门总是活动的
  • 4.2.2 组合电路和HCL布尔表达式
    • 组合电路:将很多的逻辑门组成的网
      • 两个或多个逻辑门的输出不能连在一起
      • 这个网必须是无环的
    • 多路复用器(MUX):根据输入控制信号的值,从一组不同的数据信号中选出一个
  • 4.2.3 字级的组合电路和HCL整数表达式
    • HCL中,将所有字级的信号都声明为int,不指定字的大小,HCL允许比较字是否相等
    • 多路复用函数是用情况表达式来描述的,不要求不同的选择表达式之间互斥
    • 算数/逻辑单元(ALU)是一种很重要的逻辑电路,四个操作对应于Y86指令集支持的四种不同的整数操作
  • 4.2.4 集合关系
    • 将一个信号与很多可能匹配的信号做比较,以此来检测正在处理的某个指令代码是否属于同一类指令代码
  • 4.2.5 存储器和时钟
    • 时序电路:有状态并在这个状态上进行计算的系统
    • 时钟寄存器:存储单个位或字,时钟信号控制寄存器加载输入值
    • 随机访问存储器:存储多个字,用地址来选择该读或改写哪个字(处理器的虚拟存储器系统、寄存器文件)
    • 寄存器作为电路不同部分中的组合逻辑之间的屏障,每当每个时钟到达上升沿的时候,值才会从寄存器的输入传送到输出

4.3 Y86的顺序实现

  • 4.3.1 将处理组织成阶段
    • 取指:从存储器读取指令字节,地址为程序计数器PC的值,icod指令代码、ifun指令功能、valc四字节常数、valp下一条指令的地址=PC值+已取出指令长度
    • 译码:从寄存器文件读入最多两个操作数
    • 执行:算数/逻辑单元要么执行指令指明的操作(根据ifun的值),计算存储器引用的有效地址,要么增加或减少栈指针,得到的值称为valE
    • 访存:将数据写入存储器或从存储器读出数据,值为valM
    • 写回:最多可以写两个结果到寄存器文件
    • 更新PC:将PC设置成下一条指令地址
  • 4.3.2 SEQ硬件结构
    • 取值:将程序计数器寄存器作为地址,指令存储器读取指令的字节
    • 译码:两个读端口,读寄存器valA和valB
    • 执行:根据指令的类型,将算数/逻辑单元用于不同的目的
    • 访存:数据存储器读出或写入一个存储器字
  • 4.3.3 SEQ的时序
    • SEQ的实现包括组合逻辑和时钟寄存器、随机访问存储器两种寄存器设备
    • 每个时钟周期
      • 程序寄存器都会装载新的指令地址
      • 只有在执行整数运算指令时才会装载条件码寄存器
      • 只有在执行rmmovl、pushl、call指令时才会写数据存储器
    • 处理器从来不需要为了完成一条指令的执行而去读由该指令更新了的状态
  • 4.3.4 SEQ阶段的实现
    • 取指阶段:以PC作为第一个字节的地址,这个单元一次从存储器读出6个字节
    • 译码和写回阶段:两个读和两个写端口,每个端口都有一个地址连接和一个数字连接
    • 执行阶段:根据alufun信号的设置,对输入的aluA和aluB执行ADD SUBTRACT AND EXCLUSIVE-OR运算,ALU的输出就是valE信号
    • 访存阶段:读或写程序数据
    • 更新PC阶段:依据指令的类型和是否要选择分支,新的PC可能是valC、valM或valp
    • SEQ小结:控制逻辑必须要在这些单元之间路由信号,并根据指令类型和分支条件产生适当的控制信号

教材学习中的问题和解决过程

  • 为什么popl指令执行过程中在译码阶段要读两次栈指针
  • 为了保证和pushl指令执行过程的一致性,先完成存储器的操作再更新栈指针,执行是在访存和写回阶段之前,所以执行阶段先给栈指针加4,但是要用没加过4的原始值作为存储器操作地址。写回时也要用加4的栈指针更新地址,也要用没加4的值作为存储器读地址,所以译码时要访问两次栈指针

本周代码托管截图




其他

  • 本周学习了ISA的相关内容,主要学习了Y86的体系结构,和之前学习过的HDL知识有相似之处但是仍有很多不同,学习HDL时只学习了逻辑门相关部分的代码,没有学习过HDL和汇编语言或者C语言之间的关系。通过本周的学习,理解了这些代码之间的联系

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 1/2 25/30 学习Linux指令
第二周 50/50 1/3 25/55 Linux系统下的开发环境
第三周 20/70 1/4 25/80 信息的表示和处理
第五周 20/90 1/5 30/110 程序的机器级表示
第六周 20/110 1/6 30/140 处理器体系结构
原文地址:https://www.cnblogs.com/yg961022/p/5990283.html