深入理解计算机系统 ——CAEer 视角
说在前面
一、写作目的
依托于“计算电磁学”的发展,电磁 CAE 技术已经深刻的改变了硬件设计流程,但是仅仅依赖于 CAE 商用软件的仿真计算以及设计师的手动调参或者相对低层次的自动扫参功能,越来越难以支撑起卓越的硬件设计。学习和掌握最前沿的设计理念、优化策略,依靠扎实的数理基础将问题转化为数理模型,并依托坚实的编程素养将定性的设计理念数字化、程序化,深度嵌入硬件的设计阶段,会否给硬件设计带来更多可能?这也正是这篇文章的“缘起”。
作为计算机门外汉的作者,学习”计算机系统“的过程大致分为三个阶段:
入门,学习始于 2021 年 11 月初的B站《计算机科学速成课》、《从 0 到 1 设计一台计算机》科普视频的系统学习,结合日本计算机科普作家矢泽久雄的两本科普读物《计算机是怎么跑起来的》、《程序是怎么跑起来》,完成了计算机硬件系统的入门。
深入,主要依托B站“王道考研”视频《计算机组成原理》(正文大量配图的来源)的系统学习,结合高分计算机经典黑皮书《深入理解计算机系统》(作者 Randal E. Bryant)的深度阅读,完成了”计算机系统“的深入学习,在此基础上进行消化-吸收-输出,最终完成计算机系统知识体系的初步搭建。
实践,理论体系建立完毕后,通过对笔记本主板的拆解和再认识,完成了对知识体系的简单实践。
基于“体系完整、架构清晰、层次递进”的原则,文章将力图系统而通俗的介绍关于“计算机系统”的种种,希望能够助力电磁 CAE 设计师入门。受限于作者专业和认知水平,文中所述难免有所偏颇,还望斧正。
二、内容涉及
本文将从三个方面展开:
1.底层认知:计算机系统大致是这样组成的,底层为计算机硬件(计算机组成原理),其上为操作系统,再上面就是各种软件应用(算法与数据结构),这样就构成了一台功能完整的计算机,而计算机之间的连接则通过计算机网络实现。本文作为缩水版的“计算机系统”,将着重介绍上层以高级语言编写的“代码”在运行的过程中,计算机的底层“软 / 硬件”的实现过程。
2.深入理解:完成了计算机组成原理的底层认知的阐述后,想要深入了解的同学,就需要将计算机组件的封装打开,更加具体的探索构成计算机系统的各子系统的结构组成、功能以及实现机理。这部分内容始终围绕“硬”和“软”两个方面进行阐述,“硬”的部分将深入计算机内部,详细介绍计算机的硬件系统架构以及其中各硬件分系统(存储系统、中央处理系统、总线系统以及 I / O 系统)的结构组成和运行机理;“软”的部分则要详细介绍以“0/1”二进制为基础的信息表示和处理方法、控制计算机硬件协调工作的“指令系统”构造方式、运行机理以及各硬件分系统内部维持其有序工作的“规则”和“策略”。
如果将计算机系统比作为一家公司的话,那么“硬”的部分就类似于由基本要素“人”(类似晶体管)构成的各职能部门(类似硬件分系统)以及将这些职能部门框起来的“组织架构”;“软”的部分则类似于建构于“核心理念”之上的各种“规章制度”。硬和软共同保障了公司的有序经营。
3.认识主板:“计算机系统”承载体的最佳案例应该就是个人电脑的主板,初识“主板”,如同毛细血管一般的 PCB 走线、密密麻麻的电路元器件以及大量被引脚包围的集成电路芯片可能会引起你的生理不适,分析更无从下手。当深入了解并构建了相对完整的“计算机系统”的体系后,再看“主板”,会否有不一样的认识?这一过程本身亦是加深对“计算机系统”认识的有益实践。
底层认知
一、什么是计算机系统
计算机是迄今为止最为复杂的一个系统之一,其作用在于按照确定的顺序完成认类预设好的指令,而这些预设好的指令就是我们所熟知的程序。
所谓复杂系统,一方面因为其构成元素的晶体管数量十分巨大,一颗指甲盖大小的 CPU 核心就包含数以亿级的晶体管,另一方面在于其功能十分强大,简单的堆数量并不能成就强大的系统,计算机系统的强大源于其将海量的晶体管进行互连、按照严密的组织规则让其分工、协作,从而实现了远超个体能力的复杂功能。这与细胞-器官-智慧生命的实现逻辑一致。”计算机系统“正是关注这个复杂系统的搭建过程以及工作机理:1)硬件层面,晶体管-计算机组件-功能完善的计算机;2)软件层面,0/1 二进制-信息的表示与处理-指令系统。
二、计算机的基本组成
现在我们自顶而下开始简单认识一下计算机硬件系统的具体组成。计算机硬件系统的基本组成包括两个部分:1)主机(计算机核心部分);2)I / O 设备(键盘、鼠标、显示器、光驱等)。其中主机由 CPU 和主存组成,CPU 则主要包括运算器(执行逻辑、算术运算)和控制器(指挥程序的运行),主存用以存放程序和数据。
打开任意笔记本的销售页面,配置参数表均介绍了该计算机的主要性能参数,其中最主要的参数正是:1)CPU 型号;2)内存(即主存)容量;3)硬盘容量(即辅存容量)。
CPU 的主要功能就是执行指令,结构组成主要包括运算器和控制器,各组件的功能为:
运算器:就像是搬砖的,主要工作就是埋头执行各种算数运算和逻辑运算,主要组成有:1)算术逻辑单元:用以执行各种算术和逻辑运算;2)通用寄存器,用以存放待运算的操作数;3)累加器,用以存放操作数和运算结果;4)乘商寄存器,用以辅助乘商计算。
控制器:就像是工头,主要工作就是指挥运算器执行各种指令,主要组成有:1)控制单元:分析指令,给出控制信号;2)指令寄存器:用以存放待执行指令;3)程序计数器:用以存放下一条指令的地址。
主存储器就是一个临时货柜,用以存放待运行程序翻译而成的各种指令(数据),组成包括三个部分:1)存储体,其如同货柜一样存放着海量的程序或数据;2)MAR,地址寄存器,临时存放待取程序或数据的地址(如同取件码);3)MDR,数据寄存器,临时存放待取程序或数据(就如同待取包裹)。
三、计算机的组织形式
复杂、庞大的系统想要运行有序,就必须要一套科学合理的组织架构保驾护航,就如同大公司的组织架构,计算机各部组件相互之间分工协作需要通过计算机硬件架构来进行保障。计算机硬件的组织形式主要分为两种:1)冯-诺伊曼结构;2)现代计算机结构。
冯-诺伊曼结构
计算机科学家冯-诺依曼确立了现代计算的基本组成以及组织架构,即“冯-诺依曼结构”,结构组成包括运算器、控制器、存储器、输入设备以及输出设备五大部分,组织结构如下图所示,结构特点是以 CPU 为中心的组织形式,所有数据流动、程序运行以及结果输出均由 CPU 执行和居中协调。
如果将计算机比作一个公司的话,五大部件大抵可以做如下类比,运算器就如同生产部门,存储器就如同仓储部门,所有的采购原材料以及加工好产品的产品都需要经过生产部门,再送达仓储部门等相关部门,这显然让生产部门做了很多职责范围外的活,降低了生产效率。因此现代计算机结构对五大部件的组织形式进行了优化,那便是“现代计算机结构”。
现代计算机结构
现代计算机结构以存储器为核心,所有输入的数据 / 程序以及输出的计算结果,均先存入存储器,然后在被送往 CPU 进行执行或送至输出设备。现代计算机结构有效的为 CPU 减负,让 CPU 更加专注的进行指令执行,大幅提高了效率。
四、计算机的运行过程
以上,我们就基本完成了一个计算机硬件系统的搭建,那么这个系统是如何工作的,各部组件之间又是如何分工协作,确保预先设置的指令畅通无阻的运行的。
过程大致是这样的:当你打开手机上的某个 App 时,后台其实是用高级语言编写的代码在运行,这些代码经过一个叫编译器的东西翻译成计算机硬件认识的机器语言(一行行二进制代码),然后经由 I / O 装入主存的存储体中。
当以机器语言表示的指令和数据装入主存后,CPU 就开始访问主存提取指令并开始执行,具体过程如下所示:
step1: 程序计数器 PC 指向当前指令地址#01,并将地址送至主存的地址寄存器 MAR;
step2: 存储体根据 MAR 的取件码,将对应位置的数据发给数据寄存器 MDR;
step3:MDR 将指令发给控制器的指令寄存器 IR,进行指令分析;
step4:IR 将指令的操作码发给控制单元 CU,将地址码发 MAR,CU 依据操作码通知运算器要进行何种操作;
step5: 存储体根据 MAR 的取件码,将#04 地址对应的数据经由 MDR 传给运算器的 ACC 进行运算。
如此这般,就大致了解了计算机的各硬件是如何协作,确保程序顺利运行的。
深入理解
入门之后,该部分将从“软件”和“硬件”两个方面,正式深入计算机各分系统,介绍它们的结构组成、工作机理。
一、信息的表示与处理
二进制是信息科学的基础,就如同晶体管是计算机硬件系统的基础。现代计算机存储和处理以二值信号表示的信息。这些普通的二进制数字,或者位(bit),形成了数字革命的基础。
我们熟悉的数学理论是建立在关于十进制的信息表示和处理的理论基础之上的,但是十进制的每一个位状态包含 10 种(0~9),状态过多,不利于工程实现,然而二进制的一个位状态只包含两种(0,1),存储和处理信息的机器时,二进制值工作得更好。二值信号能够很容易地表示、存储和传输,例如,可以表示为穿孔卡片上有洞或无洞、导线上的高电压或低电压,或者磁场引起的顺时针或逆时针。
本章主要分为三部分内容:1)信息存储,主要介绍关于二进制理论基础的一些基本概念;2)整数的表示与计算,介绍利用无符号数和二进制补码对整数进行表示和运算的理论基础;3)浮点数的表示与运算,介绍利用二进制版本的科学记数法表示实数的方法及其相关运算性质。
1.信息存储
1.1 进位计数制
我们生活的现实世界是建立在十进制基础之上的,而计算机硬件却只能读懂 0/1 二进制语言,两个世界要建立紧密的联系就离不开各种进制之间的转换。最常见的就是十进制、二进制、8 进制以及 16 进制之间的相互转化。其中十进制、8 进制以 16 进制与二进制之间相互转化方式如下,十进制、8 进制以及 16 进制三者之间的相互转化可以通过二进制中转实现。
1.2 字
大多数计算机使用 8 位的块,或者叫做字节,来作为最小的可寻址的存储单位,而不是对存储器中的每一个位(bit)进行访问,存储器的存储体可以被视为一个非常大的字节数组,称之为虚拟存储器的每一个字都有一个“门牌号”,即为地址。所有地址组成的集合为虚拟内存地址空间,空间的大小就是计算机的字长,如 32 位计算机,虚拟地址的空间限制为 4GB,64 位就是 8GB。
1.3 数据大小
常用的数据类型有这么几种,字符型、整数型以及浮点型,其中字符型一般用来存储字符串中的单个字符,整数型则用来存储各种长度的整数,浮点型则是用来存储不同精度的浮点数。
1.4 寻址和字节顺序
如果一个数据跨越多个存储字节,那么就必须要对数据的存放顺序进行规定,几乎所有机器,多字节对象都被储存在连续的字节序列中。对表示一个对象的字节序列排序,由两种通用的规则:1)大端模式;2)小端模式。
如图所示,在地址#1~#4 所指向的内存中,存储 16 进制数据 01234567H,其中“01”表示数据的高有效位(8bit),“67”表示数据的低有效位,则将高有效位放在前面为大端模式;将高有效位放在后面为小端模式。
1.5 字符串
字符串是由一个个字符组成的,而在计算机中,每一个字符与“0/1”建立联系是通过 ASCII 编码(8bit)的方式来实现的,其中 ASCII 值为 16 进制表示。
1.6 常见运算
1、位级运算
所谓位运算,即以二进制表示的数据的每一位可以作为一个个体进行相应的布尔运算,主要运算为与 &、或 |、非~ 以及异或 ^,可以参与位运算的数据类型为任意“整型”(如 char、int、short int、long int 和 unsigned int)。
2、逻辑运算
逻辑运算(或 ||、与 &&、非!)的运算性质与位级运算显著不同,功能也完全不同,逻辑运算认为所有的非零数据均为 TRUE,而数据零为 FALSE,运算的结果为 1 或 0,代表 TRUE 或 FALSE。
3、移位运算
移位运算,以向左或者向右移动位模式。左移表示为 x<<k,丢弃左端的 k 位,低位补 0;右移表示为 x>>k,但是右移的具体操作则份两种情况:1)逻辑右移为高位补 0;2)算术右移为高位补最高有效位,具体操作如下图所示。对于无符号数据,右移必须为逻辑的,对于有符号数据,几乎所有的机器都默认算术移位。
2.整数的表示与运算
本节将介绍整数的两种表示方式,一种只能表示非负数,另一种则能够表示负数、零和正数。其数学属性与后续的机器级实现有很强的关联。
2.1 整型数据类型
2.2 无符号数与二进制补码
所谓无符号数,就是没有“+/-”号的数,其只能表示非负数,其二进制编码表示与真值之间的映射关系为:
即 w 位的无符号二进制编码,其真值可以上述公式进行计算,其建立了二进制编码
对于有符号数(即包含“+/-”号),则需要给符号位编码,以区分正负数。具体执行有两种方案:
原码(S)表示,将最高有效位作为符号位,其真值计算可表示为 B2S,由下图可知,最高有效位(符号位)决定了真值的正负,其他位仅决定绝对值的大小;
补码(T)表示,将最高有效位定义为负权,其真值的计算可以表示为 B2T,由下图可知,其真值结果表示为负数 + 正数,其中负数有无取决于最高有效位(负权位),而正数的大小则取决于其他位。
需要说明的是,原码在表示有符号数的时候存在一些先天缺陷,如下图所示:+5 和-5 的原码定义下的二进制表示相加后结果为-10,显然与实际不相符,而使用补码定义,则计算结果为 0,与实际吻合。因此,有符号数的表示绝大部分情况下都是用补码方案。
不同类型的数据的二进制表示以及其真值的计算方法如下图所示,其中有符号数的反码定义为原码到补码转换的过渡形式,实际没什么作用。
2.3 有符号数与无符号数之间的转化
所谓有符号数和无符号数的转化,其实并没有改变二进制的位表示,只是因为二进制数每一个“位”的解释因为有符号数和无符号数的定义的不同而不同,从而导致二进制数所表示的真值发生变化。
从二进制补码到无符号数的转换,通过公式和图示,分别如下图所示:
从无符号数转换到二进制补码,则正好反过来,公式和图示分别如图所示:
2.4 数字的扩展与截断
常见的运算比如不同字长的整数之间进行转换,字长短的二进制数转换至字长长的二进制数,则需要扩展位,字长长的数转换至字长短的数,则需要进行截断。
二进制补码和无符号数的扩展的方式也有所不同:1)无符号数的扩展为高位补 0;2)二进制补码的扩展则是高位补最高有效位。这种扩展规则的制定,是保证扩展前后的二进制所表示的真值没有发生变化。
截断会改变二进制所表示的真值,对于无符号数字 x,截断它到 k 位的结果就相当于计算
2.5 整数运算
整数的运算主要围绕无符号数和二进制补码展开的,常用的运算主要有:1)加法运算;2)非运算;3)乘法运算;4)乘以 2 的幂运算;5)除以 2 的幂运算。
对于加法运算,我们通常关心计算结果有无溢出的情况,对于无符号数和二进制补码,其加法计算结果如下所示:
对于乘法运算,我们可以看到,无论是无符号数亦或是二进制补码运算,乘法运算都可等效的通过“位”截断来实现,无需添加专门的乘法器即可实现,体现出了极大的便利性。其中无符号数和二进制补码的乘法运算结果分别如下所示:
对于乘以 2 的幂和除以 2 的幂运算,计算过程可以通过移位运算来实现,从而大幅提高了运算便利性。其中:1)乘以
3.浮点数的表示和运算
3.1 浮点数表示
浮点数表示形式为
需要说明的是:针对指数的编码是否为全 0/1,浮点数编码对应的真值存在两种计算方法:
指数编码既不是全 0 也不是全 1 时,此时浮点数为规格化值,其中指数域
当指数编码全为 0 时,浮点数为非规格化值,此时
当指数编码全为 1 时,浮点数为特殊值,当小数域为全为 0 时,表示无穷,s=0,为
3.2 浮点数运算
浮点数的加法运算,不同于整数的加法运算性质,缺失了很多属性(比如不满足结合律和分配律),这里就不再赘述。
4.小结
“十进制”是现代所有和“数字”相关理论的基础,其是我们表征世界最熟悉的一种“方式”,而作为信息世界的基础,“二进制”则提供了另外一种“方式”,因此建立两种“方式”的联系必不可少(进制转化),同时需要基于“二进制”,来表征各种数字(无符号数、有符号数、定点数、浮点数等)并阐明各类数学运算的性质,而这些就是第一章所要介绍的全部。
二、存储系统
存储系统就如同计算机系统中的“仓库”,用于存放程序、指令、数据等各类信息,将分为三个部分展开:1)什么是“存储系统”,介绍存储器的抽象模型以及基于存取速度梯度而成的层次结构;2)为什么称之为“系统”,介绍纷繁多样的存储技术,并基于“局部性原理”的存储系统的金字塔结构;3)“存储系统”如何运行,重点介绍存储系统结构组成以及其中最为重要的“主存”和“高速缓存”,阐述它们是如何与 CPU 协调共事,顺利完成数据存取。
1.什么是“存储系统”
1.1 抽象层面的认识
如上图所示,到目前为止,在我们对计算机系统的研究中,我们依赖于一个简单的计算机系统模型,CPU 执行指令,而存储器为 CPU 存放指令和数据。在这个简单模型中,存储器系统是一个线性的字节数组,而 CPU 能够在一个常数时间内访问每个存储器位置。再具体一点,就如下图所示,其包含一个存储体(用以存放数据),然后就是两个接口(地址接口,数据接口),虽然至今为止这都是一个有效的具体模型,但是它没有反映现代系统实际工作的方式。
1.2 层次结构
实际上,存储器系统(memory system)是一个具有不同容量、成本和访问时间的存储(storage)设备的层次结构。CPU 寄存器保存着最常用的数据。靠近 CPU 的小的、快速的高速缓存存储器 (cache)的缓冲区域。主存暂时存放存储在较大的慢速磁盘上的数据,而这些磁盘常常又作为存储在通过网络连接的其他机器的磁盘或磁带上的数据的缓冲区域。
2.为什么称之为“系统”
2.1 存储技术的多样性
信息技术发展至今,存储技术日新月异,如何存储二进制信息,方式也十分丰富。
按照存储介质的类型,存储器可以分为:1)半导体存储器(主要用于主存和 Cache);2)磁表面存储器(主要有磁盘和磁带);3)光存储器(主要有光盘等)。
其中,半导体存储器发展迅速,也有很多分类:
SRAM 为静态随机访问存储器:其存储单位为一个双稳态电路,每个单元用用 6 个晶体管电路实现,只要有电,其可以无限期的保持两个电压配置或稳定状态,电路复杂度相对较高,因此成本相对较高,一般用于高速缓存和 CPU 中的寄存器;
DRAM 为动态随机访问存储器:其每一个位的存储元器件位电容,通过电容的充放电来表征二进制 0/1 状态,DRAM 的存储单元对对干扰非常敏感,成本较 SRAM 便宜很多,一般用于主存(内存条)。
ROM(read only memory)只读存储器,只能读,不能写。不同于 RAM(断电之后,DRAM 和 SRAM 存储的信息就会丢失),ROM 属于非易失性存储器,即使关掉电源,其存储的信息也不会丢失。存储在 ROM 设备中的程序通常被称为固件(firmware),当计算机通电后,它会运行存储在 ROM 中固件。一些系统在固件中提供了少量最基本的输入输出函数(如 BIOS 例程),复杂设备,如图形卡和磁盘驱动器,也依赖固件翻译来自 CPU 的 I / O 请求。
磁盘:结构组成包括盘片(存储数据)、主轴(带动盘片旋转)以及读写头(读取盘片上的信息)。盘片位磁盘的核心部件,上面划分为了许多同心圆(磁道),磁道上交替分布了许多扇区(扇区之间使用间隙进行分割),磁盘以扇区位为单位进行数据存储。
2.2 存储器的搭建原则
以上,我们知道二进制 0/1 信息的存储方式由许多种,在计算机系统的搭建时,我们该如何去选择这些存储器呢?
诚如上面所介绍的那样,虽然以上的设备都可以存储信息,但是它们的性能和成本却相去甚远。
正因如此,为了兼顾计算机系统的成本、容量(存储字数 * 字长)以及速度(数据宽度 / 存储周期),计算机存储设备不是简单的选择哪一种技术体制,而是
依据存储设备距离计算机大脑(CPU)的远近,按照传输速度的由快至慢来布局存储系统。从而形成了“金字塔结构”的存储系统布局设计。
如图所示,以我的笔记本电脑的存储系统为例,其基本组成为:1)CPU 中配备了三级高速缓存(L1 / L2 / L3),容量分别为 256KB、1.0MB 和 6.0MB,依次增大;2)电脑主存为 7.9GB 的 DRAM;3)辅存磁盘为 239GB 的 SSD(固态硬盘)。可以看出,存储设备越远离 CPU,存储容量越大。
2.3 局部性原理(可行性基础)
如上文所说,为了平衡容量、成本和传输速度,我们设计了一个“金字塔形式”的存储系统层次结构,这样的结构能否实现数据在存储系统各存储设备之间顺畅的“上上下下”,保证计算机系统的畅通运行?
“局部性原理”为这个结构的合理性提供了理论基础。所谓局部性原理,即一个编写良好的计算机程序倾向于引用的数据项临近于其他最近引用过的数据项,或是临近于自我引用的数据项。这一原理对软件系统和硬件系统的设计都有着极大的影响。局部性通常由两种形式:1)时间局部性,即被引用过一次的存储器位置可能在不远的将来被多次引用;2)空间局部性,即一个存储器位置被引用了一次,那么程序可能在不远的将来引用附近的存储器位置。
局部性原理在工程中有着现实的需求,比如说硬件层面,计算机通过引入高速缓存,提前将主存中位置相邻的数据集拷贝至高速缓存,从而利用高速缓存的速度优势,提高数据传输速度。
3.“存储系统”如何运行
3.1 系统结构组成
上面,我们知道了存储系统中的各设备是按照其与 CPU 的“远近亲疏”,层次渐进的构成了一个“金字塔结构”布局。本节,我们将深入了解这些存储设备相互之间以及与 CPU 之间究竟是如何连接以及分工写作的。
如上图所示,数据在存储系统的运行过程大致是这样的:1)各种应用 App 都被安装在计算机的 C 盘 / D 盘(ROM)中,由于 ROM 的非易失性,即使断电,安装在里面的 App 也不会被删除;2)当你打开电脑,启动微信 App 时,相关运行程序就会被拷贝到主存中,开始运行;3)高速缓存载从主存中拷贝数据 / 程序子集,以备 CPU 及时调用;4)CPU 从高速缓存中取指令、数据进行处理,输出预期的结果给使用者。
3.2 主存
以上的叙述,我们还是将主存作为一个抽象的黑匣子进行分析,现在我们将要深入主存内部,去一探主存的组成和运行机理。
主存的基本组成
由上文可知,主存的基本组成包括三部分:1)存放数据的存储体,其类似于货柜,一个个数据如同包裹;2)地址寄存器,用以存放 CPU 待取数据的地址,就如同取包裹时的取件码;3)数据寄存器,用以临时存放 CPU 待取数据,就如同待取的包裹。三者之间的有序开展有赖于时序控制逻辑协调。
继续深入存储体的结构细节,就是密密麻麻的集成电路组成,其基本组成如下图所示:存储体被绿色纵线和红色横线划分成很多小方块(构成存储矩阵),每个小方块就是一个存储“位”,它由一个 MOS 管和一个电容构成,其中电容就相当于“蓄水池”,可以存水,亦可以放水,有水就是“1”,没水就是“0”;MOS 管则相当于水管阀门,控制是否存水或防水,对应的就是是否“写入”或“读出”电容里的数据。因此连接水管出水口的“绿线”就是写入或者读出存储单元里面的数据,将 8 个存储“位”就构成一个存储“字”,而连接开关阀门 G 的“红线”就决定是否允许相应的单元被写入或读出数据,将红线统一连接到地址寄存器,就可以通过地址寄存器的数据控制哪个位置的数据被选通。
其实将“红线”直接连接地址寄存器(MAR)是相当浪费的,因位红色控制线终究只有一根线导通(对应“1”),而其他线均关闭(对应“0”),所以 n 条地址线仅仅确定了 n 个状态,资源浪费,通过桥接一个译码器,就可以通过 n 位地址线控制个状态,从而充分利用资源。通过读写控制线确定当前存储器的读写状态。
忽略电路细节,主存就是一个包含着一组地址线引脚和数据线引脚的封装芯片,外加读写控制线引脚,以及片选线引脚(由于主存芯片由多个芯片并行而成,片选线控制使用哪一个存储芯片)。
存储器的总容量 = 存储单元数 * 存储字长(存储单元包含的位数),如 8KB,其中 1B(字)=8bit (位),所以 8KB=8K*1B=8*8bit,即地址线有 13 位,数据线 8 位。
主存与 CPU 的连接
以上,我们算是把主存剖析清楚了,那么主存又是如何与 CPU 进行连接的,实现 CPU 自由读取贮存在中的数据呢。其实很简单,数据线连数据线,地址线连地址线即可。
如果主存的容量无法满足 CPU 的需求,可以通过存储器扩展来解决,扩展的方式有两种:
主存的位数不够(相当于快递柜的尺寸太小,放不下大包裹),则可以通过位扩展的方式(快递柜扩容)实现;
主存的字数不够(存储单元的数目不够,相当于快递柜数目太少,放不了太多包裹),则可以通过字扩展的方式实现。
3.3 高速缓存
高速缓存的产生的背景是计算机技术的快速发展致使主存传输数据的速度越来越无法匹配 CPU 的运算速度,从而严重影响了计算机的运行速度。
解决方法就是,CPU 和主存之间增加一个传输速度更快的高速缓存,用以拷贝主存中即将执行的程序,以备 CPU 运算调用。这一策略就如同京东快递和其他快递的区别,京东快递通过在每个城市自建仓储,用以提前存放商品,买家下单后,商品通常是直接从仓储发货,而不是产地发货,从而实现了“当天达”这样的高效。
高速缓存与主存的映射关系
计算机主存相当于一个大蓄水池,而高速缓存就相当于一个小蓄水池,主存事先将数据拷贝至高速缓存,如果将主存看作为一个数据集合的话,高速缓存就是这个集合的子集,因此必须要明确子集与原集合的映射关系,如此,CPU 在从高速缓存中获取数据的时候才不至于混乱。
既然高速缓存 Cache 相当于主存的一个子集,那就必须要先明确子集与原集合之间的映射关系,高速缓存与主存之间的映射关系主要分为三种:
全相联映射:1)映射方式,主存和缓存之间的数据传递是以块为单位的,每个块包含多个字的数据,全相联映射中,如下图所示:Cache 中#0~#7 行均可以接收主存#0 块,即主存中块可以存放在 Cache 中的任意位置,没有限制;2)访存方式,如下图所示,假设内存容量为 16*4B,主存的地址包括 4 位块号以及 2 位块内地址,CPU 带着待取数据的主存地址(如 001110)去问 Cache 要数据,Cache 于是对着主存地址去挨个块核对标记和有效位,发现#2 行标记和主存块号一致,且标记位为 1(说明块内有数据),则通知 CPU“我有你想要的东西”,即为命中;
直接映射:1)映射方式,主存中块只能按照一定的次序排队放入放到 Cache 中的某一行,因此,Cache 块号 = 主存块号 %(取余)Cache 总块数;2)访存方式,CPU 带着地址码 001110 去找 Cache 要数据,Cache 用主存块号对行数 8 取余结果为#3,于是就去#3 行核对标记和有效位,发现有效位虽然为 1,但标记却是 1011,与主存块号不一致,于是通知 CPU“我没有你想要的东西”,即为不命中;
组相联映射,1)映射方式,介于 1)和 2)映射方式之间,Cache 中的块可以事先分组,主存中的块必须要按照一定次序放入 Cache 中的某一组,但是在组内可以随意放;2)访存方式,CPU 带着地址码 001110 去找 Cache 要数据,Cache 用主存块号对组数 4 取余结果为#3 组(即块号后两位),于是就去#3 组(#6 行,#7 行)核对标记和有效位,发现#7 行标记为 0011 一致,且有效位为 1,于是通知 CPU“我有你想要的东西”,即为命中;
三种映射方式总结和优缺点对比如下:
高速缓存的替换策略
前面,介绍了高速缓存与主存的映射方式以及不同映射方式下,CPU 的访存方式,访存结果根据 CPU 是否获得“想要的数据”而分为命中和不命中两种情况,命中就皆大欢喜,这里介绍一下不命中会怎么样。不命中也分两种情况:
有空位置存放数据,直此时接将内存块地址对应数据 Copy 至此即可;
没有空位置存放数据(即待放入位置被原数据块占据了),此时就需要对两个块进行位置替换,确保计算机的正常运行,三种不同的映射方式的替换前提有所不同,区别如下:1) 全相联不挑食,除非 Cache 全满,否则就可以见缝插针;2)直接映射最专一,必须对应行非空,否则就替换;2)组相联比较中庸,介于二者之间,对应的组满了,才替换。
实际替换时,也有着不同的策略,主要有四种:1)随机算法(RAND),在满足要求的块中,随机选一个块进行替换,效果较差;2)先进先出算法(FIFO),优先替换最新被调入 Cache 的主存块;3)近期最少用(LRU),将最久没有被使用的主存块替换掉,基于“局部性原理”,命中率较高;4)最近不常用(LFU),将被访问次数最少的主存块替换掉。
高速缓存的写策略
以上介绍了 CPU 从高速缓存中读数据时的一些策略,但同时 CPU 的运算结果也要同时写回高速缓存以及主存,以备后续使用,这时候也有着不同的策略,针对写命中和写不命中两种情况,处理策略也不尽相同。
写命中时:1)全写法,即写命中后需要将结果同时写入高速缓存和主存;2)写回法,即写命中后,只是将结果写入高速缓存,当高速缓存中相应位置的数据要被替换时,才将结果写回主存;
写不命中:1)写分配法,当 CPU 对高速缓存写不命中时,把主存中的块调入高速缓存,在高速缓存中修改,通常搭配写回法使用;2)非写分配法,当 CPU 对高速缓存写不命中时,只写入主存,不调入高速缓存,通常搭配全写法使用。
4.小结
本章更加深入的介绍了存储系统,相继介绍了丰富多样的存储技术、不同存储方式因速度和成本的区别分别司职于计算机的不同部位,从而形成了“金字塔”形式的层次结构、以及详细介绍了层次结构的中主存和高速缓存 Cache 的结构组成、运行机理以及与 CPU 之间协调机制。
三、指令系统
如下图所示,我们知道计算机系统构成层次结构是这样的:晶体管是构成计算机系统的基本元素,其通过高 / 低电平的切换实现自己的价值;大量晶体管通过不断套娃构成了超大规模的集成电路,这些集成电路由于功能的不同可以分饰不同的角色(存储器、CPU、输入 / 输出等),把这些不同功能的集成电路组合起来就构成了计算机硬件系统,然而这个硬件系统只认识 0 和 1 组成的机器语言,其与程序员所编写的程序(高级语言)有着天壤之别,它们之间需要经过编译器的翻译才能互通。这些 0 和 1 构成的数据串就指令,其为计算机运行的最小功能单位,而这些可以实现各种功能的指令所组成的集合就是指令系统。
经过编译器编译的指令序列被放入主存的存储体中,CPU 在程序计数器 PC 的控制下,一条条的从主存中取出指令,由 CPU 的控制器进行指令分析,并指挥 CPU 运算器按照指令要求完成相应的运算处理,具体的运行过程可以参考前文所述。
指令系统一章将从三个方面展开:1)指令格式,介绍一条指令的基本组成以及按照不同标准的分类;2)指令 / 数据寻址,指令运行前需要总主存中提取出来,这就需要寻址,分别介绍指令寻址以及数据(指令的被操作数)寻址的各种方式;3)CISC 与 RISC,介绍两种主流的指令系统(复杂指令集与精简指令集),简单阐明二者的本质区别、优缺点以及典型应用。
1.指令格式
指令的格式如下图所示,由操作码和地址码构成,其中操作码规定了对操作对象的操作类型(求和、移位等),而地址吗则指明了操作对象的位置。
由于操作任务的种类不同,指令地址吗的数目也有所不同,主要分为:1)零地址指令;2)一地址指令;2)二地址指令;3)三地址指令;4)四地址指令。
零地址指令
一种情况是不需要操作数,如空操作、停机、关中断等指令;另一种情况是堆栈计算机,两个操作数隐含存放在栈顶和次栈顶,计算结果亚辉栈顶。
一地址指令
一种情况是只需要单操作数,如加 1、减 1、取反、求补等操作;另一种是需要两个操作数,但是有一个操作数隐含在某个寄存器(如 ACC)。
二地址指令
常用于需要两个操作数的算术运算、逻辑运算相关指令。
三地址指令
常用于需要两个操作数的算术运算、逻辑运算相关指令,并将计算结果写入 A3。
四地址指令
常用于需要两个操作数的算术运算、逻辑运算相关指令,并将计算结果写入 A3,同时告知下个执行指令的地址。
指令的分类还可以按照长度和类型进行区分:1)定长指令字结构,即指令系统中所有指令的长度都是一样的;2)变长指令字结构,即指令系统中的各种指令的长度不等。
按照操作类型进行分类:1)数据传送类,进行主存和 CPU 之间的数据传递(如 LOAD:把存储器中的数据放到寄存器中;STORE:把寄存器中的数据放入到存储器);2)算术 / 逻辑操作,其中算术操作包括加、减、乘、除、增 1、减 1、求补、浮点运算、十进制运算等,逻辑运算包括与、或、非、异或、位操作、位测试、位清除、位求反等;3)移位操作,包括算术移位、逻辑移位、循环移位等;4)转移操作,包括无条件转移 JMP、条件转移(JZ:结果为 0;JO:结果溢出;JC:结果有进位)、调用和返回(CALL 和 RETURN)、陷阱 (Trap) 与陷阱指令;5)输入 / 输出操作,CPU 寄存器与 IO 端口之间的数据传递(端口即 IO 接口中的寄存器)。
2.指令 / 数据寻址
指令寻址的目的在于如何确定下一条指令的存放位置,主要有两种类型:1)顺序寻址,通过程序计数器 PC 不断加 1,顺序执行存储器中的指令;2)跳跃寻址,由转移指令(JMP)指出。两种指令寻址的运行过程如下图所示。
相较于指令寻址,数据寻址的种类则要丰富很多。数据寻址的主要任务是确定本条指令的地址码指明的真实地址。
以一地址指令为例,地址码的构成包括两个部分(寻址特征 + 形式地址),操作数的的有效地址 EA(真实地址)需要通过形式地址按照寻址特征规定的操作进行处理才能获得。寻址特征规定了数据寻址的方式,种类繁多,如下图所示。
立即寻址
无需寻址,形式地址即为操作数(一般用补码形式表示)。
优点为无需访存,速度快,缺点为形式地址的位数限制了操作数的范围。
直接寻址
指令中的形式地址 A 就是操作数的真实地址,即 EA=A。
优点是指令结构简单,指令执行仅一次访存,缺点是 A 的位数决定了寻址的范围,操作数地址不易修改。
间接寻址
指令的地址字段给出的形式地址不是操作数的真正地址,而是操作数有效地址所在存储单元的地址,即 EA=(A)。
优点是可以扩大寻址范围(有效地址 EA 的位数大于形式地址 A 的位数),缺点为指令执行过程中需要多次寻址。
隐含寻址
不是明显的给出操作数的地址,而是在指令中隐含着操作数的地址。
优点是有利于缩短指令字长,缺点为需要增加存储操作数或隐含地址的硬件。
寄存器寻址
在指令字中直接给出操作数所在的寄存器编号,即 EA=Ri,其操作数在有 Ri 所指的寄存器内。
优点为指令在执行阶段不用访问主存,只访问寄存器,指令字短且执行速度快,支持向量 / 矩阵运算,缺点为寄存器价格昂贵,计算器中寄存器个数有限。
寄存器间接选址
寄存器 Ri 中给出的不是一个操作数,而是操作数所在主存单元的地址,EA=(Ri)。
特点是比一般的间接寻址速度更快,但指令的执行阶段需要访问主存(因为操作数在主存中)。
基址寻址
将 CPU 中的基址寄存器(BA)的内容加上指令格式中的形式地址 A,而形成操作数的有效地址,即为 EA=(BR)+A。
优点是便于程序“浮动”,方便实现多道程序并发运行。
变址寻址
有效地址 EA 等于指令字中的形式地址 A 与变址寄存器 IX 的内容相加之和,即 EA=(IX)+A,其中 IX 可谓编制寄存器(专用),也可用通用寄存器作为变址寄存器。与基址寻址的方式的区别在于 IX 可以被用户修改。
优点:在数组处理过程中,可设定 A 为数组的首地址,不断改变编制寄存器 IX 的内容,便可以很容易形成数组中任一数据的地址,特别适合编制循环程序。
相对寻址
把程序计数器 PC 的内容加上指令格式中的形式地址 A 而形成操作数的有效地址,即 EA=(PC)+A,其中 A 为相对于 PC 所指地址的位移量,可证可负,补码表示。
优点:操作数的地址不是固定的,它随着 PC 值的变化而变化,并且于指令地址之间总是相差一个固定值,便于程序浮动。
堆栈寻址
操作数存放在堆栈中,隐含使用堆栈指针(SP)作为操作数地址。其中的堆栈是存储器中一块特定的按“后进先出(LIFO)”原则管理的存储区,该存储区中被读 / 写单元的地址使用一个特定的寄存器给出的,该寄存器称为堆栈指针(SP)(类似于程序计数器 PC)。
基于堆栈寻址,下图所示为一个加法运算的过程:
step1: 堆栈指针 SP 指向 R0,对应数据 0001 出栈进入 ACC,SP 指向 R1;
step2:SP 对应数据 1001 出栈进入寄存器 X,SP 指向 R2;
step3:ALU 计算 ACC 与 X 的和(为 1010),送至寄存器 Y;
step4: 计算结果入栈,SP 指向 R1,将 Y(1010)送至堆栈寄存器 R1。
依据堆栈数据存放位置可分为硬堆栈和软堆栈,硬堆栈使用寄存器存放操作数,成本较高,但速度快;软堆栈使用主存存放操作数,成本低,但速度相对较慢。
不同寻址方式的有效地址的计算方法以及访存次数汇总如下表:
3.CISC 与 RISC
指令集的设计,有两个主流的方向,一个是以 X86 架构为代表的 CISC(Complex Instruction Set Computer), 即复杂指令集,另一个则是以 ARM 架构为代表的 RISC(Reduced Instruction Set Computer),即精简指令集。两者的设计思路向左。
CISC:设计思路为一条指令完成一个复杂的基本功能,一条指令可以由一个专门的电路完成,比较复杂的指令则通过“存储程序”(微程序)的设计思路,由一个比较通用的电路配合存储部件完成。典型应用为 X86 架构,主要应用于笔记本、台式电脑等;
RISC:设计思路为一条指令至完成一个基本“动作”多条指令组合完成复杂的基本功能。典型应用为 ARM 架构,主要应用于手机、平板等。
如果说“指令”就是计算机硬件系统的语言的话,那么 CISC 和 RISC 就是两种语言系统规范,其中 CISC 以“单词”为元素构建语言系统,每一个单词就可以表达一个意思,而表达复杂的意思,就可以将单词组合,优点在于简单,缺点就是单词可能会很多;而 RISC 则是以“字母”为元素构建语言系统,每个字母无法表达确切的含义,需要将很多字母组合起来,才能表达丰富多样含义,其优点在于“元素”的数目较少,只有 26 个,缺点在于表达任何一个含义,都需要将很多字母组合起来方可。
两种指令集的对比如下图所示:
4.小结
本章详细介绍了指令系统的相关内容,相继介绍了什么事指令系统以及其在计算机系统中的作用、一条指令的构成(指令格式)、指令以及数据是如何寻址的(寻址方式)以及两种典型指令系统(CISC 和 RISC)。
四、CPU
正如兰德尔-E-布莱恩特在《深入理解计算机系统》中所说的那样,现代处理器可以称得上是人类创造除的最复杂的系统之一,一块指甲大小的硅片上,可以容纳一个完整的高性能处理器和大的高速缓存,以及用来连接外部设备的逻辑电路,它是计算机的核心。
如前文所述,CPU 主要由运算器和控制器构成,但是这样的抽象模型显然不是我们认识的终点,这一章我们将深入 CPU 的内部,认识 CPU 的功能以及结构组成、CPU 是如何完成指令的提取以及执行、提取的数据是在 CPU 内部如何流动的、控制器(CU)是如何通过控制信号发挥其调度的作用的以及如何通过流水线理念提升 CPU 运行效率。
1.CPU 的功能和结构
CPU 的主要功能有:
指令控制:完成取指令、分析指令和执行指令的操作,即程序的顺序控制;
操作指令:一条指令的功能往往有若干操作信号的组合来实现的。CPU 管理并产生内存取出的每条指令的操作信号,把各种操作信号送往相应的部件,从而控制这些部件按指令的要求进行动作;
时间控制:对各种操作加以时间上的控制,时间控制要为每条指令按时间顺序提供应有的控制信号;
数据加工:对数据进行算术和逻辑运算;
中断处理:对计算机运行过程中出现的异常情况和特殊请求进行处理。
CPU 的基本结构包括运算器和控制器,其中运算器的作用是对数据进行加工;控制器的作用是协调控制计算机各个部件执行程序的指令序列,基本功能包括:1)取指令,自动形成指令地址,发出取指令的命令;2)分析指令,对取得的指令(操作码 + 操作数地址)进行分析,对操作码进行译址(分析要完成什么操作),产生操作数的有效地址 EA;3)执行指令,根据分析指令获得的“操作命令”和“操作数地址”,形成操作信号控制序列,协调 ALU、存储器以及 I / O 设备完成相应操作;4)中断处理,管理总线及 I / O,处理异常情况。
1.1 运算器的基本结构
运算器组成主要包括具备算术 / 逻辑运算功能的 ALU 和暂存各种输入 / 输出结果的通用寄存器,它们之间通过 CPU 内部总线进行联通,如同省道一样的内部总线简化了个器件之间的连接线路。
1.2 控制器的基本结构
控器器(CU)的核心是指令译码器 ID 和微操作信号发生器,它们将来在于主存,放置于指令寄存器(IR)的指令进行分析,并产生微操作信号,指挥 CPU 中的各器件合理有序的开展各项工作,其中指令以及操作数数据从主存 / 高速缓存,经由地址总线和数据总线以及地址寄存器 MAR 和数据寄存器 MDR,到达 CPU,其中地址总线和数据总线就如同更高别的国道。
1.3 组合
将运算系统和控制系统组装到一起就构成一个功能完整的 CPU,其中两部分之间的数据传递通过 CPU 内部总线进行的。
看似复杂的结构组成图,其实按照功能可以分为四大块。
2.指令执行过程
2.1 指令周期
CPU 中时间单位主要包括这三个:1)时钟周期,又称为振荡周期,由 CPU 中的振荡电路产生,常定义为时钟脉冲频率的倒数,是时序中最小的时间单位;2)机器周期,也称为 CPU 周期。在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段(如取指、译码、执行等),每一阶段完成一个基本操作。完成一个基本操作所需要的时间称为机器周期。一般情况下,一个机器周期由若干个时钟周期组成 ;3)指令周期,?CPU 每 取出 一条指令并 执行 这条指令,都要完成一系列的操作,这一系列操作所需要的时间通常叫做一个指令周期。换言之指令周期是取出一条指令并执行这条指令的时间。由于各条指令的操作功能不同,因此各种指令的指令周期是不尽相同的。例如一条加法指令的指令周期同一条乘法指令的指令周期是不相同的 。
每条指令的执行过程都按照下图所示的流程框图开展,计算机通过 4 个触发器(取指 EF、间址 IND、执行 EX、中断 INT)的状态判断指令进行到哪一步。
2.2 指令数据流
取指、间址、执行以及中断过程中,数据在 CPU 里是如何流动的。
取指周期
取值周期的主要任务就是从存储器中取出指令,主要流程为:
step1:当前指令地址送至存储器的地址寄存器 MAR,即(PC)->MAR;
step2:CU 发出控制信号,经控制总线传到主存,这里是读信号,即 1->R;
step3:将 MAR 所指主存中的内容经数据总线送入 MDR,即 M(MAR)->MDR;
step4:将 MDR 中的内容送入指令寄存器 IR,即(MDR)->IR;
step5:CU 发出控制信号,形成下一条指令地址,即(PC)+1->PC。
间址周期
间址周期的主要任务就是获得操作数(数据)的有效地址 EA,EA 的获取是依据寻址特征对形式地址进行操作完成的,以一次间址为例,数据流为:
step1:将指令的地址码送入 MAR,即 Ad (IR)->MAR;
step2:CU 发出控制信号,启动存储器读操作(R),即 1->R;
step3:将 MAR 所指主存中的内容 (EA) 经数据总线送入 MDR,即 M(MAR)->MDR;
step4:将有效地址 (EA) 送至指令的地址码字段,即(MDR)->Ad (IR)。
执行周期
执行周期根据 IR 中的指令字的操作码和操作数通过运算器进行相关操作,产生执行结果,没有统一的数据流向。
中断周期
中断周期的主要任务暂停当前任务取完成其他任务,暂停前需要保存断点,一般使用堆栈(SP 存储栈顶地址)来保存断点,具体流程如下:
step1:控制器将 SP 减 1(入栈准备),修改后的地址送至 MAR,即 (SP)-1->SP,(SP)->MAR;
step2:CU 发出控制信号,启动存储器写操作(W),即 1->W;
step3:将断点(PC 的内容)经由 MDR,写入 SP 指向地址的位置;
step4:CU 控制将中断服务程序入口地址送入 PC,开始执行中断程序。
2.3 指令执行方案
方案 1:单指令周期,所有指令,都选用相同的执行时间完成,取最大值;
方案 2:多指令周期,不同指令,选用不同的执行时间;
方案 3:流水线方案,尽可能让多的指令并行执行;
3.数据通路的功能和基本结构
CPU 功能的实现是通过运行指令来实现的,而指令运行过程实质就是数据在各部件(运算单元、寄存器等)之间的传送,数据通路指的是数据在功能部件之间传送的路径。如下图所示,以总线模式介绍 CPU 运行过程中数据通路是怎样的(以取指令周期为例)。
一个取指令周期可以分解为若干个微操作,而每一个微操作的实质就是数据的流动,数据流动的幕后则是一系列控制信号通过导通 / 关闭进行控制(即微操作的实现通过控制信号触发实现)。
数据通路的基本结构分为两大类:1)CPU 内部总线方式(上文介绍),优点为线路布局简单,缺点为数据流动过程之中存在冲突,效率相对较低。;2)专用数据通路方式,优点为器件之间都有专用通路,不存在冲突,速度块;缺点为线路布局复杂。
4.控制器的功能和工作原理
程序运行时,高级语言编写的代码经过编译转化成一行行 0/1 二进制代码(指令)装入主存,而每一个指令又可以分解为四个机器周期(取指周期、间址周期、执行周期以及中断周期),而每一个机器周期又可以划分为若干微操作(数据流动),而这些微操作的展开幕后则是一系列控制信号的导通 / 关闭操纵着,控制器正是对这些控制信号进行集中管理的部件。
控制器的作用:1)取指令;2)分析指令;3)产生控制信号。实现相关功能结构组成主要三个:1)程序计数器 PC,用以指明当前待执行指令在主存中位置;2)指令寄存器 IR,用以存放待执行指令,并对指令进行分析,将指令操作码部分提供给控制单元;3)控制单元 CU,也是控制器的核心,依据指令操作码的要求,综合节拍发生器提供的时序、机器周期触发器提供的周期标志以及各执行单元的反馈信号,输出一组控制指令(微命令),对控制信号集中控制,指导微操作的执行。
上面介绍了 CPU 控制器功能、结构组成以及工作机理,可知控制单元 CU 是控制器的核心,针对这个核心部件功能实现有两种实现思路:1)硬布线思路,基于硬件电路的实现;2)微程序思路,基于软件微指令的实现。这已经是 CU 设计层面的内容,以下作者只做简单原理说明,不做具体展开。
4.1 硬布线(硬件思路)
上文将 CU 抽象为一个黑匣子,其输入分为 4 部分(时序信号、指令信号、周期标志、反馈信号),输出为一组控制信号,如下图所示,硬布线的思路是通过逻辑电路建立输入信号 — 输出信号的联系,大致过程是先建立输出-输入变量之间的逻辑表达式,然后利用数字电路的知识来实现相应逻辑表达式。
硬布线实现过程为纯硬件控制,优点为响应速度快,缺点在于设计和实现过程较为复杂,且硬件实现的可扩展性比较差。适用于 RISC 指令系统,因为指令系统中的指令相对简单,易于电路实现。
4.2 微程序(软件思路)
计算机系统层面,软件实现与硬件实现是等效,控制单元 CU 输入信号和输出信号的本质就是一组 0/1 编码的指令,“微程序”的实现过程就是建立输入信号编码和输出信号编码的映射关系,并将它们存入专用存储器(控制存储器 CM),运行通过访存提取控制信号编码,实现微操作,结构示意图如下所示。
运行时,CU 按照输入信号编码,经由微地址形成部件转化成相应控制信号编码的地址,访问 CM 提取相应控制信号编码,并送至各控制信号(微指令),实行对应微操作,组合微操作形成指令控制。这一过程与访问存储器非常相似,所以很多部件及过程都在“访存”学名的基础上加了“微”字。微程序控制器的优点在于设计和实现较为简单,扩展性好,缺点在于微指令执行需要访存,速度相对较慢,适用于 CISC 系统,因为指令系统中指令相对较为复杂,易于使用微操作指令实现。
5.指令流水线
相较于顺序执行的方式,采用流水线方式,程序执行总耗时大幅缩短。
5.1 理想状态
理想情况下,各阶段花费时间相同,每个阶段结束后能立即进入下一阶段,此时简单按流水线理念进行编排,就能大幅提高指令运行效率。
流水线的两种表示方法:1)指令执行过程图,主要用于分析指令执行过程;2)时空图,主要用于分析流水线的性能。
评价流水线的三个性能指标:1)吞吐率,指在单位时间内流水线所完成的任务数量;2)加速比,完成同样一批任务,不使用流水线所用时间与使用流水线所用时间之比;3)效率,流水线设备利用率。
5.2 非理想状态
现实情况是,指令批运行过程中,会存在各种冲突的现象,从而影响流水线的运行效率。影响流水线的主要因素分为三类:
结构相关(资源冲突),即多条指令在同一时刻争用同一资源而形成的冲突;
数据相关(数据冲突),在一个程序中,存在必须要能打前一条指令执行完成才能执行后一条指令的情况,即两条指令的数据相关;
控制相关(控制冲突),当流水线遇到转移指令和其他改变 PC 值的指令而造成断流时,会引起控制相关。
6.小结
本节中,详细介绍了 CPU 的结构组成、运行机理以及其上的数据流动,并深入 CPU 的核心,介绍控制器的功能、结构组成、运行机理以及两种实现策略,最后介绍了基于流水线技术的 CPU 指令高效运行策略。
五.总线
总线是计算机系统中的“高速公路”,为计算机系统中不同硬件间的“交流”提供公共通路并协调其间的“数据流动”能够始终有条不紊的展开。本章将三个方面展开:1)概述,简单介绍总线的基本概念、按照不同标准的分类以及 4 种典型结构;2)总线仲裁与传输,重点介绍为解决多设备争用总线问题的三种仲裁方式以及数据传输使用总线的流程;3)总线标准,由于传输速度的需求发展以及应用场景的不同而形成种类繁多的总线标准。
1.概述
1.1 基本概念
总线是一组能为多个部件分时共享的公共信息传送线路。就如同公共交通中的高速公路。总线的出现大幅简化了不同设备间数据传输线路。
总线的特性:1)机械特性,尺寸、形状、管脚数以及排列顺序;2)电气特性,传输方向和有效电平范围;3)功能特性,每根传输线的功能(地址、数据、控制);4)时间特性,信号的时序关系。
1.2 总线的分类及经典结构
1、按数据传输格式分类
按照数据的传输的格式分类,可以分为串行总线和并行总线:1) 串行总线就像单行道,数据只能只能排着队按次序逐一传送,优点在于成本低廉,适合长距离传输,缺点是数据在收发过程中需要提前拆卸和装配;2)并线总线就像双向六车道,数据无需排队,并行发送,有点在于逻辑时序比较简单,无需对数据进行拆卸和装配,电路实现相对简单,缺点在于信号线数量多,远距离传输成本高。
2、按总线功能分类
按总线的功能进行分类,可分为 3 种:
片内总线
CPU 芯片内部寄存器与寄存器之间、寄存器与 ALU 之间的公共连接线;
系统总线
主存系统总线按传输信息内容的不同,又可以分为 3 类:1)数据总线,用来传输各功能部件间址的数据性,为双向传输线,位数与机器字长、存储字长有关;2)地址总线,用来指出数据总线上的源数据或目的数据所在的主存单元或 I / O 端口地址,为单向传输线,地址总线的位数与主存地址空间的大小有关;3)控制总线,传输控制信息,包括 CPU 送出的控制命令和主存(或外设)返回 CPU 的反馈信号。
系统总线按照结构可以分为:1)单总线;2)双总线;3)三总线;4)四总线。计算机系统结构越复杂,相应的总线结构也会更加复杂。
通信总线
用于计算机系统之间或计算机系统与其他系统(远程通信设备、测试设备等)之间的信息传递。
按时序控制方式
分为同步总线和异步总线。
1.3 性能指标
总线的性能指标主要包括:1)总线周期,一次总线操作所需时间(包括申请阶段、寻址阶段、传输阶段),通常由若干总线时钟周期构成;2)总线时钟周期,即机器时钟周期,由时钟系统决定;3)总线的工作频率,总线周期的倒数,实际指一秒能传递几次数据;4)总线的时钟频率,即机器时钟频率;5)总线宽度,通常为数据总线的根数,决定同时能传输数的位数;
6)总线带宽
总线的数据传输速率,总线带宽 = 总线工作频率 * 总线宽度(bit / s)。
7)总线复用
一种信号线在不同时间传输不同类型的信息(比如地址总线与数据总线的复用)。
8)信号线数
地址总线、数据总线以及控制总线 3 种总线数总和为信号线数。
2.总线仲裁与传输
2.1 仲裁
如何解决多个设备争用总线的问题?此时需要引入仲裁策略,分为集中仲裁方式和分布仲裁方式两大类。集中仲裁的方式有三种:1)链式查询方式;2)计数器查询方式;3)独立请求方式。
链式查询方式
总线控制部件接收到总线请求 BR 后,依照远近链式通过各设备接口检查请求状态,通过设备接口 0 时,发现 BR 未触发,便顺序检查设备接口 1,发现 BR 触发,便向其发出总线允许 BG 并触发总线忙 BS,设备 1 接口获得总线控制权。
计数器查询方式
总线控制器接收到总线请求 BR 后,判断总线处于空闲状态,计数器开始计数,数值通过设备地址发往各设备接口,当请求设备接口地址与数值一致后,该设备获得总线控制权,计数器停止计数和查询,并触发总先忙 BS。
独立请求方式
有需求的设备各自向总线控制器发送总线请求 BR,总线控制器按照一定优先次序向相应设备发送请求允许 BG,并触发总线忙 BS,相应设备获得总线控制权。
三种集中仲裁方式的对比:
分布式仲裁:当设备由总线请求时,各自将其唯一的仲裁号发送到共享的仲裁总线上,各仲裁号相互 PK,优先级高的可获得总线允许。该仲裁方式的特点为:不需要中央仲裁器,每个潜在的主模块都有自己的仲裁器和仲裁号,多个仲裁器之间争使用总线。
2.2 传输流程
占用总线的一对设备如何进行数据传输?总线周期 (总线传输流程) 的四个阶段:
申请分配阶段,由使用总线的主模块提出申请,经总线仲裁决定将下一传输周期的总线使用权授予某一申请者,也可将此阶段细分为传输请求和总线仲裁两个阶段;
寻址阶段,获得使用权的主模块通过总线发出本次要访问的从模块的的地址及有关命令,启动参与本次传输的从模块;
传输阶段,主模块和从模块进行数据交换,可单项或双向进行数据传送;
结束阶段,主模块的有关信息均从系统总线上撤出,让出总线使用权。
3.总线标准
总线标准是计算机内不同模块互连的规范。依据总线在计算机系统中的位置,可以分为:1)系统总线;2)局部总线;3)设备总线、通信总线。
如图所示为计算机硬件架构,主要硬件模块之间互连的总线标准以及相关总线接口示意图如下所示。需要补充说明:
北桥芯片负责实现高速设备(主存储器、显示适配器(显卡))与 CPU 互连的控制,总线传输速度高,又被称为系统总线,不过现在很多计算机以将北桥芯片的功能集成于 CPU;
南桥主要负责实现计算机上一些低速设备(网卡、USB 设备、音频、硬盘等)的互连控制;
超级 I / O 主要负责 I / O 设备的于计算机互连的控制,具体会在 I / O 系统中详细介绍。
常见的总线标准及其参数汇总如下,重点需要了解几个常用总线的名称、数据传输格式(并行传输、串行传输)、应用场景(连接什么硬件模块),总线位置(系统总线、局部总线或设备总线)。
4.小结
总线是计算机中分时共享的公共信息通路,就如同高速公路一样,优点是大幅简化了计算机系统的线路规模,引入的问题就是总线使用权的分配,从而着重介绍了“仲裁”机制以及总线的“传输流程”。最后,介绍了目前常见的一些总线标准、主要参数及应用场合。
六、I / O 系统
“I / O 系统”是计算机核心部分(CPU,主存)与外部设备的“中转站”,起到了数据过渡和中转协调的作用,该章主要从四个方面展开:1)基本概念,介绍 I / O 系统的组成以及 I / O 控制的方式;2)外部设备,简单介绍纷繁多样的外部设备;3)I / O 接口,作为 I / O 系统最重要的部分,介绍其主要功能及一般结构组成,以及内部端口的编址方式;4)I / O 方式,重点介绍三种 I / O 控制方式(程序查询方式、程序中断方式以及 DMA 方式),阐述各种方式的运行机理以及优缺点。
1.基本概念
1.1 I / O 系统组成
一般来说 I / O 系统由 I / O 硬件和 I / O 软件两部分组成。其中 1)I / O 硬件:包括外部设备、I / O 接口以及 I / O 总线等;2)I / O 软件:包括驱动程序、用户程序、管理程序、升级补丁等。通常采用 I / O 指令和通道指令实现主机和 I / O 设备的信息交换。
1)I / O 指令
命令码是 CPU 指令的一部分,与普通的指令格式略有不同,操作码指明了 CPU 要对 I / O 设备做什么,命令码指明了 I / O 接口要对设备做什么。
2)通道指令
通道能识别的指令,通道程序提前编制好放在主存中,在含有通道的计算机中,CPU 执行 I / O 指令对通道发出命令,由通道执行一系列通道指令,代替 CPU 对 I / O 设备进行管理。
I / O 接口:又称为 I / O 控制器(设备控制器,一块芯片,通常集成于主板上),负责协调主机与外部设备之间的数据传输。其作用不仅仅只是一个接口,其还相当于一个介于主机和外设之间的调度。
1.2 I / O 控制方式
I / O 控制方式主要分为 4 种:
程序查询方式:CPU 不断轮询检查 I / O 控制器中的“状态寄存器”,检测到状态为“已完成”之后,再从数据寄存器取出输出数据;
程序中断方式:等待 I 键盘 / O 时,CPU 可以先去执行其他程序,键盘 I / O 完成后 I / O 控制器向 CPU 发出中断请求,CPU 相应中断请求,并取走输入数据;
DMA(直接内存访问)控制方式:在主存与 I / O 设备之间添加一条直接数据通路(DMA 总线),DMA 控制器自动控制磁盘与主存的数据“读 / 写”,没完成一整块数据读写,才向 CPU 发出一次中断请求;
通道控制方式:通道按照 CPU 的要求,执行主存中的通道程序,控制 I / O 设备完成一系列任务,规定任务完成后,向 CPU 发出中断请求。
2.外部设备
外部计算机系统的外部设备主要分为:1)输入 / 输出设备;2)外部存储设。纷繁多样,本节不做详细介绍。
输入 / 输出设备
输入设备:键盘、鼠标。
输出设备:显示器(主要参数:屏幕大小、分辨率、灰度级、刷新频率、显示存储器的容量和贷款)、打印机。
外部存储设备
磁盘(存储机理、结构组成、性能参数、访存过程)、光盘存储器以及固态硬盘(SSD)。
2.I/ O 接口
2.1 主要功能及组成
I / O 接口是 I / O 总线与外设之间的过渡,的主要作用:1)数据缓冲,通过数据缓冲寄存器(DBR)实现主机与外设工作速度的匹配;2)错误或状态监测,通过状态寄存器反馈设备的各种错误、状态信息,共 CPU 查用;3)控制和定时,接收从控制总线发来的控制信号、时钟信号;4)数据格式转换,串行-并行、并行-串行等格式转换;5)与主机和设备通信,实现主机-I / O 接口-I 外设之间的通信。
I / O 接口的基本结构:
如图所示,按照 I / O 接口的功能需求,其主要结构组成有:1)数据缓冲寄存器 DBR;2)设备选择电路;3)设备状态标记;4)命令寄存器和命令译码器;5)控制逻辑电路。
以控制外设为例介绍一下 I / O 接口的运行机理:
step1:CPU 通过地址线向 I / O 接口发出选择设备的信号,设备选择电路判断是否为该设备,核实后更改设备状态标记,并经状态线通知 CPU“我是你要找的人”;
step2:CPU 通过命令线经 I / O 接口的命令寄存器向外设下达传送数据的命令;
step3:外设通过数据线向 I / O 接口的 DBR 传送数据,完事后,经状态线通知 I / O 接口“传输完成”;
step4:I / O 接口更改状态标记,向 CPU 发出中断请求“你要的东西准备好了”;
step5:CPU 通过命令线响应中断请求“我知道,你给我吧”,I / O 接口将 DBR 中的数据经数据线传递给 CPU。
2.2 I / O 端口及编址
CPU 同外设之间的数据传送的实质是对 I / O 接口中的某些寄存器(如数据缓冲寄存器、命令寄存器等)进行读 / 写。而这里的寄存器又被称为端口,这是端口与接口的区别:
设对寄存器的读 / 写,事先得要给这些寄存器编址,编址方式有两种:
统一编址,把 I / O 端口当作存储单元进行地址分配,同统一的访存指令就可以访问 I / O 端口,又称存储器映射方式,这种方式的优点在于不需要专门的输入 / 输出指令,编制空间大,CPU 访问 I / O 也更加灵活,缺点在于占用了内存空间,地址位数多,地址译码速度慢,执行速度较慢;
独立编址,I / O 端口地址与存储器地址无关,独立编址 CPU 需要设置专门的输入 / 输出指令访问端口,又称 I / O 映射方式,输入 / 输出指令与存储指令有着明显的区别,程序编制清晰,缺点在于增加了一组控制信号,增加 CPU 的控制复杂性。
3.I/ O 方式
3.1 程序查询方式
由程序查询方式的时序图可知:CPU 一旦启动 I / O,必须停止现行程序的运行,并在现行程序中插入一段程序,主要特点:CPU 有“踏步”等待现象,CPU 与 I / O 串行工作。对应的 I / O 接口工作流程图和结构组成如图所示:1)由流程图可知,一旦启动外设,在外设准备阶段,CPU 就在不断的取外设状态,并判断外设是否准备就绪,无法执行其他指令;2)由于 I / O 接口的 DBR 与 CPU 的计算器相连,因此,每次数据的传递时一个字一个字的进行,效率较低。
程序查询方式的优点是接口设计简单、设备量少,缺点为 CPU 在信息传送过程中要需要很多时间用于查询和等待,而且如果采用独占查询,则在一段时间内之内和一台外设减缓信息,效率大大降低。
3.2 程序中断方式
在介绍 I / O 方式中的程序中断方式之前,先了解一下中断系统的概念。
中断的基本概念及运行机理
程序中断是指在计算机执行现行程序的过程中,出现某些继续处理的异常情况或特殊请求,CPU 暂时中止现行程序,转而去对这些异常情况或特殊请求进行处理,在处理完毕后对 CPU 又自动返回到现行程序的断点处,继续执行原有程序。
中断系统的工作流程分为三个步骤:1)中断请求;2)中断响应;3)中断处理。
中断请求:中断源对向 CPU 发送中断请求信号,CPU 可以通过对中断请求标志寄存器的查询,判断哪个设备由中断请求;
中断响应:响应中断需满足三个条件:1)中断源有中断请求;2)CPU 允许开中断;3)一条指令执行完毕,且无更紧迫的任务。满足中断响应的条件,即进行中断判优,依据设定的优先级顺序,执行后续中断处理;
中断处理:中断处理过程主要有两个任务:1)保存原程序断点;2)执行中断服务程序。其中第一个任务由中断隐指令实现(以堆栈形式保存断点、并将中断服务程序入口地址送至 PC),中断服务程序则要先保护现场(原程序各寄存器状态),然后执行各中断设备服务。具体过程如下图流程图所示:
中断的类型由许多种,广义的中断分为内中断(中断请求来源于 CPU 内部)和外中断(中断请求来源于外部,于当前执行的程序无关),不同类型的中断的优先级也有区别,当不同类型的中断源同时发出中断的请求时,优先级决定了相应中断请求被相应的有限次序。(一般情况下,硬件故障 > 软件故障 > 非屏蔽故障 > 屏蔽故障)。
中断的判优与优先级设置
前面说到,当多个中断源同时出现时,中断判优就该发挥作用,优先级的设置有 2 种方式:1)硬件实现,通过硬件排队器实现;2)软件实现,通过查询程序实现。
在硬件排队器的基础引入中断屏蔽技术,可以实现对优先级顺序的灵活调整,该技术主要用于多重中断(中断嵌套),其与单重中断最主要的区别在于中断处理过程中允许开中断,从而实现多重中断。
如图所示,在硬件排队器的基础上,在每一个中断请求端口处都增加一个“屏蔽字”MASK,以 A 的优先级设置为例(如希望 B 获得最高优先级),则可以将 A / C / D 的屏蔽字 MASK 都设置为“1”,则会发现,当 B 发生中断后,A / C / D 端口的即使发出中断请求(即 A=C=D=1), 则 2/3/4 的响应始终为“0”,即被屏蔽,从而实现了优先级的调整。
按照优先级顺序设计中断源屏蔽字的过程如下:依照优先级次序,所有中断源将高于其优先级的中断源的屏蔽字设为“0”,而将低于其优先级的屏蔽字设为“1”,自身的屏蔽字设为“1”,然后汇总每个中断源的屏蔽字即可。
程序中断方式
介绍完成中断机制后,现在来看看中断的策略是如何应用于“I / O 控制方式”。上图为“程序中断方式”的 I / O 接口结构组成,相较于“程序查询方式”的 I / O 接口更为复杂。相较于“程序查询方式”,程序中断方式的 CPU 执行程序的比例大幅提高,可以发现 I / O 准备阶段,CPU 已经无需参与,可以继续执行原程序,仅当 I / O 接口与外设之间完成数据传递后,需要向 CPU 传递数据时,才发出中断请求,让 CPU 拨冗处理:step1:执行中断隐指,保存原程序断点,并接入中断服务程序入口;2)执行中断服务程序,保护原程序现场,并与 I / O 接口进行数据传输,完成后恢复原程序现场;3)继续执行原程序。可见,CPU 被 I / O 占用的时间显著降低。
3.3 DMA 方式
DMA 控制器替代 CPU,对 I / O 设备进行控制,同时串联起 I / O 外设和主存进行数据传送,进一步解放了 CPU。
个 CPU 向 DMA 控制器指明要输入还是输出;要传送多少数据;数据在主存、外设中的地址。
传送前:接受外设发出的 DMA 请求(外设传送一个字的请求),并向 CPU 发出总线请求;CPU 响应此总线请求,发出总线响应信号,接管总线控制权,进入 DMA 造作周期;
传送时:明确传送数据的主存单元地址及长度,并能自动修改主存地址计数器和传送长度计数器;规定主存和外设间的传送方向,发出读写等控制信号,执行数据传送操作;
传送后:向 CPU 报告 DMA 操作结束。
下图所示为 DMA 控制器的结构组成,可以发现结构组成相较于“程序查询方式”和“程序中断方式”的 I / O 接口更为复杂:1)主存计数器 AR,用以存放交换数据的主存地址;2)传送长度计数器 WC,记录待传输数据的长度,传输完成通过溢出信号通知中断机构;3)数据缓冲器 DBR 与设备选择电路的作用与其他“I / O 方式”一致;4)DMA 请求触发器和控制 / 状态逻辑,当 I / O 接口与外设之间完成数据传输后,就向 CPU 争取主存访问权;5:中断机构,当 I / O 接口与主存之间的数据传输完成后,提醒 CPU 传输完成。
以外设向主存传输数据为例介绍 DMA 的传送过程:
step1:预处理阶段,CPU 将待放入主存数据的地址、传输数据个数等信息发给 DMA 控制器,并通知启动 I / O 设备;
step2:DMA 控制按照 CPU 提供的信息,从外设提取数据,放入数据缓存 DBR,并经由 DMA 触发器和控制 / 状态逻辑向 CPU 要总线使用权,通过后将数据经数据总线传送给内存,直至整个数据块传送完毕;
step3:数据块传送完成后,传送长度计数器通过溢出信号通知中断机构,中断机构通知 CPU"你想要的数据都给主存送过去了",CPU 进入中断服务程序(与程序中断方式的服务程序任务完全不同),去主存核实数据是否满足要求并决定是否还要传数据;
step4:CPU 继续执行主程序。
DMA 的传送方式,当 CPU 和 I / O 设备同时访问主存时,为避免发生冲突,DMA 控制器和 CPU 通常采取三种方式进行协调:1)停止 CPU 访问主存;2)DMA 和 CPU 交替访存;3)周期窃取。
程序中断方式和 DMA 控制方式的对比如下图所示。
5.小结
本节介绍了 I / O 系统的相关知识,主要介绍 I / O 系统的功能与组成,简单罗列了纷繁多样的 I / O 外设,并着重介绍了介于 I / O 总线与外设之间的 I / O 接口,详细介绍了接口的功能、组成以及三种主要的 I / O 控制方式。
认识主板
再识”主板“,作者将年久不用的笔记本给拆了,希望理论体系的加持下,能够获得对复杂主板稍微深入一点的认知。
打开计算机主板,看似密密麻麻的电路元器件和各种芯片,其实可以大致分为这么几个部分:1)CPU 与 GPU(处理器);2)存储系统(主存和辅存);3)南桥芯片组(总线控制中心)+EC+I / O 接口 + 外设(I / O 系统);4)时钟系统;5)电源系统。
北桥、南桥芯片组(总线系统)
几个分系统按照如下的架构(计算机硬件架构)组织起来,其中北桥芯片(MCH)和南桥芯片 (PCH) 作为总线的控制中心,串联起各硬件分系统,主板的架构也相应的围绕这两个芯片组扩展开来。北桥芯片组离 CPU 较近,负责高速设备之间的数据传输(CPU、显卡以及主存)。南桥芯片则负责低速设备的互连,硬盘、光驱以及 USB 接口等都经由南桥芯片与 CPU / 主存进行数据传输。
CPU 和 GPU(处理器)
CPU 与 GPU 是主板上的两颗大脑,其中 CPU 擅长逻辑 / 算术运算,GPU 擅长图像处理相关运算。CPU 正面的两颗芯片为 CPU 的核心,运算器、控制器、高速缓存等部件都集成在上面,通常被称为 Die,是从晶圆(Silicon Wafer)上切割下来的一个个小方块,在切割下来之前,每个小方块(Die)都需要经过各种加工,将电路逻辑刻到该 Die 上面。如图所示,显卡的主要组成就是图像处理器与显示缓存,它们之间的关系就如同 CPU 与内存的关系一样。上面的主板,显卡集成于主板之上,被称为集成显卡,占用空间小、功耗低但性能也相对较差,对于图像处理要求比较高的场合(视频制作、大型游戏),一般就需要选用独立显卡,其可以通过总线接口连接到主板上,即插即用,性能强大,但功耗和体积也要大很多。
主存 + 硬盘(存储系统)
按照正文中提到的存储金字塔结构,计算机的存储由内到外应该分为三部分:1)高速缓存;2)主存;3)辅存。其中高速缓存集成于 CPU 内部,主板上不可见。
主存:组成包括内存颗粒(基于 DRAM 存储技术)、SPD(串行存在检测)以及总线接口。其中内存颗粒为主存的存储载体,如图的内存条由 8 颗扩展而成;SPD 是一颗 8 针的 EEPROM 芯片。芯片内记录了该内存的诸如工作频率、工作电压、速度、容量、电压与行、列地址带宽等重要参数,便于计算机系统依据这些参数配置相应工作时序等参数;总线接口决定了该内存条的总线标准,也决定了它的传输速率。辅存:上文的主板连接的是一个 500GB 的机械硬盘,存储体为盘片,数据存取通过盘片机械旋转实现,传输速度较慢,目前的辅存大都为存取速度更快的固态硬盘,其存储体为基于 ROM 存储技术的存储芯片,其结构组成还包括缓存芯片和一个主控芯片。
南桥芯片 + EC+I / O 接口 + 外设(I / O 系统)
I / O 系统的硬件组成包括 I / O 总线、I / O 接口以及外部设备。其中南桥芯片和 EC(嵌入式控制芯片)共同负责所有 I / O 外设的总线控制,主板侧边的大量接口就是连接外设的 I / O 接口,与接口相邻的控制电路至关重要,它决定着相应外设的 I / O 方式。
时钟系统 + 供电系统(其他)
主板上除上述几个主要的分系统,还包括用于提供时序信号的时钟系统以及为主板及特定部件供电的电源系统。受限于作者认知水平和篇幅,这里就不具体展开了。
总结
该篇文章是作者关于“计算机系统”长达 5 个月学习过程的系统总结,从通俗的“入门”,到专业知识点的持续“深入”,再到简单的“实践”,基本按照“体系完整、结构明晰、层次递进”的原则阐述清楚了“计算机底层的软 / 硬件是如何协调运作以确保以高级语言编写的代码的流畅运行”这么一件事。行文至此,虽 3 万有余,但相较于庞杂的计算机知识体系也只属皮毛。即便如此,作为电磁 CAE 设计师的作者学习过程难言轻松,相关经典著作和课程视频也是反复学习多遍方知其意,过程之坎坷也时常让人质疑意义何在:无法协助你解决工程中的技术问题,也无法帮助你快速提高编程能力。这可能是所有基础理论学习过程或基于体系构建为目的学习过程的共同困扰,每每如此,我便想起迈克尔-法拉第在关于一个贵妇人质疑其圆盘发电机作用时的回答:“夫人,一个刚出生的婴儿有什么作用呢?但他会长大!”
参考资料
《计算机科学速成课》,B站视频,主讲人:Carrie Anne;
《从 0 到 1 设计一台计算机》,B站视频,作者:Ele 实验室;
《计算机是怎么跑起来的》,科普读物,作者:矢泽久雄(日本);
《程序是怎么跑起来的》,科普读物,作者:矢泽久雄(日本);
《计算机组成原理》,B站视频,来源:王道考研;
《深入理解计算机系统》,学术专著,作者:Randal-E-Bryant (美国);
《全面讲解电脑主板构造及原理 (图解)》,CSDN 博客,作者:stm32-cyy;
本文来自微信公众号:电磁 CAEer (ID:lb1661057986),作者:刘兵