MIPS体系结构学习笔记
- 第一章 概述
- 第二章 MIPS的体系结构
-
- 相关寄存器的时序
- 32个通用寄存器
-
- 通用寄存器的命名
- 32个浮点寄存器
-
- 基本地址空间
- 第三章 协处理器0(cp0):MIPS处理器控制
-
- CP0所做的工作
- CPU控制寄存器及其编码
-
- 状态寄存器SR,status register
- 原因寄存器CR,cause register
- 异常返回地址寄存器,EPC
- 无效虚地址寄存器,BadVaddr
- 计数/比较寄存器,Count/Compare
- 处理器ID寄存器,PRId
- 配置寄存器,Config
- 中断与异常设置 EBase和IntCtl
- 影子寄存器的设置 SRSCtl和SRSMap
- 链接加载地址寄存器 LLAddr
- CP0冒险
- 第四章 MIPS处理器的高速缓存
-
- 高速缓存是什么
-
- 直接映射高速缓存
- 组相联高速缓存
- 全相联高速缓存
- 多级cache机制
- CPU写数据
-
- 写透视高速缓存(早期)
- 写回式高速缓存
- 高速缓存效率
- 第五章 异常、中断和初始化
-
- 精确异常
- 非精确异常
- 异常发生时MIPS CPU所做的工作
- 异常处理步骤
- 嵌套异常
- 最常见的异常
- 中断处理顺序
- 启动顺序
- 底层内存管理与TLB
-
- TLB结构
- TLB工作方式
- TLB异常
- 指令
第一章 概述
MIPS的特点:独立的指令缓存和数据缓存,CPU可以同时获取指令和读写内存变量。
MIPS的五段流水线:
- IF取指 instruction fetch。I-cache指令缓存里面取
- RD读寄存器。
- ALU算术/逻辑单元。
- MEM从D-cache数据缓存中读取变量。
- WB写回寄存器。
MIPS硬件资源配置:
- 32个通用寄存器;
- 32个32位单精度浮点寄存器f0 – f31;
- 2个32位乘、商寄存器Hi和L0:运算乘法时分别存放64位乘积的高、低32位; 除法时分别存放余数和商。
第二章 MIPS的体系结构
数据类型及数据结构
- 所有MIPS指令都是32位长的;
- 单位:
1byte = 8bits 1b(字节)=8位
1halfword = 2bytes 1h(半字长)=2字节
1word = 4bytes 1w(字长)=4字节
1dword = 8bytes 1d=8字节
一个字符空间 =1个字节
一个整形 = 一个字长 = 4个字节
- 符号:
数字就是数字,例如:5
单个字符用单引号,例如:'h’字符串用双引号,例如:“A string”
栈的走向是从高地址到低地址
相关寄存器的时序
- 上电后。设置SR使CPU进入可工作状态,以便启动程序。Config寄存器需要结合硬件确认配置问题足够一致。
- 处理异常。Cause寄存器可以找出异常类型并分别处理;K0或K1指向异常处理程序预留的某个地址空间;返回地址存在EPC寄存器中。
- 从异常处理返回。最终必须返回异常时存在 EPC 的值。SR设置原来的值,恢复用户特权级设置,使能中断。
- 中断。SR调整中断掩码,中断优先级的判断。 只是用来触发异常的指令。break和sycalll指令。
32个通用寄存器
- $0:始终是0
- $1-$30:正常读写,任何指令可以使用
- $31:存放子程序调用指令(jal)返回的地址,大多数情况
通用寄存器的命名
格式:寄存器编号–助记符–用途—英文
0–zero–总是返回0–zero
1–at–汇编暂存寄存器–Assembler temporary register
2,3–v0,v1–子程序返回值–value
4,7–a0,a3–子程序前面参数–arguments
8,15–t0,t7–暂存器–temporary register
16,23–s0,s7– 子程序寄存器变量,如果用,需要SAVE/RESTORE–saved)
24,25–t8,t9–暂时的(或随便用的) –temporary
26,27–k0,k1–中断/陷入处理器保留
28–gp– 全局指针(Global Pointer)
29–sp– 堆栈指针(Stack Pointer)
30–s8/fp–帧指针(Frame Pointer)
31–ra–返回地址(return address)
32个浮点寄存器
略
做乘法运算需要4-12个周期;做除法运算需要20-40个周期
只能用load和store指令访问内存
基本地址空间
地址空间分为四个区域
-
地址:0x0000.0000–7FFF.FFFF
kuseg,32位用户空间,2G -
地址:0x8000.0000–9FFF.FFFF
kseg0,非映射、缓存的,512MB
高位清零就转换成物理地址 -
地址:0xA000.0000–BFFF.FFFF
kseg1,非映射、非缓存的,512MB
重启的入口向量:0xBFC0.0000
可作为访问初始程序的ROM,也可以用来访问IO寄存器 -
地址:0xC000.0000–FFFF.FFFF
kseg2,映射的,1G
只能在核心态下使用
(地址范围按位编址,内存是按照字节编址,一字节八位。2的10次方是1kb)
寻址方式:只有一种内存寻址方式。就是基地址加一个16位的地址偏移;
第三章 协处理器0(cp0):MIPS处理器控制
CP0所做的工作
- CPU的配置
- 缓存控制
- 异常中断控制
- 存储管理单元控制
- 杂项,包括:时钟、事件计数器、奇偶校验错误检测
CPU控制寄存器及其编码
状态寄存器SR,status register
SR寄存器的各个域及重要域的解读:
- 31:28—-CU3:CU0
每一位分别用于设定协处理器3-0是否可用
CU3的解码空间被MIPS32/64标准中的浮点指令集所占用,与标准CP1不兼容
实现CU2为得到32个额外的、容易访问的寄存器
CU1置1 可以使用FPU
CU0置位会得到用户特权级别的程序 - RP,减少功率reduced power
- FR,模式开关。置1使32个双精度浮点寄存器对软件可见
- RE,反转用户态的大小尾端设置
- MX,使能DSP或者MDMX ASE(指令集扩展),实现其一
- PX,见UX
- BEV,启动异常向量,一般为0,反之进入异常入口
- TS,TLB关闭
- SR,NMI,软件重启或不可屏蔽中断的发生
- 15:8—-IM7:0,中断屏蔽
- 7:5—KX,SX,UX,对应三个不同的特权级别:内核kernel、监管者superintendent、用户user
- KSU,EXL或ERL被异常置位,cpu工作在内核级别
- ERL,错误级别
- EXL,异常级别
- IE,使能全局中断
原因寄存器CR,cause register
可以查询发生了什么种类异常并调用哪一个异常处理例程。
- BD:分支延迟
- TI异常是由于内部计时器中断引起的
- CE协处理器错误
- DC置1可以停止count寄存器继续计数
- PCI,CP0性能计数器溢出,产生这个中断
- IV写为1使用一个特殊的中断异常入口地址
- WP若读值为1,cpu进入异常模式,挂起观测点异常
- IP7-0中断被挂起,提示哪个中断要发生
- ExcCode,是一个五位编码,告诉你哪种异常发生
异常返回地址寄存器,EPC
无效虚地址寄存器,BadVaddr
计数/比较寄存器,Count/Compare
CPU上的计时器
处理器ID寄存器,PRId
配置寄存器,Config
负责CPU资源信息与配置
MIPS32/64标准定义了4个可供系统初始化软件使用的配置寄存器:Config、Config1-3
Config字段:
- M 延续位
- Impl实现相关的配置标记
- BE,1大尾端;0小尾端
- AT 0–MIPS32;1–MIPS64指令集,但是使用MIPS32的地址映射;2—MIPS64指令集,使用全地址映射
- AR体系发行版本
- MT,MMU类型
- VI虚拟指令缓存
- K0可写字段用来确定固定的kseg0区域是否可存
Config1字段和Config2字段类似
Config3字段
以上三个寄存器字段对应书籍51页
中断与异常设置 EBase和IntCtl
提供对增加的中断进行控制的能力
EBase为了能够对CPU的所有异常项进行重新分配
影子寄存器的设置 SRSCtl和SRSMap
链接加载地址寄存器 LLAddr
监控可能导致后来的条件存储失败的访问
CP0冒险
- 执行冒险:被影响到的指令在其他需要读CP0寄存器的值之前不会受到影响。使用ehb指令清楚。
- 指令冒险:被影响到的指令在一开始就会受到影响,最坏的情况就是从缓存或者从内存中取指令的时候。使用jr.hb和jalr.hb指令清楚冒险。
第四章 MIPS处理器的高速缓存
高速缓存是什么
高速缓存的工作就是将内存中的最近读写过的数据在高速缓存中保留一个备份,对应用程序绝对透明。
工作原理的通用逻辑:
- 组选择(索引)
- 行匹配
- 字抽取
直接映射高速缓存
高速缓存行:标签(数据所属地址)+数据
- 内存地址低位索引至组
- 内存地址高位与高速缓存行匹配(命中/缺失),每组只有一行
- 根据偏移地址取值
优点:结构简单、速度快
缺点:低位地址冲突,命中率低
组相联高速缓存
- 同直接映射
- 稍复杂,需要一个一个进行匹配
- 同直接映射
优点:解决高速缓存缺失
缺点:难集成
全相联高速缓存
一个组多行,不需要索引直接匹配
优点:用于快速地址翻译
缺点:价格昂贵
多级cache机制
对于以一级cache没有命中的的情况,很多高性能的处理器采用三级cache的方法。但是其读写延迟依次增加,实现的成本依次降低。
现代系统采用从 Register —> L1 Cache —> L2 Cache —> L3Cache —> Memory —> Mass storage 的层次结构,是为解决性能与价格矛盾所采用的实际可行的折中设计。
CPU写数据
写透视高速缓存(早期)
CPU将数据直接写入到主内存中。如果对应的内存位置在高速缓存中有备份,将会被更新状态和数据
缺点:速度慢,会拥塞存储系统
写回式高速缓存
把要写的数据保存在高速缓存中,并做好标记,后面需要将这些数据写回到内存中
高速缓存效率
缓存性能取决于系统等待高速缓存充填的时间,总结为两个参数的乘积:
- 每条指令的高速缓存缺失率
- 高速缓存缺失或者充填的开销
提高系统运行速度:
- 减少高速缓存缺失次数。(高速缓存变大、增加相联度、增加层次)
- 减少高速缓存充填的代价。(数据更快到达)
- 尽早重启CPU
- 直到必须使用数据时才停止CPU
- 多线程CPU
第五章 异常、中断和初始化
异常事件:
- 外部事件
- 内存翻译异常
- 其他不太常见的内核修正的程序条件
- 程序或者硬件探测到的错误
- 数据完整性的问题
- 系统的调用和陷入
精确异常
发生异常之后,CP0中的EPC寄存器指向异常发生时跳转指令之前的位置,处理完成之后指向该地址继续执行。
但如果受害指令在分支延迟槽中,则会硬件自动处理使EPC往回指一条指令,即分支指令。在重新执行分支指令时,分支延迟槽中的指令会被再执行一次。
非精确异常
异常发生时,跳转前最后被执行的指令是其MEM阶段刚好被执行完的那条指令。受害指令是其ALU阶段刚好执行完的那条指令。
异常发生时MIPS CPU所做的工作
- 设置EPC,指向重新启动的位置;
- 置SR(EXL),禁用中断,CPU进入内核模式
- 设置cause寄存器,查找异常原因
- 根据错误进入处理入口点取指执行
异常处理步骤
- 引导
- 区分不同的异常
- 构建异常处理环境
- 处理异常
- 准备返回
- 从异常返回
嵌套异常
定义:处理某个异常的时候,同时允许其他异常的发生
设计嵌套异常就需要用一块内存区域来存储寄存器的值,这样可以保证错误数据不会再次覆盖。
最常见的异常
- TLB缺失
- 中断
中断处理顺序
- 查看 Cause 的 IP 域
- 选择一个活跃的且使能的中断来处理
- 更新中断屏蔽为 SR(IM) 。
- 设置全局中断使能位,允许处理更高级别的中断,改变 SR(KSU) ,使 CPU 工作在内核态。
- 调用中断处理过程。
- 返回时,禁止中断以恢复中断前的寄存器的值,恢复被中断任务的执行。
启动顺序
- 跳转到主 ROM 代码。 异常入口没有足够的空间存放完整的启动代码,另外也是一个简单的测试( CPU 是否可用)。
- 设置状态寄存器 SR。(可对非缓存区操作)
- 在初始化并且对 RAM 的完整性进行自检前,启动代码只能使用寄存器。
- 分配栈,设置其他寄存器。
- 初始化缓存,运行代码
底层内存管理与TLB
TLB结构
- VPN2虚页框号;PFN物理页框号
- 第一个 PFN 对应的虚页框号为 VPN2 ;第二个 PFN 对应的虚页框号为 VPN2 + 1。
- PageMask,页掩码,为支持可变页大小而设。
- G,Globle 位,如置该位为 1 ,则说明该 TLB项是全局的,可供任何进程使用,TLB 检索时处理器将忽略 ASID 的检查
- V: Valid,1 位,置 1 说明该页是有效的。
- D:Dirty,1 位,置 1 表明该页中的数据被修改过
- C: Cache,3 位,指示对该页所用的缓存算法,可以设置之,而让处理器不将该页数据缓存于 Cache
TLB工作方式
- 处理器取虚址的高位作 VPN
- 直接将其与 TLB 的所有项同时比较。有匹配的项且该项有效 (V 为 1) 则直接输出 PFN ,否则抛出 TLB Refill 异常,后则由 OS 负责在该异常处理。
- 以随机方式写入 TLB
- 异常返回,重新执行一次访存指令,因此会重走一次 TLB。
TLB异常
- TLB 重填异常 。当所访问的虚拟地址在 TLB 中没有对应项时 , 处理器会抛出该异常。TLB 的容量有限 , 而一个 OS 的页表众多, 这个就需要软件在适当的时候填充 TLB , 这个是引入 TLB 重填异常的目的。
- TLB 无效异常 。 处理器用 VA 匹配 TLB时 , 有命中但该项之有效位 V 为 0 则引发给异常。硬件在匹配时检测到一个匹配项无效时 , 相应的就需要软件的处理 , 这个是引入TLB 无效异常的目的。
- TLB 修改异常。当匹配的 TLB 表项有效时,内存对映射地址引用,但是表项的 D 位为零,表示该页面不可写。
指令
- tlbr
TLB 读指令。处理器执行该指令时,直接读取 Index 所指示的 TLB 项,并将其内容分别置入 PageMask,EntryHi,EntryLo0 和 EntryLo1。
其中EntryLo0 之 G 位与 EntryLo1 之 G 位相同,来自 TLB 项中仅有的一个 G 位。
tlbwi/tlbwr
TLB 写指令。
tlbwi 为 TLB Write Indexed ,即索引方式写 TLB ,入口项由 Index 寄存器指定。
tlbwr 为 TLB Write Random ,即随机方式写 TLB ,入口项以 Random 寄存器的值为伪随机数,计算相应的入口值。
输入的 TLB 数据,亦置于 EntryHi,EntryLo0 和 EntryLo1。
输入数据时要注意,EntryLo0 之 G 位要与 EntryLo1 之 G 位一致。
tlbp
TLB 查询指令,即 TLB Probe。
其以 EntryHi[VPN2] 检索整个 TLB ,有匹配的项则继续检查该项之 ASID 是否与EntryHi[ASID] 相等,若满足,则将该项的索引值(标号)写入 Index 。若无满足条件的项,则将 Index 的 31 位置为 1。
该指令 probe 的内容仅此而已,若要读取该项的其它数据,可在其后紧随一条 tlbr 。