深入理解计算机系统阅读笔记-第四章

2024-09-07 00:12

本文主要是介绍深入理解计算机系统阅读笔记-第四章,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第四章 处理器体系结构

一个处理器支持的指令和指令的字节级编码称为它的ISA(instruction-set architecture,指令集体系结构)。不同家族处理器有不同的ISA。ISA在编译器编写者和处理器设计人员之间提供了一个概念抽象层,编译器编写者只需要知道允许哪些指令,以及他们是如何编码的;而处理器设计者,必须建造出执行这些指令的处理器。

ISA模型看上去是顺序执行的,实际上同时处理多条指令的不同部分,可以提升性能。

本章自定义设计一个Y86处理器,它的指令集称为Y86指令集。

4.1 Y86指令集体系结构

我们设计的Y86处理器,类似于IA32,包含下面四部分:
八个程序寄存器:每个寄存器存储一个字,寄存器%esp被入栈,出栈调用和返回指令作为栈指针,其他寄存器没有固定含义或固定值。
三个一位的条件码:它们保存最近的运算的相关信息。
程序计数器(PC):存放着当前正在执行指令的地址。
存储器:保存程序和数据,可以看成很大的数组。Y86用虚拟地址来引用存储器位置。硬件和软件操作系统协作将虚拟地址转换成物理地址。

下图是我们设计的Y86指令集描述,这个就是我们要设计的处理器要实现的目标。左边是汇编表示,右边是字节编码。我们使用小端法。

指令的字节编码最多6个字节(0xff是8位,一个字节
第0字节:称为指令指示符。fn字段表示是某个整数操作(OP1)或分支条件(jXX)。

我们把IA32的movl拆分成4个指令,显示地指明源和目的的类型,i立即数,r寄存器,m存储器。

opl:是4个整数操作指令addl,subl,andl,xorl。它们只对寄存器数据进行操作,这些指令会设置条件码。

jXX:跳转指令jmp,jle,jl,je,jne,jg,jge。根据分支指令类型和条件码选择分支。dest是绝对地址。

call指令将返回地址入栈,然后调到目的地址。dest是绝对地址。

ret指令从call指令的调用中返回。

pushl和popl实现入栈和出栈。

halt:停止执行指令。

fn指令字节码

如下图所示,8个寄存器都有相应的寄存器标识符。程序寄存器被存放在cpu的一个寄存器文件中,这个寄存器文件就是一个小的,以寄存器ID作为地址的随机访问存储器。图4.2中的rA,rB就对应这8个寄存器。当操作数不是寄存器时,就用ID为8的表示,图4.2中的8就是这个意思。

通过上面这些规则,我们可以把汇编语言转换成十六进制字节码,反之亦然。

例如

rmmovl %esp 0x12345(%edx)的转换过程如下:

rmmovl %esp 0x12345(%edx) -->404245230100
rmmovl = 40
%esp = rA = ID 4
%edx = rB = ID 2
0X12345 = D = 0x12345补齐8位=0x00012345 = 小端452301100

指令集的一个重要特性就是字节编码必须有唯一解释 。任何一个字节序列只能对应唯一的指令。

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

4.2.1 逻辑门

下图是3个逻辑门的标准符号,下面是对应的HCL表达式。逻辑门只对位进行操作。

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

将多个逻辑门组合起来,可以得到组合电路,有两个基本原则:

1. 逻辑门的输出不可以连到一起,因为会相互影响。

2. 这个网必须是无环的,因为该组合电路的计算函数有歧义。

两个简单的组合电路

 

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

通常需要字级操作,这就需要更复杂的组合电路,下面列了几个组合电路的符号图和HCL表达式

1. 字等于电路

2. 字等于的HCL表达式

bool Eq = (A == B);

 

 字级多路复用HCL表达式

int Out = [S: A;1: B;
];

 3. 多路选择的多路复用

HCL表达式:

int Out4 = [!S1 && !S0: A;!S1: B;!S0: C;1: D;
];

4. 取最小值 

HCL表达式:

int Min3 = [A < B && A < C: A;B < A && B < C: B;1: C;
];

算术逻辑运算单元ALU是非常重要的组合电路,其抽象如下图

 

A和B是数据输入,上方的0、1、2、3是控制输入,对应Y86指令集的四个整数操作addl,subl,andl,xorl。

4.2.4 集合关系(Set Membership)

处理器设计中,经常需要判断一个信号是否属于一组信号中的一个,使用表达式

iexpr in {iexpr1, iexpr2,...iexpr10}

4.2.5 存储器和时钟控制

为了产生时序电路(sequential circuit),也就是有状态,并且在这个状态上的系统,需要引入安位存储信息的设备,考虑如下两类:

时钟寄存器:简称寄存器,存储单个位或字。时钟信号控制寄存器加载输入值。

随机访问存储器:简称存储器,存储多个字,用地址来选择读写哪个字。常见的有处理器的虚拟存储器系统和寄存器文件。

硬件通过时钟控制化寄存器的值,如高电平保持,低电平变化。

下图是一个寄存器文件,虽然不是硬件组合电路,但原理是一样的,当向src*写入一个值后,过一段时间,就可以在val*上得到对应的值。例如向srcA设置为3,就会读%ebx的值,然后这个值就会出现在valA上。

4.3 Y86的顺序(sequential)实现

SEQ:顺序处理器

4.3.1 将处理组织成阶段

取址(fetch):从存储器读入指令,地址为PC的值。从指令中抽取出指令指示符字节两个4位部分,称为icode指令代码和ifun指令功能。取的值有多种可能:
        1. 一个寄存器指示符字节,指明一个或两个寄存器操作数指示符rA和rB。
        2. 四字节常数valC。
        人理解L取出的内容是4.1中的字节码,可以转换成汇编语言后理解。
        它按顺序的方式计算下一条指令的地址valP,valP等于PC的值加上已取出的指令的长度。

解码(decode):从寄存器文件读入最多两个操作数,得到valA或/和valB。通常它读入指令rA和rB字段指明的寄存器,也有些指令是读寄存器%esp的。

执行(execute):ALU进程工作,有如下几种:
        1. 执行指令指明的操作(根据ifun的值),计算存储器引用的有效地址;
        2. 增加或减少栈指针;
        3. 设置条件码,对于跳转指令来说,这一阶段会检查条件码和(ifun)给出的分支条件,看是否选择分支。

访存(memory):将数据写入存储器或从存储器读出数据,读出的值为valM。

写回(write back):最多可以写两个结果寄存器文件。

更新PC:将PC设置成下一条指令地址。

处理器循环执行上述几个阶段,只有在遇到halt或发生错误时才会停止。

下图展示了三个机器指令在每个阶段的动作。

以这个例子具体来看

 

第3行指令subl

 第5条指令rmmovl

第6行pushl

 

第8行je

 

第13行ret

 

4.3.2 SEQ硬件结构

通过下面的硬件抽象图,学习图中的硬件单元和各个阶段关联

取址:指令存储器将PC作为地址,读取一个指令大小的字节,PC增加器计算valP。

解码:从寄存器文件的A、B两端读取valA和valB。

执行:ALU根据指令类型进行相应计算valE,可能会设置条件码。

访存:数据存储器读出或写入一个存储器字。指令和数据存储器访问的是相同的存储器位置,但是用于不同的目的。

写回:寄存器文件有两个写端口,M端口用于写从存储器中读出的值,E端口用来写ALU计算出的值。

下图是一个更详细的SEQ所需硬件,简单说明下图形表示:

用带淡点的浅灰色方框:表示硬件单元。比如存储器,ALU等。

灰色圆角矩形:表示控制逻辑块。用于从一组信号源中进行选择,或用来计算布尔函数。

白色圆角方框:线路的名字。

中等粗的线:表示宽度为字长的数据连接。实际上代表一簇32根线。

比字长线细一点的线:表示宽度为字节或者更小的数据连接。根据数据类型,实际上代表一簇4或8根线。

点虚线:表示单个位的连接。代表芯片上单元与块之间传递的控制值。

4.3.3 SEQ的时序(timing)

提前总结,就是新周期开始的上升沿,会把逻辑组合的值更新到寄存器,计数器等状态设备。

以下图为例介绍,硬件如何执行第3、4条指令的。 

在时钟周期3开始的时候,状态元素使第2条命令结束的状态,地址0x00c载入程序计数器中,这样就会取出和处理第3条指令。值沿着组合逻辑流动,包括读随机访问存储器,在3周期末尾,组合逻辑为条件码产生了新值000,但没更新到条件码寄存器;更新了程序寄存器%ebx,以及程序计数器的新值0x00c,此时逻辑组合已经更新了,但是状态没有更新。

在时钟周期4开始的时候,有上升沿,会更新条件码寄存器,程序计数器,寄存器文件。但组合逻辑还没对这些变化做出反应。在这个周期内会取出和执行第4条指令。

4.3.4 SEQ的阶段实现

常用的HCL如下表

取址阶段:

 

4.4 流水线的通用原理

4.5 Y86的流水线实现

4.6 小结

这篇关于深入理解计算机系统阅读笔记-第四章的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1143514

相关文章

一文带你深入了解Python中的GeneratorExit异常处理

《一文带你深入了解Python中的GeneratorExit异常处理》GeneratorExit是Python内置的异常,当生成器或协程被强制关闭时,Python解释器会向其发送这个异常,下面我们来看... 目录GeneratorExit:协程世界的死亡通知书什么是GeneratorExit实际中的问题案例

深入解析Spring TransactionTemplate 高级用法(示例代码)

《深入解析SpringTransactionTemplate高级用法(示例代码)》TransactionTemplate是Spring框架中一个强大的工具,它允许开发者以编程方式控制事务,通过... 目录1. TransactionTemplate 的核心概念2. 核心接口和类3. TransactionT

深入理解Apache Airflow 调度器(最新推荐)

《深入理解ApacheAirflow调度器(最新推荐)》ApacheAirflow调度器是数据管道管理系统的关键组件,负责编排dag中任务的执行,通过理解调度器的角色和工作方式,正确配置调度器,并... 目录什么是Airflow 调度器?Airflow 调度器工作机制配置Airflow调度器调优及优化建议最

一文带你理解Python中import机制与importlib的妙用

《一文带你理解Python中import机制与importlib的妙用》在Python编程的世界里,import语句是开发者最常用的工具之一,它就像一把钥匙,打开了通往各种功能和库的大门,下面就跟随小... 目录一、python import机制概述1.1 import语句的基本用法1.2 模块缓存机制1.

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的

深入理解Redis大key的危害及解决方案

《深入理解Redis大key的危害及解决方案》本文主要介绍了深入理解Redis大key的危害及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、背景二、什么是大key三、大key评价标准四、大key 产生的原因与场景五、大key影响与危

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于