同样我们接着讲今天新的CPU架构,那就是具有我国代表性CPU龙芯的MIPS架构,当今处理器有四大架构,一个是以 intel 和 AMD 为代表的 x86 架构,另一个是手机,平板等移动处理器所使用的 ARM 架构,再有就是当今发展趋势良好的开源架构 RISC-V,最后一个便是我国龙芯处理器所选择的 MIPS 架构。这四大处理器架构中,X86 和 ARM 是商业化进程最为优秀的两大架构,RISC-V 则凭借其开源优势顺应当前火热的物联网和 AI 发展趋势。
虽然就目前来说,MIPS架构虽然默默无闻,但却是在X86与ARM架构之前,MIPS就已经出现,只是MIPS架构的发展并不尽人如意。
MIPS架构(英语:MIPS architecture,为Microprocessor without interlocked piped stages architecture的缩写,亦为Millions of Instructions Per Second的双关语),是一种采取精简指令集(RISC)的处理器架构,1981年出现,由MIPS科技公司开发并授权,广泛被使用在许多电子产品、网络设备、个人娱乐装置与商业装置上。最早的MIPS架构是32位,最新的版本已经变成64位。
MIPS指令集架构(MIPS架构在适应改进的过程中在每一个迭代的版本中都会进行一些优化):
MIPS I:
最早的32位处理器(R2000/3000)使用的指令集,几乎每一个MIPS架构CPU都可以运行这些指令。
MIPS II:
为没有投产的MIPS-R6000机器定义的指令集。MIPS-II是MIPS32的前身。
MIPS III:
为R4000引入的64位指令集。
MIPS IV:
在MIPS-III基础上添加了浮点指令,R10000和R5000硬件实现中使用。
MIPS V:
添加了2个奇怪的SIMD浮点操作指令,但是没有具体的CPU实现。大多是作为MIPS64架构的可选部分-单精度对出现。
MIPS32、MIPS64:
1998年,由从Silicon Graphics公司分拆出来的MIPS Technologies Inc.公司制定的标准。该标准第一次纳入了CPU控制的功能,由协处理器0实现。MIPS32是MIPS-II的超集,MIPS64是MIPS-IV的超集(还以可选的方式包含了MIPS-V的大部分)。
并且当时MIPS加固的CPU加速对内存的访问,提高CPU的工作效率,所以CPU设计中引入了Cache,因为指令不同于数据,是只读属性,所以,MIPS架构采用哈弗结构,将数据Cache和指令Cache分开同时读取指令和读写变量。
MIPS架构5级流水线:
MIPS本身就是基于流水线优化设计的架构,将MIPS指令分为5个阶段,每个阶段占用固定的时间,固定的时间是指处理器的时钟周期(有2个指令花费半个时钟周期,所以,MIPS的5级流水线实际上占据4个时钟周期)。
所有的指令都是严格遵守流水线的各个阶段,即使某个阶段什么也不做。这样做的结果就是,只要Cache命中,每个时钟周期CPU都会启动一条指令。
取指令-IF:从I-Cache中取要执行的指令。
读寄存器-RD:取CPU寄存器中的值。
算术、逻辑运算-ALU:执行算术或逻辑运算。(浮点运算和乘除运算在一个时钟周期内无法完成,我们以后再写文章专门讲解FPU相关的知识)
读写内存-MEM:也就是读写D-Cache。至于这儿为什么说读写数据缓存,是因为内存的读写速度实在太慢了,无法满足CPU的需要。所以出现了D-Cache这种高速缓存。但即便如此,在读写D-Cache期间,平均每4条指令就会有3条指令什么也做不了。但是,每条指令在这个阶段都应该是独占数据总线的,不然会造成访问D-Cache冲突。这就是内存屏障和总线锁存在的理由。
写回寄存器-Writeback:将结果写入寄存器。
MIPS架构在R和I型指令格式中,寄存器操作数字段均为5位,共有32个寄存器
$0:zero,该寄存器总是返回零,为0这个有用常数提供了一个简洁的编码形式。
$1:即at,该寄存器为汇编保留。由于I型指令的立即数字段只有16位,在加载大常数时,编译器或汇编程序需要把大常数拆开,然后重新组合到寄存器里。
$2-$3:(v0−v1)用于子程序的非浮点结果或返回值。对于子程序如何传递参数及如何返回,MIPS范围有一套约定,堆栈中少数几个位置处的内容装入CPU寄存器,其相应内存位置保留未做定义,当这两个寄存器不够存 放返回值时,编译器通过内存来完成。
$4-$7:(a0−a3)用来传递前四个参数给子程序,不够的用堆栈。a0-a3和v0-v1以及ra一起来支持子程序/过程调用,分别用以传递参数,返回结果和存放返回地址。
$8-$15:(t0−t7)临时寄存器,子程序可以使用它们而不用保留。
$16-$23:(s0−s7)保存寄存器,在过程调用过程中需要保留(被调用者保存和恢复,还包括fp和ra)。MIPS提供了临时寄存器和保存寄存器,这样就减少了寄存器溢出(spilling,即将不常用的变量放到存储器的过程), 编译器在编译一个叶(leaf)过程(不调用其它过程的过程)的时候,总是在临时寄存器分配完了才使用需要 保存的寄存器。
$24-$25:(t8−t9)临时寄存器,子程序可以使用它们而不用保留。
$26-$27:(k0,k1)为操作系统/异常处理保留,至少要预留一个。异常(或中断)是一种不需要在程序中显示调用的过程。MIPS有个叫异常程序计数器(exception program counter,EPC)的寄存器,属于CP0寄存器,用于保存造成异常的那条指令的地址。
$28:(gp)为了简化静态数据的访问,MIPS软件保留了一个寄存器:全局指针gp
$29:(sp)堆栈指针寄存器。MIPS硬件并不直接支持堆栈,你可以把它用于别的目的,但为了使用别人的程序或让别人使用你的程序, 还是要遵守这个约定的,但这和硬件没有关系。
$30:( fp)存放栈帧指针寄存器。为支持MIPS架构的GNU C编译器保留的,MIPS公司自己的C编译器没有使用,而把这个寄存器当作保存寄存器使用。
$31:( ra)存放返回地址。MIPS有个jal(jump-and-link,跳转并链接)指令,在跳转到某个地址时,把下一条指令的 地址放到ra中,用于支持子程序调用。
MIPS指令集的限制:
1.所有的指令都是32位长度:整体的MIPS二进制文件要比X86的文件大百分之二十,造成一条指令无法操作32位常数
2.指令操作必须适合流水线:指令的每一步操作都必须在流水线的正确阶段执行,且必须在一个时钟周期内完成
3.3个操作数的指令:编译器三个操作数的运算,对于复杂的表达式能够有更大的优化空间。而算术/逻辑运算指令不需要存储操作,所以有足够的位表示两个源操作寄存器和一个目的寄存器。
4.32个通用寄存器:通用寄存器的个数是由软件需求驱动的,32个通用寄存器是现代计算机架构中常用的数量。
5.寄存器0:寄存器0总是返回一个0常数。0是最常用的一个常数,直接用一个寄存器表示,可以减少常数向寄存器的加载操作。
6.指令不含条件码:使相比其它RISC架构,MIPS指令集也具有一个重要特性就是没有任何条件标志,而MIPS使用寄存器进行保存这些标志信息。
MIPS寻址方式:
1.立即数寻址
immediate addressing
2.寄存器直接寻址
register addressing
3.基址寻址
basic addressing
使用通用寄存器作为基址寄存器,以立即数作为偏移量,立即数带符号扩展为32位,和基址寄存器的值一起得到主存地址
4.相对寻址
PC的值和偏移量相加得到主存地址,以立即数为偏移量。立即数带符号扩展为32位并左移2位再和PC的内容相加PC的值会被修改为相加结果。
5.页面寻址
26位的地址码左移2位变为28位,作为地址的低28位,PC的值会被修改高4位是PC改变后的值(取出指令后PC自动增加)
单周期MIPS数据通路示意图:
多周期MIPS数据通路示意图:
多周期MIPS状态转换图:
本篇主要是详解处理器芯片MIPS架构下的底层架构以及相关的结构信息进行知识补充学习,以及各个组成模块下的交互方式。
以上就是本次的处理器芯片架构或者指令集之MIPS架构的帖子,感谢大家的参阅支持,一同学习,向大家提供更加优质的技术信息!
励志分享超清壁纸语句~~:
立志用功如种树然,方其根芽,犹未有干;及其有干,尚未有枝;枝而后叶,叶而后花。------王守仁
好的今天就到这里,老样子,感谢各位大神的参阅,孩子为了挣豆子不容易,孩子家里穷没豆子吃饭了!!!