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寄存器集的示意图如下:

32位PowerPC构架通用寄存器分析及总结 <wbr>二
 

4.1 MSR寄存器

MSR寄存器定义了处理器的状态,在初始化PowerPC 核心时,MSR是第一个被配置的处理器。当一个中断发生时MSR寄存器的相关位将会发生改变。它也可以被mtmsr, sc, rfi指令所修改,被mfmsr读取。

格式如下: 

32位PowerPC构架通用寄存器分析及总结 <wbr>二


各个字段说明:

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中,它包含两个字段,示意图如下:

32位PowerPC构架通用寄存器分析及总结 <wbr>二

Version:指出内核的版本号

Revision:指出同一个内核版本的不同修订版本。

例如对于MPC8641D开发班:

PVR的值为:0x8004 0010

4.3 PIR(Processor Identification Register)寄存器

32位的PIR寄存器是一个只读寄存器,它的值用来定位PowerPC多核芯片中的核,我们可以用mtspr指令把PIR的值拷贝到一个通用寄存器GPRs中。

PIR的字段示意图如下:

32位PowerPC构架通用寄存器分析及总结 <wbr>二


 

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位有效地址EAEffective 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位的物理地址。

示意图如下:

32位PowerPC构架通用寄存器分析及总结 <wbr>二


 

备注:从图中我们可以看出有效地址到物理地址,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函数处理过程如下:

32位PowerPC构架通用寄存器分析及总结 <wbr>二

 

解释完两个函数之后,我们继续上面的话题:由52位的虚拟地址(VA)找到页表项组(PTEGs)的地址的机制。

 

由52的虚拟地址提供两个字段VA[5:23]VA[4:19](即也是有效地址EA[4:19])提供给主hash函数,主hash函数经过运算之后给我们提供了19位计算结果。

我们怎么来使用这个hash函数呢?这就牵涉到我们这一节将的主题SDR1寄存器(实在抱歉,现在才说到本节的主题哈,O(∩_∩)O~)

32位的SDR1寄存器的格式如下所示:

32位PowerPC构架通用寄存器分析及总结 <wbr>二

 

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,就是让操作系统产生缺页中断。

示意图如下:

32位PowerPC构架通用寄存器分析及总结 <wbr>二

 

为了更清楚的说明hash函数计算页表(Page Table)内PTEGs地址的过程,我们再看下面的例子:

32位PowerPC构架通用寄存器分析及总结 <wbr>二



在上面的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位的物理地址。

这个示意图如下:

32位PowerPC构架通用寄存器分析及总结 <wbr>二

转自:http://blog.sina.com.cn/s/blog_70dd16910100yjog.html

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值