随着人工智能涌入资本的视线里,越来越多的资金投在人工智能算法的研究上,其中包括机器学习、深度学习、强化学习等,这些算法所应用的领域几乎覆盖了各行各业。越来越多的基于人工智能的概念被提出来,交叉学科、交叉研究、交叉应用,只要能和智能扯上关系,那么你就站在了科学和市场的前沿。我无意唱衰人工智能,新事物问世之前总是会被质疑。不管未来人工智能是否会真的会从弱智能进化为强智能,还是只是停留在现阶段来养活大量的所谓的人工智能炼丹师,有个东西是永远不会改变且至关重要的:算力。当然,我也只是刚在深度学习大炼丹炉里跳出来的小道士,我所理解的算力是基于CPU或GPU的。
上述所说是我接触高性能计算的一个完全不重要的原因(哈哈哈哈哈哈哈只是有感而发瞎扯淡),我选择转行的原因当然是因为博士研究方向选的是高性能计算啦。因为是小白,所以不清楚高性能计算的从业人员是什么规模,应该没有深度学习那么多卷王吧。为了能在未来做一个合格的卷王,只能早早开始学习高性能计算的基础课程了,那就先从中科院计算所大咖、龙芯中科董事长、国家杰青胡伟武教授编写的第三版《计算机体系结构基础》入手吧。
提示:以下是本篇文章正文内容。
计算机体系结构是研究怎么做CPU的核心课程。信息产业的主要技术平台都是以中央处理器(Central Processing Unit,CPU)和操作系统(Operating System, OS)为核心构建起来的。 如英特尔公司的X86架构CPU和微软公司的Windows操作系统构成的Wintel平台。
计算机体系结构的研究内容包括指令系统结构、硬件系统结构和CPU内部的微结构,同时要懂应用和操作系统以及晶体管级行为。
计算机的体系结构研究内容涉及的领域非常宽泛,纵向以指令系统结构和CPU的微结构为核心,向下到晶体管级的电路结构,向上到应用程序编程接口(Application Programming Interface,API );横向以个人计算机和服务器的体系结构为核心,低端到手持移动终端和微控制器(Micro-Controller Unit,MCU)的体系结构,高端到高性能计算机(High Performance Computer,HPC)的体系结构。
下图给出了常见通用计算机系统的结构层次图。该图把计算机系统分成应用程序、操作系统、硬件系统、晶体管四大层次。
四大层次通过上下关联,形成3个界面:
(1)第一个界面是应用程序编程接口API,介于应用程序和操作系统之间。
(2)第二个界面是指令系统ISA(Instruction Set Architecture),介于操作系统和硬件系统之间。常见的指令系统包括X86、ARM、MIPS、RISC-V和LoongARCH等。
(3)第三个界面是工艺模型,介于硬件系统和晶体管之间。工艺模型是芯片生产厂家提供给芯片设计者的界面。
(4)需要注意的是,在API和ISA之间还有一层应用程序二进制接口(Application Binary Interface,ABI)。它是应用程序访问计算机硬件和操作系统服务的接口,由计算机的用户态指令和操作系统的系统调用组成。
计算机的组成给出复杂,但其基本单元非常简单。打开一台PC的机箱,可以发现电路板上有很多芯片。如图所示,一个芯片就是一个系统,由很多模块组成,如加法器、乘法器等;而一个模块由很多逻辑门组成,如非门、与门、或门等;逻辑门由晶体管组成,如PMOS管和NMOS管等。晶体管则通过复杂的工艺过程形成。所以计算机是一个很复杂的系统,由很多可以存储和处理二进制运算的基本元件组成。
现代计算机结构的基本思想是1945年匈牙利数学家冯·诺依曼结合EDVAC计算机的研制提出来的,称为冯·诺依曼结构。计算机的计算和记忆是分开的,负责计算的部分由运算器和控制器组成,称为中央处理器(CPU),负责记忆的部分称为存储器。该计算机的四个部分如下:
(1)运算器,用于完成数值运算。
(2)存储器,用于存储数据和程序。
(3)输入/输出设备,用于完成计算机和外部的信息交换。
(4)控制器,根据程序形成控制(指令命令)序列,完成对数据的运算。
计算机的衡量指标有很多,其中性能、价格和功耗是三个主要指标。具体内容:略。请参考胡伟武老师著作:《计算机体系结构基础》第三版。
从事一个领域的研究,要先了解这个领域的发展历史。计算机体系结构是不断发展的。
摩尔定律是指在相同的面积内将晶体管数目提高,工艺便会提高。
目前计算机体系结构的进一步发展面临复杂度、主频、功耗、带宽等障碍。稍微一下介绍主频和带宽的概念:
主频:主频即CPU的时钟频率,计算机的操作在时钟信号的控制下分步执行,每个时钟信号周期完成一步操作,时钟频率的高低在很大程度上反映了CPU速度的快慢。
带宽:总线带宽指的是总线在单位时间内可以传输的数据总量,等于总线位宽与工作频率的乘积。
(1)平衡性
通用CPU设计有一个关于计算性能和访存带宽平衡的经验原则,即峰值浮点运算速度(MFLOPS)和峰值访存带宽(MB/s)为1:1左右。而目前带宽已经成为通用CPU的重要瓶颈。结构设计要统筹兼顾,抓住主要因素的同时不要忽略次要因素,否则当主要的瓶颈问题解决以后,原来不是瓶颈的次要因素可能成为瓶颈。
(2)局部性
体系结构利用局部性进行性能优化时,最常见的是利用事件局部性,即有些事件频繁发生,有些事件不怎么发生,在这种情况下要重点优化频繁发生的事件。
利用访存局部性进行优化是体系结构提升访存指令性能的重要方法。访存局部性包括时间局部性和空间局部性。时间局部性指的是一个数据被访问后很有可能多次被访问;空间局部性指的是一个数据被访问后,它邻近的数据很有可能被访问。
(3)并行性
计算机中一般可以开发三种层次的并行性:指令级并行、数据级并行、任务级并行。
指令级并行:一种是时间并行,即指令流水线;另一种是空间并行,即多发射,或者叫超标量。
数据级并行:主要指单指令多数据流(SIMD)的向量结构。
任务级并行:代表是多核处理器以及多线程处理器,是目前计算机体系结构提高性能的主要方法。
(4)虚拟化
虚拟化是体系结构设计者为用户提供友好界面的一个基本方法,虚拟化的本质就是在不好用的硬件和友好的用户界面之间架一座桥梁。
TLB:
cache:高速缓冲存储器,是位于CPU和主存储器之间,规模较小,但速度很高的存储器。CPU的速度远高于内存,当CPU直接从内存中存取数据时要等待一定时间周期,而Cache则可以保存CPU刚用过或循环使用的一部分数据,如果CPU需要再次使用该部分数据时可从Cache中直接调用,这样就避免了重复存取数据,减少了CPU的等待时间,因而提高了系统的效率。Cache又分为L1Cache(一级缓存)和L2Cache(二级缓存),L1Cache主要是集成在CPU内部,而L2Cache集成在主板上或是CPU上。
计算机呈现出层次化的结构,下图展示了这些层次:
从上到下,计算机系统可分为四个层次:应用软件、基础软件、硬件电路和物理载体。软件以指令形式运行在CPU硬件上,而指令系统介于软件和硬件之间,是软硬件交互的界面。软硬件本身的更新迭代速度很快,而指令系统则可以保持较长时间的稳定。
指令系统包括对指令功能、运行时环境(如存储管理机制和运行级别控制)等内容的定义,涉及软硬件交互的各个方面内容。
指令系统的设计应遵循如下基本原则:
(1)兼容性。应能在较长时间内保持指令系统不变且保持向前兼容。
(2)通用性。应能适应各种应用需求,针对特定应用的专用处理器则不需要强调通用性。
(3)高效性。应便于CPU硬件的设计和优化.
(4)安全性。应能为各种安全性能提供支持,如提供保护模式等。
影响指令系统的因素:
(1)工艺技术。工艺技术一方面为指令系统的发展提供了物质基础,另一方面也对指令系统的发展施加影响。
(2)计算机体系结构。指令系统本身就是计算机体系结构的一部分,系统结构的变化对指令系统的影响最为直接。事实上,体系结构的发展与指令系统兼容性的基本原则要求是矛盾的。
(3)操作系统。为了实现虚拟地址空间,需要设计专门的地址翻译模块以及与其配套的寄存器和指令;操作系统中的异常和中断需要专门的支持;核心态和用户态也需要设计专门的核心态指令。
(4)编译技术。精简指令系统(RISC)在某种意义上就是编译技术推动的记过。为使编译器有效地调度指令,至少需要16个通用寄存器。
(5)应用程序。指令是从各种算法中抽象出来的“公共算子”,算法是由算子序列组成的。指令系统为应用而设计,也随着应用的需求而发展,如从通用指令到支持SIMD指令。
现代指令系统在指令内容、存储管理、运行级别控制等方面都产生了一些变化。
根据指令长度的不同,指令系统可分为:
(1)复杂指令系统(Complex Instruction Set Computer, CISC),CISC中的指令长度可变,指令数量大且复杂。
(2)精简指令系统(Reduced Instruction Set Computer, RISC),RISC指令系统的最本质特征是通过load/store结构简化了指令间的关系,即所有运算指令都是对寄存器运算,所有访存都通过专用的访存指令(load/store)进行。
(3)超长指令字(Very Long Instruction Word, VLIW),VLIW结构的最初思想是最大限度利用指令级并行(Instruction Level Paralleilism,ILP),VLIW的一个超长指令字由多个互相不存在相关性(控制相关、数据相关等)的指令组成,可并行进行处理。VLIW可显著简化硬件实现,但增加了编译器的设计难度。
存储器是冯·诺依曼结构计算机的核心部件,存储管理的演变是指令系统演变的重要组成部分,经历过:连续实地址、段式、页式虚拟存储等阶段。 针对存储管理的详细讲解,可参考另一位博主写的《段式存储管理》。
(1)连续实地址,各程序所需的内存空间必须连续存放并保证不与其他程序产生冲突。这种方式不但会带来大量的内存碎片,而且难以管理多个程序的空间分配。
(2)段式存储管理,将内存分为多个段和节,地址组织为相对于段地址的偏移。段式存储中每段可配置不同的起始地址,但段内地址仍需要连续,当程序段占用空间较大时,仍然存在内存碎片等问题。
(3)页式虚拟存储管理,将各进程的虚拟内存空间划分成若干长度相同的页,将虚拟地址和物理地址的对应关系组织为页表,并通过硬件来实现快速的地址转换。页式虚拟存储可使进程运行在各自独立的虚拟地址空间中,并提供内存映射、公平的物理内存分配和共享虚拟内存等功能。
作为软件指令的执行者,处理器中有各种级别的资源,比如通用寄存器、控制寄存器等。为了对软件所能访问的资源加以限制,计算机引入了运行级别的概念。运行级别经历了无管理、增加保护模式、增加调试模式、增加虚拟化支持等阶段。
以LoongArch指令系统为例,其运行级别主要包括:调试模式(Debug Mode)、主机模式(Host Mode)和客户机模式(Guest Mode)。主机模式和客户机模式又各自包含PLV0-PLV3四个权限等级。所有运行级别互相独立,即处理器在某一时刻只能存在于某一种运行级别中。
不同运行级别可访问并控制的处理器资源不同。其中,调试模式下具有最高的优先级,可以访问并控制处理器中所有的资源。Host-PLV0模式下可以访问并控制处理器中除了用于调试功能外的所有其他资源;Guest-PLV0模式下只能访问部分处理器资源,如客户机控制状态寄存器;Host-PLV1/2/3和Guest-PLV1/2/3则只能访问更少的处理器资源,示意图如下:
指令系统由若干条指令及其操作对象组成。每条指令都是对一个操作的描述,主要包括操作码和操作数。操作码规定指令功能,例如加减法;操作数指示操作对象,包含数据类型、访存地址、寻址方式等内容的定义。示意图如下:
处理器可访问的地址空间包括:寄存器空间和系统内存空间。寄存器空间包括:通用寄存器、专用寄存器和控制寄存器。寄存器空间通过编码于指令中的寄存器号寻址,系统内存空间通过访存指令中的访存地址寻址。
(1)寄存器
寄存器是CPU内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。(a)通用寄存器是处理器中最常用的存储单元,现代指令系统都定义了一定数量的通用寄存器供编译器进行充分的指令调度。(b)专用寄存器仅用于某些专用指令或专用功能。(c)控制寄存器用于控制指令执行的环境,比如是核心态还是用户态。
(2)系统内存空间
广义的系统内存空间包括:IO空间和内存空间,不同指令集对系统内存空间的定义各不相同。X86指令集包含独立的IO空间和内存空间,对这两部分空间的访问需要使用不同的指令:内存空间使用一般的访存指令,IO空间使用专门的in/out指令。
根据指令使用数据的方式,指令系统可分为堆栈型、累加器型、寄存器型。寄存器型又可以进一步分成寄存器-寄存器型和寄存器-存储器型。
(1)堆栈型
堆栈型指令又称零地址指令,其操作数都在栈顶,在运算指令中不需要指定操作数,默认对栈顶数据进行运算并将结果压回栈顶。
(2)累加器型
累加器型指令又称单地址指令,包含一个隐含操作数——累加器,另一个操作数在指令中指定,结果写回累加器中。
(3)寄存器-存储器型
在这种类型的指令系统中,每个操作数都由指令显式指定,操作数为寄存器和内存单元。
(3)寄存器-寄存器型
在这种类型的指令系统中,每个操作数也由指令显式指定,但除了访存指令外的其他指令的操作数都只能是寄存器。寄存器-寄存器型指令系统中的运算指令的操作数只能来自寄存器,不能来自存储器,所有的访存都必须显式通过load和store指令来完成,所以寄存器-寄存器型又被称为load-store型。
当今的指令系统主要是寄存器型,并且是寄存器-寄存器型。使用寄存器的优势在于,寄存器的访问速度快,便于编译器的调度优化,并可以充分利用局部性原理,大量的操作可以在寄存器中完成。此外,寄存器-寄存器型的另一个优势是寄存器之间的相关性容易判断,容易实现流水线、多发射和乱序执行等方法。
(1)数据类型
计算机中常见的数据类型包括:整数、实数、字符,数据长度包括:1字节、2字节、4字节和8字节。X86指令集中还包括专门的十进制类型BCD。
实数类型在计算机汇总表示为浮点类型,包括单精度浮点数和双精度浮点数,单精度浮点数据长度为4字节,双精度浮点数据长度为8字节。
在指令中表达数据类型有两种方法。一种是由指令操作码来区分不同类型,例如加法指令包括定点加法指令、单精度浮点加法指令、双精度浮点加法指令。另一种是将不同类型的标记附在数据上,例如加法使用统一的操作码,用专门的标记来标明加法操作的数据类型。
(2)访存地址
在执行访存指令时,必须要考虑的问题是访存地址是否对齐和指令系统是否支持不对齐访问。对齐访问是指对该数据的访问起始地址是其数据长度的整数倍。
对齐访问的硬件实现较为简单,若支持不对齐访问,硬件需要完成数据的拆分和拼合。但若只支持对齐访问,又会使指令系统丧失一些灵活性。现在越来越多的RISC类指令开始支持不对齐访问以减轻软件优化的负担。
另一个与访存地址相关的问题是尾端(Endian)问题。不同的机器可能使用大尾端或小尾端,这带来了严重的数据兼容性问题。最高有效字节的地址较小的是大尾端,最低有效字节的地址较小的是小尾端。
(3)寻址方式
寻址方式指如何在指令中表示要访问的内存地址。下表列出了计算机中常用的寻址方式,其中数组mem表示存储器,数组regs表示寄存器,mem[regs[Rn]]表示由寄存器Rn的值作为存储器地址所访问的存储器值。
其中,偏移量寻址、立即数寻址和寄存器间接寻址是最常用的寻址方式,而寄存器间接寻址相当于偏移量为0的偏移量寻址。因此,一个指令系统至少应支持寄存器寻址、立即数寻址和偏移量寻址。
(1)指令操作
现代指令系统中,指令的功能由指令的操作码决定。从功能上来看,指令可分为四大类:
在四类指令中,转移指令的行为较为特殊,下面详细介绍一下转移指令。转移指令包括:条件转移、无条件转移、过程调用和过程返回等类型。其中,转移条件和转移目标地址是转移指令的两个要素,两者的组合构成了不同的转移指令:
转移命令 | 介绍 |
---|---|
条件转移 | 要判断条件再决定是否转移 |
无条件转移 | 无须判断条件 |
相对转移 | 程序计数器(PC)加上一个偏移量作为转移目标地址 |
绝对转移 | 直接给出转移目标地址 |
直接转移 | 转移目标地址可直接由指令得到 |
间接转移 | 转移目标地址需要由寄存器的内容得到 |
转移指令的特点:(a)条件转移在转移指令中最常用;(b)条件转移通常只在转移指令附近进行跳转,偏移量一般不超过16位;(c)转移条件判定比较简单,通常只是两个数的比较。
条件转移指令的条件判断通常有两种实现方式: 采用专用标志位、直接比较寄存器:
(a)采用专用标志位方式的,通过比较指令或其他运算指令将条件判断结果写入专用标志寄存器中,条件转移指令仅根据专用标志寄存器中的判断结果决定是否跳转。
(b)采用直接比较寄存器方式的,条件转移指令直接对来自寄存器的数值进行比较,并根据比较结果决定是否进行跳转。
(2)指令编码
指令编码是操作数和操作码在整个指令码中的摆放方式。下图是LoogArch指令集的编码格式:
32位的指令编码被划分为若干个区域,按照划分方式的不同共包含9种典型的编码格式,即3种不包含立即数的格式2R、3R、4R和6种包含立即数的格式2RI8、2RI12、2RI14、2RI16、1RI21、I26。
域 | 功能 |
---|---|
opcode域 | 存放指令的操作码 |
rd域 | 表示目的操作数寄存器 |
rj、rk、ra域 | 表示源操作数寄存器 |
Ixx域 | 存放指令立即数,即立即数寻址方式下指令中给出的数 |
其中,指令中的立即数不仅作为运算型指令的源操作数,也作为load/store指令中相对于基地址的地址偏移以及转移指令中转移目标的偏移量。
本节不详细介绍,只介绍几个重要的概念:
(1)指令类别介绍
指令类别 | 介绍 |
---|---|
寄存器类指令 | 操作码由操作码(OP)和辅助操作码(OPX)组成,操作数包括两个源操作数(RS)和一个目标操作数(RD) |
立即数指令 | 由操作码、源操作数、目标操作数和立即数(Const)组成,立即数的位数各有不同 |
跳转类指令 | 略 |
(2)公共指令功能
指令 | 介绍 |
---|---|
load-store指令 | load指令将内存中的数据取入通用寄存器,store指令将通用寄存器中的数据存至内存中。 |
立即数指令 | 由操作码、源操作数、目标操作数和立即数(Const)组成,立即数的位数各有不同 |
ALU指令 | ALU指令都是寄存器型的,常见的ALU指令包括加、减、乘、除、与、或、异或、移位和比较等。 |
控制流指令 | 分为绝对转移指令和相对转移指令。相对转移的目标地址是当前的PC值加上指令中的偏移量立即数;绝对转移的目标地址由寄存器或指令中的立即数给出。 |
先略,后面章节会有详细介绍。
用户态: 在计算机系统层次结构中,应用层在操作系统层之上,只能看到和使用指令系统的一个子集,即指令系统的用户态部分。
特权态(特权指令系统): 现代计算机的指令系统在用户态子集之外还定义了操作系统核心专用的特权态部分,我们称之为特权指令系统。
特权指令系统的作用: 能够使计算机变得更好用、更安全。操作系统通过特权指令系统管理计算机,使得应用程序形成独占CPU的假象,并使应用间相互隔离,互不干扰。
根据特权指令系统的机制进行分类:
类别 | 介绍 |
---|---|
运行模式定义及其转换 | 现在计算机的操作系统至少需要用户态和核心态两种运行模式,应用运行在用户态模式下,操作系统运行在核心态模式下。 |
虚拟存储管理 | 虚拟存储管理的基本思想是让软件运行在“虚地址”上,与真正访问存储的“实地址”相隔离。虚实地址的转换根据地址段属性的不同,有查表转换和直接映射两种方式。 |
异常与中断处理 | CPU通过发出异常从用户态切换到核心态,进入操作系统定义的服务函数。操作系统完成处理后,返回发生异常的代码并同时切换到用户态。 |
控制状态寄存器 | 对控制状态寄存器操作的频率远低于通用寄存器,所以指令系统中通常不会设计针对控制状态寄存器的访存和复杂运算指令。不过大多数指令系统至少会定义若干在控制状态寄存器和通用寄存器之间进行数据搬运的指令,从而可以将数据移动到通用寄存器中进行相关处理,或者进一步将处理结果写回控制状态寄存器中。 |
异常的概念: 计算机通常按照软件的执行流进行顺序执行和跳转,但有时会需要中断正常的执行流程去处理其他任务,可以触发这一过程的事件统称为异常。
从来源来看,异常可按如下分类:
类别 | 介绍 |
---|---|
外部事件 | 来自CPU核外部的事件,来自处理器内部其他模块或者处理器外部的真实物理连线也称为中断。中断的存在使得CPU能够异步地处理多个事件。在操作系统中,为了避免轮询等待浪费CPU时间,与IO相关的任务通常都会用中断方式进行处理。 |
指令执行中的错误 | 执行中的指令的操作码或操作数不符合要求,使得当前指令无法继续执行,应当转到出错处进行处理。 |
数据完整性问题 | 当使用ECC等硬件校验方式的存储器发生校验错误时,会产生异常。可纠正的错误可用于统计硬件的风险,不可纠正的错误则应视出错位置进行相应处理。 |
地址转换异常 | 在存储单元需要对一个内存页进行地址转换,而硬件转换表中没有有效的转换对应项可用时,会产生地址转换异常。 |
系统调用和陷入 | 由专有指令产生,其目的是产生操作系统可识别的异常,用于在保护模式下调用核心态的相关操作。 |
需要软件修正的运算 | 常见的是浮点指令导致的异常,某些操作和操作数的组合硬件由于实现过于复杂而不愿意处理,寻求软件的帮助。 |
1. 异常处理流程
异常处理是一个软硬件协同的过程,通常CPU硬件需要维护一系列控制状态寄存器(域)以用于软硬件直接的交互。异常处理的主要内容是确定并处理异常,同时维护上下文环境。 异常处理的流程如下:
流程 | 内容 |
---|---|
(1)异常处理准备 | 首先,需要记录被异常打断的指令的地址;其次,调整CPU的权限等级(通常调整至最高特权等级)并关闭中断响应;再次,硬件保存异常发生现场的部分信息;最后,记录异常的相关信息。 |
(2)确定异常来源 | 处理器确定异常来源主要有两种方式:一种是将不同的异常进行编号,异常处理程序据此进行区分并跳转到指定的处理入口;另一种是为不同的异常指定不同的异常处理程序入口地址,这样每个入口处的异常处理程序自然知晓待处理的异常来源。 |
(3)保存执行状态 | 在操作系统进行异常处理前,软件要先保存被打断的程序状态,通常至少需要将通用寄存器和程序状态寄存器的值保存到栈中。 |
(4)处理异常 | 跳转到对应异常处理程序进行异常处理 |
(5)恢复执行状态并返回 | 在异常处理返回前,软件需要将第(3)个步骤中保存的执行状态从栈中恢复出来,在最后执行异常返回指令。之所以要采用专用的异常返回指令,是因为该指令需要原子地完成恢复权限等级、恢复中断使能状态、跳转至异常返回目标等多个操作。 |
2. 异常嵌套
在异常处理的过程中,又有新的异常产生,这时就会出现异常嵌套的问题。 异常嵌套通常基于优先级,只有优先级更高的异常才能进行嵌套,低优先级或同优先级的异常只能等待当前异常处理完成,系统支持的优先级级数就是异常嵌套的最大层数。
异常处理的流程是通用的,但有两类异常出现的机会确实比其他类型大很多:
类别 | 介绍 |
---|---|
地址转换异常 | 当片内从虚地址到物理地址的地址转换表不包含访问地址时,就会产生缺页异常 |
中断 | 中断在外部事件想要获得CPU注意时产生。由于外部事件的不可控性,中断处理所用的时间较为关键。 |
1. 中断传递机制
中断从系统中各个中断源传递到处理器主要有两种形式:中断线和消息中断。
中断形式 | 介绍 | 优缺点 |
---|---|---|
中断线 | 用中断线传递是最简单直接的方式。当系统的中断源不多时,直接连到处理器引脚即可。若中断源较多,可使用中断控制器汇总后再与处理器引脚相连。 | (1)扩展性差,在搭建较复杂的板级系统时会引入过多的共享,降低中断处理的效率。(2)中断处理过程需要通过查询中断控制器以及设备上的状态寄存器来确认中断和中断原因,中间延迟较长,效率差。 |
消息中断 | 消息中断以数据的方式在总线上传递。发中断就是向指定的地址写一个指定的数。 | 相比总线外增加专门的中断线的“带外”传输形式,消息中断在“带内”传输。增加中断时不需要改动消息传递的数据通路,因而有较高的扩展性和灵活性。 |
2. 向量化中断
向量化中断的好处质疑是省去了中断处理程序开头识别具体中断源的开销,可以进一步加速中断的处理。中断向量、向量地址、向量中断概念可参考该博客。
3. 中断的优先级
(1)当采用非向量中断模式的时候,处理器通常不区别中断优先级,此时若需要对中断进行优先级处理,可以通过软件方式予以实现;
(2)当采用向量中断模式的时候,处理器通常不可避免地需要依照一套既定的优先级规则来从多个已生效的中断源选择一个,跳转到其对应的处理程序入口处。
4. 中断使能控制位的原子修改
处理器的存储管理部件(Memory Management Unit,MMU)支持虚实地址转换、多进程空间等功能,是通用处理器体现“通用性”的重要单元,也是处理器和操作系统交互最紧密的部分。
1. 存储管理的作用有如下4点:
作用 | 介绍 |
---|---|
隐藏和保护 | 用户态程序只能访问受限内存区域的数据,其他区域只能由核心态程序访问。引入存储管理后,不同程序仿佛在使用独立的内存区域,互相之间不会影响。此外,分页的存储管理方法对每个页都有单独的写保护,核心态的操作系统可防止用户程序随意修改自己的代码段。 |
为程序分配连续的内存空间 | MMU可以由分散的物理页构建连续的虚拟内存空间,以页为单元管理物理内存分配。 |
扩展地址空间 | 在32位系统中,如果仅采用线性映射的虚实地址映射方式,则至多访问4GB物理内存空间,而通过MMU进行转换则可以访问更大的物理内存空间。 |
节约物理内存 | 程序可以通过合理的映射来节约物理内存。 |
页表是放在内存中的,如果每次进行地址转换时都需要先查询内存,则会对性能产生明显的影响。为了提供页表访问的速度,现代处理器中通常包含一个转换后援缓冲器(TLB)来实现快速的虚实地址转换。TLB也称页表缓存或快表,借由局部性原理,存储当前处理器中最经常访问页的页表。一般TLB访问与Cache访问同时进行,而TLB也可以视为页表的Cache。
在计算机中,外存、内存、Cache、通用寄存器可以组织成速度由慢到快的存储层次。TLB在存储层次中的位置和作用于Cache类似,可视为页表这种特殊内存数据的专用Cache。
TLB中存储的内容包括:虚拟地址、物理地址和保护位,可分别对应于Cache的Tag、Data和状态位。包含TLB的地址转换过程如图所示:
过程:
(1)处理器用地址空间标识符(Address Space Identifier,ASID)和虚拟页号(Virtual Page Number,VPN)在TLB中进行查找匹配,若命中则读出其中的物理页号(Physical Page Number,PPN)和标志位(Flag)。标志位用于判断该访问是否合法。
(2)PPN和页内偏移(Offset)拼接组成物理地址。若未在TLB中命中,则需要将页表内容从内存中取出并填入TLB中,这一过程称为TLB重填(TLB Refill)。
上述五小节都是以LoongArch指令系统为例讲解的,本博客就不详细讲解了,可参考课本。
指令系统结构不仅包含指令和相关硬件资源的定义,还包含有关资源的使用方式约定。与二进制程序相关的约定被称为ABI(Application Binary Interface, 应用程序二进制接口)。 ABI定义了应用程序二进制代码中相关数据结构和函数模块的格式及其访问方式,他使得不同的二进制模块之间的交互成为可能。
**ABI包括但不限于如下内容:
ABI内容 |
---|
处理器基础数据类型的大小、布局和对齐方式要求等 |
寄存器使用约定。它约定通用寄存器的使用方法、别名等 |
函数调用约定。它约定参数如何传递给被调用的函数、结果如何返回、函数栈帧如何组织等 |
目标文件和可执行文件格式 |
程序装载和动态链接相关信息 |
系统调用和标准库接口定义 |
开发环境和执行环境等相关约定 |
CPU运行指令的过程中,根据应用或者操作系统的需要,经常会改变指令的执行流,同时根据需要在不同的上下文之间切换。
常见的上下文切换场景 | 介绍 |
---|---|
函数调用 | 函数调用是用户主动发起的指令流和上下文改变。普通的转移指令只改变指令流不改变上下文,函数调用则通过ABI约定实现了一定的上下文变化。函数调用通常伴随着栈帧的变化,此外部分寄存器也会发生变化。 |
异常和中断 | 开始异常和中断处理程序之前需要保存所有可能被破坏的、原上下文可见的CPU状态,并在处理完返回原执行流之前恢复。 |
系统调用 | 系统调用是操作系统内核为用户态程序实现的子程序。系统调用的上下文切换场景和函数调用比较类似,和普通调用相比主要多了特权等级的切换。系统调用要满足安全性和兼容性两方面的要求。 |
进程 |
/resize,p_50,#pic_center