【基础知识】CPU详细整理(个人整理)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
【基础知识】CPU详细整理(个⼈整理)
本⽂只是个⼈对cpu的理解,不建议浏览
提要
64位/32位操作系统,64/32指的是通⽤寄存器的位数。
定义
中央处理器(英語:Central Processing Unit,缩写:CPU)是计算机的主要设备之⼀,功能主要是解释计算机指令以及处理计算机软件中的数据。
组成
:、(部件:、、、、)
:、(部件:、、、、、)
寄存器:100多个寄存器
CPU运⾏图(⾃⼰画的)
CPU的运作原理:取指令》译码》获取操作数》执⾏指令(ALU)》存储(寄存器)
1、取指令
取指令(Instruction Fetch,IF)阶段是将⼀条指令从主存中取到的过程。
程序计数器 PC 中的数值,⽤来指⽰当前指令在主存中的位置。
当⼀条指令被取出后,PC 中的数值将根据指令字长度⽽⾃动递增:若为单字长指令,则(PC)+1->PC;若为双字长指令,则(PC)+2->PC,依此类推。
2.指令译码阶段
取出指令后,计算机⽴即进⼊指令译码(Instruction Decode,ID)阶段。
在指令译码阶段,指令译码器按照预定的指令格式,对取回的指令进⾏拆分和解释,识别区分出不同的指令类别以及各种获取操作数的⽅法。
在组合逻辑控制的计算机中,指令译码器对不同的指令操作码产⽣不同的控制电位,以形成不同的微操作序列;在微程序控制的计算机中,指令译码器⽤指令操作码来找到执⾏该指令的微程序的⼊⼝,并从此⼊⼝开始执⾏。
在传统的设计⾥,CPU中负责指令译码的部分是⽆法改变的。
不过,在众多运⽤微程序控制技术的新型 CPU 中,微程序有时是可重写的。
3.执⾏指令阶段
在取指令和指令译码阶段之后,接着进⼊执⾏指令(Execute,EX)阶段。
此阶段的任务是完成指令所规定的各种操作,具体实现指令的功能。
为此,CPU 的不同部分被连接起来,以执⾏所需的操作。
例如,如果要求完成⼀个加法运算,算术逻辑单元 ALU 将被连接到⼀组输⼊和⼀组输出,输⼊端提供需要相加的数值,输出端将含有最后的运算结果。
4.访存取数阶段
根据指令需要,有可能要访问主存,读取操作数,这样就进⼊了访存取数(Memory,MEM)阶段。
此阶段的任务是:根据指令地址码,得到操作数在主存中的地址,并从主存中读取该操作数⽤于运算。
5.结果写回阶段
作为最后⼀个阶段,结果写回(Writeback,WB)阶段把执⾏指令阶段的运⾏结果数据“写回”到某种存储形式:结果数据经常被写到 CPU
的内部寄存器中,以便被后续的指令快速地存取;在有些情况下,结果数据也可被写⼊相对较慢、但较廉价且容量较⼤的主存。
许多指令还会改变程序状态字
中标志位的状态,这些标志位标识着不同的操作结果,可被⽤来影响程序的动作。
在指令执⾏完毕、结果数据写回之后,若⽆意外事件(如结果溢出等)发⽣,计算机就接着从程序计数器 PC 中取得下⼀条指令地址,开始新⼀轮的循环,下⼀个指令周期将顺序取出下⼀条指令。
许多新型 CPU 可以同时取出、译码和执⾏多条指令,体现并⾏处理的特性。
CPU的内部结构解析
CPU和内存是由许多晶体管组成的电⼦部件,通常称为IC(Integrated Circuit,集成电路)。
从功能⽅⾯来看,CPU的内部由寄存器,控制器,运算器和时钟四部分构成,各部分之间由电流信号相互连通。
寄存器:
可⽤来暂存指令,数据等处理对象,可以将其看做是内存的⼀种。
根据种类的不同,⼀个CPU内部会有20~100个寄存器。
使⽤⾼级语⾔编写的程序会在编译后转化成机器语⾔,然后通过CPU内部的寄存器来处理。
不同类型的CPU,其内部寄存器的数量,种类以及寄存器存储的数值范围都是不同的。
根据功能的不同,我们可以将寄存器⼤致划分为⼋类。
累加寄存器:存储执⾏运算的数据和运算后的数据。
标志寄存器:存储运算处理后的CPU的状态。
pc程序计数器:指令指针存储下⼀条指令所在内存的地址。
指令计数器是⽤于存放下⼀条指令所在单元的地址的地⽅。
为了保证程序(在操作系统中理解为进程)能够连续地执⾏下去,CPU必须具有某些⼿段来确定下⼀条指令的地址。
⽽正是起到这种作⽤,所以通常⼜称为指令计数器。
在程序开始执⾏前,必须将它的起始地址,即程序的⼀条指令所在的内存单元地址送⼊PC,因此程序计数器(PC)的内容即是从内存提取的第⼀条指令的地址。
当执⾏指令时,将⾃动修改PC的内容,即每执⾏⼀条指令PC增加⼀个量,这个量等于指令所含的字节数,以便使其保持的总是将要执⾏的下⼀条指令的地址。
由于⼤多数指令都是按顺序来执⾏的,所以修改的过程通常只是简单的对PC加1。
PC的维数⼀般和存储器地址寄存器MAR的维数⼀样。
当程序转移时,转移指令执⾏的最终结果就是要改变PC的值,此PC值就是转去的地址,以此实现转移。
有些机器中也称PC为指令指针(Instruction Pointer)
基址寄存器:存储数据内存的起始地址。
变址寄存器:存储基址寄存器的相对地址。
通⽤寄存器:存储任意数据。
指令寄存器:存储指令。
CPU内部使⽤,程序员⽆法通过程序对该寄存器进⾏读写操作。
栈寄存器:存储栈区域的起始地址。
取指令:程序计数器是⽤于存放下⼀条指令所在单元的地址的地⽅。
当执⾏⼀条指令时,⾸先需要根据PC中存放的指令地址,将指令由内存取到指令寄存器中,此过程称为“取指令”
其中,程序计数器,累加寄存器,标志寄存器,指令寄存器和栈寄存器都只有⼀个,其他的寄存器⼀般有多个。
译码器:指令译码器的东西根据IR的内容⽣成很多的微操作指令,从⽽去控制其他部件已完成相应的功能
控制器:
负责把内存上的指令,数据等读⼊寄存器,并根据指令的执⾏结果来控制整个计算机。
运算器:
负责运算从内存读⼊寄存器的数据。
时钟:
负责发出CPU开始计时的时钟信号。
不过,也有些计算机的时钟位于CPU的外部。
CPU指令集是什么
微架构
微架构是指⼀套⽤于执⾏指令集的微处理器设计⽅法,每⼀个CPU都会⽤⽤⼀套微框架来处理指令集
MMU(Memory Management Unit)内存管理单元:
CPU 的主频:CPU 的主频是由⼀个晶体振荡器来实现的
⼀种硬件电路单元负责将虚拟内存地址转换为物理内存地址
所有的内存访问都将通过 MMU 进⾏转换,除⾮没有使能 MMU。
MMU(内存管理单元):包括从逻辑地址到虚拟地址(线性地址)再到内存地址的变换过程、页式存储管理、段式存储管理、段页式存储管理、虚拟存储管理(请求分页、请求分段、请求段页)。
MMU位于CPU内部,可以假想为⼀个进程的所需要的资源都放在虚拟地址空间⾥⾯,⽽CPU在取指令时,机器指令中的地址码部分为虚拟地址(线性地址),需要经过MMU转换成为内存地址,才能进⾏取指令。
Swap模式时代
早期计算机在执⾏程序时,将程序从磁盘加载到内存执⾏中执⾏,在多⽤户系统中,当新的⽤户程序被执⾏前,需要先将当前⽤户的程序从内存swap到磁盘,然后从磁盘加载新的程序执⾏,当前⽤户退出后,在将前⼀⽤户程序从磁盘中加载到内存继续执⾏,每次⽤户切换伴随程序的swap,消耗较⼤。
Page模式时代
后来⼈们将内存划分为固定⼤⼩的Page,⼀般为4K或者更⼩,这样⽤户程序按需以Page的⽅式加载到内存,不需要将整个程序加载到内存,这样内存可同时容纳更多程序,⽽⽆需按照⽤户切换进⾏swap,提升了内存利⽤率和加载时间(PageFault是Page时代的产物,⽽⾮MMU时代独有)。
动态地址转换(DAT - Dynamic Address Translation)时代
最早可以追溯到1966年IBM研发的System/360-Model67,在该计算机的设计中⾸先引⼊了动态的地址转换机制,在Page模式基础上,为⽤户程序分配虚地址(VA),通过DAT转换为物理地址(PA)进⾏访问。
通过好处是⽤户可以使⽤连续的地址,⽽不再受制于物理内存⼤⼩和Page碎⽚化的限制,原则上⽤户的程序只受磁盘⼤⼩限制,代价是增加虚实地址转换机制。
实现⽅式
采⽤segment、page、offset模式,将24-bit虚拟地址分为3段,0-7bit保留,8-11bit索引segment,⼀共16个segment,12-19bit 索引page,每个segment最多256个page,20-31bit为page offset,每个⽤户有⼀个虚实地址映射表,分为2级,即segment表和page表,每个segment指向⼀个page表。
转换过程
当CPU访问⼀个虚地址时,先通过VA的8-11bit查找segment表得到page表,再根据12-19bit在page表中找到PA的page起始地址,加上20-31bit的page offset就得到实际的PA了。
这就是MMU最早的雏形了。
现代MMU的实现
现代CPU的MMU的地址转换⽅式⼀般分为3种模式,即实地址模式、块地址转换、页地址转换。
现代MMU的实现
现代CPU的MMU的地址转换⽅式⼀般分为3种模式,即实地址模式、块地址转换、页地址转换。
实地址模式
即CPU状态位中MMU使能位清零,MMU处于关闭状态,此时CPU操作的地址不经过转换(VA=PA),直接作为物理地址进⾏访
问,CPU上电时或者在异常⼊⼝时处于该状态,在该状态下可以访问任意物理内存,⾮常危险,⼀般操作系统在CPU上电后做完必要初始化以后便使能MMU,或者在异常处理的⼊⼝保存好必要信息后使能MMU。
块地址转换
或者成为固定的地址转换或静态配置的地址转换表,这种模式⽀持配置⼀些固定的内存地址映射(VPN->RPN),⽐如Linux
Kernel加载的地址,以PowerPC604为例,0xC0000000这段地址开始的256M内存映射使⽤了该模式的转换,好处是这种配置转换速度快,⼀般在特定的寄存器中配置,没有页表查找过程,缺点是缺乏灵活性,⼀次配置永久使⽤。
页地址转换
类似于早期的动态地址转换DAT,即将VA的⼀部分bit⽤于索引segment,另外⼀部分bit⽤于索引PTE表,最终得到物理地址的Page起始地址,再加上最后12bit(4K)的Page offset得到真正的物理地址。
相⽐早期的DAT,有以下优化:
增加了PTE表的缓存TLB(Translation lookaside Buffer),有些处理器将ITLB(指令)和DTLB(数据)分开,以减少指令和数据之间的缓存冲突。
⽀持更⼤的物理地址(36bit以上)或逻辑地址,如在PowerPC中,⽤以应对现代操作系统的多进程管理将32bit通过segment寄存器扩展为52bit的逻辑地址,然后通过hash函数得到key⽤来查找PTE,并最终转换为36bit物理地址,逻辑地址的扩展⽤于减少多进程之间的PTE冲突。
⽀持多种PTE查找⽅式,如硬件查找和软件查找。
MMU地址转换流程如下:
主要分为⼏个阶段:
⽤户进程访问虚存地址。
触发TLB查找过程,该部分通过硬件完成(灰⾊背景),没有软件参与。
TLB miss场景下,查找PTE(粉⾊背景),该部分在不同CPU上实现不同,像X86都是硬件查找,PowerPC有些处理器使⽤软件查找,即在内核实现⼀个TLB miss的异常处理,可以灵活做到TLB查找。
Do Page Fault,分为⼏种情况:
新申请内存第⼀次读写,触发物理内存分配
进程fork后⼦进程写内存触发Copy-On-Write。
⾮法内存读写,错误处理
汇编语⾔的的指令是和寄存器和运算器存储器⼀⼀对应的。
如,加法指令00000011写成汇编语⾔就是 ADD。
只要还原成⼆进制,汇编语⾔就可以被 CPU 直接执⾏,所以它是最底层的低级语⾔。
C# IL代码指令不是⼀⼀对应的。
IL的指令是组合出来的。
是对机器指令的抽象。