32位PowerPC构架通用寄存器分析及总结二
第四部分操作系统环境(OEA-Operating Environment Architecture)寄存器寄存器集
OEA寄存器集包含四类寄存器:
1:配置寄存器(Configuration Registers)
MSR寄存器:
定义处理器的状态,它可以被mtmsr, sc, rfi指令修改;可以被mfmsr读取;
PVR寄存处:
定义寄存器模型的版本和处理器的版本
2:内存管理寄存器(Memory Management Registers)
BAT寄存器:
OEA定义了四组BAT指令寄存器(IBAT0U-IBAT3U和IBAT0L-IBAT3L),也定义了四组BAT数据寄存器(DBAT0U-DBAT3U和DBAT0U-DBAT3U)
SDR1寄存器:
该寄存器定义了用于虚拟地址转换为物理地址所需要的页表基地址
SR寄存器:
OEA定义了16个32位的SR寄存器(SR0-SR15)
3:中断处理寄存器(Interrupt Handing Register)
DAR(Data Address Register)寄存器:
在DSI(Data Storage Interrupt)和对齐中断发生之后,DAR寄存器被设置成异常指令产生的有效地址;
SPRG0-SPG3寄存器: 提供给操作系统使用
DSISR寄存器: 定义产生DSI(Data Storage Interrupt)和对齐中断的原因
SPR0(Machine status save/restore register 0)寄存器:
在中断中用来保存MSR寄存器,当rfi指令执行时,用来恢复MSR寄存器
SPR1(Machine status save/restore register 1)寄存器: 在中断中用来保存MSR寄存器,当rfi指令执行时,用来恢复MSR寄存器
4:多功能寄存器(Miscellaneous Registers)
TB(time base)寄存器:
具体参考第三部分VEA
DEC寄存器:这是一个32位的递减计数器
EAR(External Access Register)寄存器:用于访问外部设备
DABR(Data address breakpoint register):用来控制数据地址断点功能
PIR(Processor identification register):在多处理器的芯片上用来标识一个核,例如在MPC8641d芯片上有两个E600的core,就用PIR来定位其中的core。
OEA寄存器集的示意图如下:
4.1 MSR寄存器
MSR寄存器定义了处理器的状态,在初始化PowerPC 核心时,MSR是第一个被配置的处理器。当一个中断发生时MSR寄存器的相关位将会发生改变。它也可以被mtmsr, sc, rfi指令所修改,被mfmsr读取。
格式如下:
各个字段说明:
MSR[0:12]:保留位
备注:在E600内核中使用了保留位中第6位来表示是否使用VltiVec指令
MSR[13]-POW位:能源管理机制(Power management enable)是否开启
MSR[14]:保留位
MSR[15]-ILE:(Interrupt little-endian)采用小端格式的中断模式是否开启,当中断发生时该位被拷贝到MSR[31]-LE来确定中断上下文的端模式
MSR[16]-EE:外部中断(External interrupt)是否开启,
MSR[17]-PR:指令特权级1-用户级 0-系统级
MSR[18]-FR:浮点运算是否开启
MSR[19]-ME:机器检测是否开启
MSR[20]-FE0和MSR[23]-FE1:用来确定浮点数的异常模式,示意图如下:
MSR[21]-SE:单步调试追踪是否开启
MSR[22]-BE:分支预测追踪是否开启
MSR[24]:保留位
MSR[25]-IP:(Interrupt prefix.)中断向量号地址前缀
MSR[26]-IR:指令地址转换是否开启
MSR[27]-DR:数据地址转换是否开启
MSR[28:29]:保留位
备注:E600使用了MSR[29]位来表示是否开启性能监视标识模式(PMM-Performance Monitor Marked mode)
MSR[30]-RI:机器重启或者机器检查中断恢复是否开启
MSR[31]-LE:小段模式是否开启
备注:开启相应位置1,关闭置 0
4.2 PVR寄存器
PVR寄存器是32位的只读寄存器,它存放是PowerPC内核版本号,可以用mtspr指令把PVR的值拷贝到一个通用寄存器GPRs中,它包含两个字段,示意图如下:
Version:指出内核的版本号
Revision:指出同一个内核版本的不同修订版本。
例如对于MPC8641D开发班:
PVR的值为:0x8004 0010
4.3 PIR(Processor Identification Register)寄存器
32位的PIR寄存器是一个只读寄存器,它的值用来定位PowerPC多核芯片中的核,我们可以用mtspr指令把PIR的值拷贝到一个通用寄存器GPRs中。
PIR的字段示意图如下:
4.4 BAT寄存器
BAT和TLB属于MMU,是用来进行逻辑地址(有时候被称为虚拟地址)和物理地址之间的地址转换,处理的是地址映射关系,PowerPC构架,共提供三种地址转换地模式:
第一种:页地址转换,通过TLB实现;
第二种:BAT(块地址转换),将逻辑地址映射到一连续的物理地址;
第三种:实地址转换,禁止地址转换(MSR[IR] =0,MSR[DR]=0),逻辑地址与物理地址相等,直接将逻辑地址送往地址总线, 如果物理内存较小,高位的逻辑地址可能被忽略。
BAT机制可以将一连续的大于一页地址的逻辑地址映射到物理内存中。如果有效地址与相应的BAT寄存器匹配,将使用BAT寄存器中的信息来转换有效地址为物理地址。BAT是一种简单有效的映射机制,映射关系比较简单,转换效率上比页转换快,但功能不如页转换强大,最大的缺点就是不能提供虚拟映射机制。但是如果BAT和页转换相互结合能组成一更为强大高效的转换机制。
特别需要注意的是在做地址映射的时候,TLB匹配和BAT匹配会并行进行。但如果BAT命中,那么会用BAT中的映射关系去转换地址,TLB会被忽略;如果BAT未命中,那么会尝试用TLB机制去映射地址。
注意:缓存是CPU和内存空间之间的中继设施,和MMU不一样,它处理的是数据,包括CPU读取的数据和指令。
关于BAT寄存器实现地址转换的机制,PowerPC构架实现的非常精致,我会在PowerPC的MMU部分详细的讲述,这里主要介绍寄存器,就不在讲述MMU啦,O(∩_∩)O~。
4.5 SDR1寄存器
为了说清楚SDR1寄存器的在作用,我在这里不得不详述一下PowerPC的页面地址转换的机制,O(∩_∩)O~
PowerPC的MMU从访存指令中获取的32位有效地址EA(Effective Address)分成三个部分:
第一部分 EA[0:3]:存放的是SR寄存器的索引(范围在0到15),用于选择SR寄存器。目的是从SR寄存器读取24位的虚拟段号(VSID-virtual segment ID);
第二部分 EA[4:19]:存放的是页表索引,用于在页表(Page Table)中定位页表项PTE(Page Table Entry)。EA[4:19]和从SR寄存器中读取的24位VSID,拼接52位虚拟地址(Virtual Address)的前40位,这40位我们称之为虚拟页号(VPN-Virtual Page Number)
第三部分 EA[20:31]:页内偏移地址,它和VPN构成52位虚拟地址。
这样我们就可以得到52位的虚拟地址,然后有虚拟地址的VPN位,我们在TBL或者页表中找到20位的物理页号(RPN-Physical page number),它和EA[20:31]构成32位的物理地址。
示意图如下:
备注:从图中我们可以看出有效地址到物理地址,PowerPC构架需要先把有效地址(EA)转化虚拟地址(VA),然后从VA中获得VPN之后,就会在TLB或者页表(Page Table)中检索页表项PTE(Page Table Entry)。然后从PTE中获取RPN,然后从Byte Offset拼接成物理地址(RPA-Physical Address )。
这一过程PowerPC构架实现的非常精致,虽然也是MMU部分的内容,我实在是忍不住想在这里把它描述清楚。
这一过程主要分成三个步骤:
4.5.1 第一个步骤:由32位的有效地址EA转换成52位的虚拟地址VA
这一步骤如上图所示,非常的清晰,这里就不在赘述了。
这一过程主要分成两个步骤:
4.5.1 第一个步骤:由32位的有效地址EA转换成52位的虚拟地址VA
这一步骤如上图所示,非常的清晰,这里就不在赘述了。
4.5.2 第二个步骤:由52位的虚拟地址VA转化成32位的物理地址
这一步骤比较复杂,听我慢慢道来。
这一步骤里面也分为三个小步:
第一个小步:先由52位的虚拟地址(VA)找到页表项组(PTEGs)的地址;
第二个小步:再从页表项组(PTEGs)中逐个查找,从而找到页表项(PTE)的地址;
第三个小步:最后从PTE中取出RPN和和字节偏移地址(Byte Offset)连接,构成32位的物理地址。
具体过程如下:
4.5.2.1由52位的虚拟地址VA找到页表项组(PTEGs)的地址
解释一下,PowerPC构架中的页表由页表项组(PTEGs)构成的,而每个PTEGs又是有PTE构成的,每个PTE有8个字节。
MMU为了找到目标页表项PTE,它使用两个hash函数(我们称之为主hash函数和次函数函数),我们首先用主hash函数找到一个PTEGs,在PTEGs中逐个需找目标PTE,如果里面不存在目标PTE,我们在用次hash函数再找一组PTEGs,再在其中需找目标PTE,如果还不在的话,此时就会发生缺页中断,交由操作系统来处理了。
备注:
为了描述清楚问题,我们来解释一下主hash函数和次hash函数。
主hash函数:
输入参数:
虚拟地址VA[5:23]
有效地址EA[4:19](即Page Index,也是VA[24:39])
处理:将这两个地址继续或操作,由于两个位段长度不同,我们第二个位段的高位补3个0,这样都形成了19位的长度,便于进行OR操作。
输出:上述两个位段的或操作的结果
次hash函数:
出入参数:
上述主hash函数的输出结果
输出:
上述主hash函数输出结果的反码
两个hash函数处理过程如下:
解释完两个函数之后,我们继续上面的话题:由52位的虚拟地址(VA)找到页表项组(PTEGs)的地址的机制。
由52的虚拟地址提供两个字段VA[5:23]和VA[4:19](即也是有效地址EA[4:19])提供给主hash函数,主hash函数经过运算之后给我们提供了19位计算结果。
我们怎么来使用这个hash函数呢?这就牵涉到我们这一节将的主题SDR1寄存器(实在抱歉,现在才说到本节的主题哈,O(∩_∩)O~)
32位的SDR1寄存器的格式如下所示:
SDR1[0:15]位:称为HTABORG位,它保存的是32位页表(Page Table)物理地址的高16位;
SDR1[23:31]位:称为HTABMASK位,页表地址的掩码;
需要注意的是SDR[0:15]的16位数值是内存中页表数目的上限,也可以理解为页表的基址一部分,这一部分到底有多少位,是由HTABMASK决定的。
为了更详细的说明这种机制,我们举一个例子来说明:
比如说页表基址为0xA600 0000,即二进制:0b1010 0110 0000 0000 0000 0000 0000 0000
而SDR1寄存器的值为0b1010 0110 0000 0000 0000 0000 0000 0011,
其中SDR1[0:15](即HTABORG):1010 0110 0000 0000
SDR1[23:31](HTABMASK):0 0000 0011
因为HTABMASK的后两位是连续的两个1,所以HTABORG中的后两位将参与计算PTEGs在页表中的偏移地址,HTABORG中的高14位1010 0110 0000 00将作为页表的基址的高地址部分,剩下的32-14位补0就是页表的基地址。
备注:至于为什么HTABMASK的后端有多少个连续的1,HTABORG的后端就是相同数目个连续的0,我们在后面的运算中可以清晰的看出来(其实就是不让这些数据位有效,来使得hash函数的相同数目的位参与计算PTEGs在页表中的偏移地址)
由于通过主hash函数计算出来的PTEGs可能不一定含有目标PTE,所以我们又根据次hash函数函数计算一个PTEGs地址,如果两个PTEGs都没有目标PTE,就是让操作系统产生缺页中断。
示意图如下:
为了更清楚的说明hash函数计算页表(Page Table)内PTEGs地址的过程,我们再看下面的例子:
在上面的4.5.2.1中,我们找到了页表项组(PTEGs)的地址,现在我们只要从从页表项组(PTEGs)中逐个查找,我们的目标PTE地址。
我们需要先从通过主hash计算出来的PTEGs组中逐个查找目标PTE,如果不存在的话,我们再在通过次hash表计算出来的PTEGs组中逐个查找,如果还找不到的话,就让OS产生缺页中断把包含目标PTEGs的页表调入主存,我们再次重复上述过程。
4.5.2.3 得到物理地址
我们从在2.5.2.2中获取到的PTE中取出RPN和和字节偏移地址(Byte Offset)连接,构成32位的物理地址。
这个示意图如下:
转自:http://blog.sina.com.cn/s/blog_70dd16910100yjog.html
32位PowerPC构架通用寄存器分析及总结二相关推荐
- 32位PowerPC构架通用寄存器分析及总结一
第一部分 32位 PowerPC构架下寄存器概述 32 位PowerPC构架寄存器模型可以分成三个类级别:UISA,VEA,OEA,我们根据这三个级别把PowerPC所使用的所有寄存器分为三类: 第一 ...
- 32位PowerPC构架通用寄存器分析及总结三
4.6SR(Segment Registers)寄存器 OEA定义了16个32位的SR寄存器,段寄存器SR可以使用mtsr/mfsr,mtsrin/mfsrin指令进程访问. 随着CR[0]位(我们称 ...
- 【软件周刊第 24 期】Ubuntu 17.04 正式发布,不再支持 32 位 PowerPC(PPC)架构
2019独角兽企业重金招聘Python工程师标准>>> PostgreSQL 10 新增特性 PostgreSQL 10 新增了多项新特性,这里梳理几项主要内容: 声明式分区 在以前 ...
- 32位PowerPC常用指令集总结
第一部分 PowerPC 精简指令集计算机(RISC)简介 PowerPC 体系结构是一种精减指令集计算机(Reduced Instruction Set Computer,RISC)体系结构,定义了 ...
- PowerPC VxWorks BSP分析(1)--PowerPC体系结构
POWER 是 Power Optimization With Enhanced RISC 的缩写,是 IBM 的很多服务器.工作站和超级计算机的主要处理器.POWER 芯片起源于 801 CPU,是 ...
- 32位系统处理64位数据
64位返回值 x86平台 ARM平台 参数传递及加减运算 x86平台 ARM平台 右移 x86平台 ARM平台 32位数据转换为64位数据 x86平台 ARM平台 32位系统的通用寄存器GPR只能容纳 ...
- 64位程序调用32位dll
转自:https://blog.csdn.net/yanmanm/article/details/81870436 https://blog.csdn.net/nie2314550441/articl ...
- pyinstaller64位windows电脑打包32位exe 5500字超详细教程
目录 壹.方法简介 贰.安装32位python 一.下载安装包 二.安装python 叁.安装第三方库 一.检查安装 二.安装第三方库与pyinstaller 三.pyinstall 肆.打包exe文 ...
- 键盘与显示实验程序c语言,16位微机原理,32位微机原理接口教学实验系统,64位微机原理接口实训...
TW-X38 16.32位微机原理与接口教学实验系统 一.硬件概述 TW-X38现代32位微机原理与接口技术教学实验系统的升级换代产品,采用Intel i386EX嵌入式微处理器作为系统核心,全面支持 ...
最新文章
- 原型模式(Prototype)
- python 深浅拷贝案例_python-浅拷贝、深拷贝实例以及讲解
- ListView在列表中新增一行的操作(增加、取消)
- 自定义listView添加滑动删除功能
- 工作三年左右的Java程序员跟大家谈谈从业心得
- c++-内存管理-array allocator
- 【渝粤教育】电大中专建筑材料 (3)作业 题库
- python 绘图 hist bin参数_Python-hist,distplot bin宽度不一致问题的解决方案
- 展望 | 2020年人工智能八大趋势
- python3 全局变量 局部变量_Python3获取变量名并修改函数内部的外部变量和局部变量,python3,在,local...
- poj 2192 Zipper
- 商业创业计划书的21条重要事项
- 中国34个省市用字体logo 石昌鸿 字体设计-借用手法
- 摄氏度和开氏度的换算_k与摄氏度的换算(摄氏度与开氏度换算)
- 做过启动盘的U盘怎么复原?三种方法教你
- SVN文件夹对号图标(更新、冲突等)不显示
- 全屏滚动插件之 fullpage.js
- mysql Error 1412: Table definition has changed, please retry transaction
- LeetCode 题解随笔:贪心算法
- 计算机论文致谢词范文500字,论文致谢词范文500字(精选6篇)
热门文章
- eclipse building workspace太慢或者 js出错问题解决
- 一招长期引流并锁定客户的活动,饺子馆靠“比赛”做到月入10万
- html 对话框 flatballoon,福建省厦门市2020届高三毕业班第一次质量检查英语试题(含答案)...
- ios uitableviewcell 添加uibutton无法Highlighted问题
- 浏览器肉搏时代 市场细化明显
- 百度搜索URL参数解析详解与对快排的作用!
- 社区发现算法——LFM算法
- windows php 多线程
- 淘宝钻石展位怎么做?大神导航,一个神奇的网站,从此开启大神之路!
- mysql sql ppt_SQL入门学习