2018-2019-1 20175319 《信息安全系统设计基础》第四周学习总结
教材学习内容总结
HCL简介
- HCL表达式中的运算符
- 组合电路:多个逻辑门组合成网就能构成计算块
- 每个逻辑门的输入必须连接到下述选项之一:
- 一个系统输入(称为主输入)
- 某个存储器单元的输出
- 某个逻辑门的输出
- 两个或多个逻辑门的输出不能连接在一起。
- 这个网必须是无环的。
- 每个逻辑门的输入必须连接到下述选项之一:
HCL整数表达式
- 情况表达式
通用格式:
[
select 1 : expr 1
select 2 : expr 2
...
select k : expr k
]
- 算数/逻辑单元(ALU)
- 集合关系
iexpr in { iexpr1,iexpr2,…,iexprk }
其中iexpr为被测试的值,iexpr1~iexprk位待匹配的值,他们均为整数表达式
存储器和时钟
- 按位存储信息的设备
-
时钟寄存器:简称寄存器,存储单个位或字。Y86-64中使用时钟寄存器保存程序计数器PC、条件代码CC和程序状态Stat。
- 硬件寄存器:将其输入和输出的线连接到电路的其他部分。当时钟上升沿到来才会加载新的输入信号并输出,是电路不通部分中组合逻辑之间的屏障。(后续我们介绍的寄存器是指硬件寄存器)
- 程序寄存器:CPU中为数不多的可寻址的字,这里的地址为寄存器ID,这些字通常都存在寄存器文件(不是组合电路)中。
-
随机访问存储器:简称内存,存储多个字。
处理器中用来存储程序数据的随机访问存储器示意图如下:
-
寄存器组成
-
寄存器操作
当时钟到达上升沿时,值从寄存器的输入传送到输出
-
程序员可见状态
- 程序员
- 用汇编代码写程序的人
- 产生机器级代码的编译器
- 可见状态
-
15个程序寄存器(RF)
每个程序寄存器存储一个64位(即8字节)的字,这与Y86-64指令集的指令长度相匹配。 -
3个条件码(CC)
- ZF:零标志
- SF:符号标志
- OF:溢出标志
-
程序状态(Stat)
-
程序计数器(PC)
程序计数器存放着当前正在执行指令的地址,计算下一条指令的地址时要根据当前指令的编码长度,例如当前指令的长度为10字节,则下一条指令的地址就在当前PC的值的基础上加10. -
内存(DMEM)
内存是个很大的字节数组,存放程序和数据。我们常常用M[XXX]来表示内存中以XXX为地址的数据
-
Y86-64指令
- Y86-64程序寄存器标识符
- 寄存器标识符范围:
0-0xE - 程序寄存器的存储:
寄存器文件 - 不应访问任何寄存器时:
用0xF表示
- 寄存器标识符范围:
- Y86-64指令编码
- 编码长度:1字节~10字节
- 编码组成:
- 一个单字节的指令指示符
- 一个单字节的寄存器指示符
- 一个八字节的常数字
- halt指令:用于停止指令的执行
- 该指令占1个字节
- 用十六进制表示为「00」
- nop指令:占位指令。
- 该指令占1个字节
- 用十六进制表示为「10」
- rrmovq rA,rB指令:将rA寄存器中的值放入rB寄存器中
- 该指令占2个字节
- 用十六进制表示为「20 rArB」
- irmovq V,rB指令:将立即数V放入寄存器rB中
- 该指令占10个字节
- 用十六进制表示为「30 FrB V」,“V”为八字节小端方式存储的立即数
- rmmovq rA,D(rB)指令:将rA寄存器中的值放入以“rB+D”为地址的内存单元中
- 该指令占10个字节
- 用十六进制表示为「40 rArB D」,“D”为八字节小段方式存储的代表偏移量的数
- mrmovq D(rB),rA指令:将以“rB+D”为地址的内存单元中的数放入寄存器rA中
- 该指令占10个字节
- 用十六进制表示为「50 rArB D」,“D”为八字节小段方式存储的代表偏移量的数
- OPq rA,rB指令:将寄存器rA和寄存器rB中的值做整数运算,并把结果存入rB寄存器中
- 该指令占4个字节
- 用十六进制表示为「6fn rArB」,fn代表指令的“功能码”,由具体执行“addq、subq、andq、xorq”中的哪条指令决定fn的值
- jXX Dest指令:跳转指令,跳转到以Dest为地址(准确的说是逻辑地址)的代码处,根据分支指令的类型(处理器根据fn确定)和条件码的设置来选择分支
- 该指令占9个字节
- 用十六进制表示为「7fn Dest」,fn为功能码,由具体执行指令决定fn的值,对应关系如图;Dest为用小端方式表示的8字节绝对寻址方式的地址值
- cmovXX rA,rB指令:条件传送指令,其指令格式同rrmovq指令,不同点是只有当条件码满足需要的约束时才会更新目的寄存器的值
- 该指令占2个字节
- 用十六进制表示为「2fn rArB」,fn由具体执行“rrmovq cmovle cmovl cmove cmovne cmovge cmovg”中的哪条指令决定。
- call Dest指令:将返回地址入栈,然后跳到Dest指向的目的地址
- 该指令占9个字节
- 用十六进制表示为「80 Dest」,Dest的作用类似于条件跳转指令
- ret指令:从call指令的调用中返回
- 该指令占1个字节
- 用十六进制表示为「90」
- pushq rA指令:入栈指令,将rA寄存器中的值压入栈顶
- 该指令占2个字节
- 用十六进制表示为「A0 rAF」
- popq rA指令:出栈指令,将栈顶元素弹出到rA寄存器中
- 该指令占2个字节
- 用十六进制表示为「B0 rAF」
- Y86-64指令集的功能码
高四位:代码部分
低四位:功能部分,即fn
字节序列转换为Y86-64指令的方法
- 通过代码部分确定指令长度,从而以指令为单位划分字节序列;
- 通过功能部分确定具体的指令;
- 通过寄存器指示符字节确定指令中涉及的寄存器;
- 通过转换数值部分以小段法编码的数字来确定立即数、偏移量、绝对地址等值。
常用操作
- xorq %rax,%rax:用异或来给某个数置零
- andq %rsi,%rsi: 自身相与来设置条件码,判断一个数是否为0
- 用pushq ……和popq ……来保护某个寄存器中的值
- 用xorq %r11,%r11和subq %r10,%r11加上跳转语句jle……来取一个数的绝对值
将处理组织成阶段
- “六阶段”框架
- 取值(fetch):从内存读取指令字节,地址为程序计数器PC的值,同时给valC(从指令字节中读取的数值)和valP(根据当前指令长度计算出的下一条指令PC值)赋值。
- 译码(decode):从寄存器文件 读入最多两个操作数,记为valA和valB。
- 执行(execute):算数/逻辑单元(ALU)根据指令的功能部分计算内存引用的有效地址或修改栈指针。计算结果记为valE。
- 访存(memory):将数据写入内存或从内存读出数据。读出的数据记为valM。
- 写回(write back):最多写两个结果到寄存器文件。
- 更新(PC update):将PC设置成下一条指令的地址。
- 所有指令必需经历的三个阶段:
- 取值
- 执行
- 更新PC
- 不经历译码阶段的指令:
- irmovq 指令
- JXX 指令
- 不经历访存阶段的指令:
- OPq 指令
- rrmovq 指令
- irmovq 指令
- JXX 指令
- 不经历写回阶段的指令:
- rmmovq 指令
- JXX 指令
SEQ硬件结构
- 抽象视图
- 硬件结构
SEQ的时序
- 组合逻辑:不需要任何时序或控制——只要输入变化,值就通过逻辑门网络传播
- 存储器设备
- 时钟寄存器(程序计数器和条件码寄存器)
- 随机访问寄存器(寄存器文件、指令内存和数据内存)
- 时序控制
- 程序计数器
- 条件码计数器
- 数据内存
- 寄存器文件
- 组织计算时遵循的原则
- “从不回读”
处理器从来不需要为了完成一条指令的执行而去读由该指令更新了的状态。 - 当一个时钟的上升沿到来时,状态单元(程序计数器、条件码寄存器、寄存器文件和数据内存)是根据前一条指令设置的。
- “从不回读”
SEQ阶段的实现
- HCL描述中使用的常数值:
注:条件传送指令“comvXX”的指令代码为IRRMOVQ。 - 取值阶段:
- 指令字节
- inode
- ifun
- 三个一位信号
- instr_valid:判断该指令是否是一个合法指令(即是否以0-B开头),用于发现不合法指令
- need_regids:判断该指令是否包含寄存器指示符字节
- need_valC:判断该指令是否包含一个常数
- PC增加器
新的IP值=p+1+r+8*i
- 指令字节
- 译码和写回阶段
寄存器文件有四个端口,它支持同时进行两个读(端口:A、B)和两个写(端口:E、M),底部四个块dstE、dstM、srcA、srcB产生四个不同的寄存器文件的寄存器ID,以“src-”开头的表明要从哪个寄存器中读,“dst-”开头的表明要写入哪个寄存器中。
- 执行阶段
执行阶段包括算数/逻辑单元(ALU),它根据alufun信号(来源:icode和ifun)的设置,对输入aluA和aluB进行整数运算,或作为加法器。根据ALU的值(valE)设置条件码寄存器,检测条件码的值,判断是否该选择分支。标号“cond”的硬件单元会根据条件码和功能码来确定是否进行条件分支或者数据传送。它产生信号Cnd,用于设置条件传送dstE,Cnd信号可以被置为0或1。
- 访存阶段
任务是读或者写程序数据,下侧两个控制块产生内存地址和内存输入,左侧两个控制块表明应该执行读操作还是写操作,其中内存读和写的地址“Mem.addr”总是valE或valA,其中内存写的数据“Mem.data”总是valA或valP
- 更新PC阶段
考试错题总结
- 1
答案:ABE - 2
答案:ABD
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 101/101 | 1/1 | 20/20 | |
第二周 | 49/150 | 1/2 | 18/38 | |
第三周 | 22/172 | 1/3 | 11/49 | |
第四周 | 29/201 | 1/4 | 21/70 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:XX小时
-
实际学习时间:XX小时
-
改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)