加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

PowerPC E600内核MMU机制分析 一

(2012-04-17 21:38:06)
标签:

e600

powerpc

mmu

分类: PowerPC平台

本文我将详细的讨论一下E600内核的MMU机制,为了能清晰的阐述E600MMU机制,我将从Power ISA32位通用MMU的机制说起。

PowerPCMMU机制作用是把有效地址EA转换成物理地址PA,同时考虑到内存保护。

第一部分 PowerPC ISA通用MMU机制

1.1概述

PowerPC 使用loadstore指令来读取指令和数据,读取的过程需要地址转换机制:段寄存器组SRs16SR寄存器)把32EA转换成52位的内部虚拟地址VA,页表再把52位的VA转换成32位的物理地址PA

TLBs(Translation Lookaside Buffers)用来保存最近使用过的页表项PTEs

SRs寄存器用来产生内部52位的虚拟地址VA

BATs寄存器用来存放可以访问到的块地址信息,并且BATs寄存器组被当做SPRs寄存器来访问。

MMU和中断机制为“请求换页”机制的虚拟内存提供了支持,它使得比物理内存空间更大的程序得以运行,“请求换页”意味着只有正在执行的程序访问这些页时,它们才会被装入内存。

再次强调:PowerPCMMU所包含的虚拟地址是指52位的虚拟地址,它是由16SR寄存器来维护的;在地址转换的过程中,MMU首先把32位的EA转换成52位的VA,然后再把VA转换成PA。操作系统来管理系统的物理内存资源,它首先初始化MMU寄存器组,主要包括SRs寄存器、BATs寄存器以及SDR1寄存器,并在内存中建立页表;然后MMU协助OS管理页表的状态,并选择缓存最近使用过的页表信息来提高后续的访问速度。

 

 

EA地址空间被分割成大小为 256M的段(段会被细分为4K的页)或者大小从128K256MBAT块;对于每个块或者页,OS建立地址描述符PTEPage Table Entry)或者BAT数组项来描述它们;MMU通过PTE或者BAT数组项来产生物理地址PA,以及每次地址转换时所需要的保护信息和控制信息。为了提供访问速度,MMU通常会在片上高速缓存中保持最近访问过的PTEs,在BAT寄存器组中保持块地址信息。

 

物理内存映射图分成4个部分:

第一部分:物理内存的第一个256个字节区域(如果MSR[IP]置位的话,位于物理地址0xFFF0 0000处的第一个256字节)提供给OS使用,物理内存的第一个页的其它部分被中断向量基地址定义,提供给中断向量使用,或者暂时保留为将来的中断向量使用;

第二部分和第三部分:内存映射的第二和第三个页表是跟具体的执行相关;

第四部分:OS使用第四个页开始的内存区域来存放页表,具体布局如下表:

http://s4/middle/70dd1691gbde0316b1aa3&690E600内核MMU机制分析 一" TITLE="PowerPC E600内核MMU机制分析 一" />


http://s14/middle/70dd1691gbde0362aa7fd&690E600内核MMU机制分析 一" TITLE="PowerPC E600内核MMU机制分析 一" />



从图中我们可以看出有效地址EA12(EA[20:31])直接作为PA的高12位,因为它们是作为页内偏移地址使用的,不需要转换。

从图中我们可以看出PowerPC支持三种地址转换格式:

第一:页地址转换,通过SRsTLBs或者页表把EA转换成PA

第二:块地址映射,通过BATs寄存器组把EA转换成PA

第三:实模式地址转换,关闭地址转换机制,EA就是PA

地址转换的流程图

http://s12/middle/70dd1691gbde03a69c0eb&690E600内核MMU机制分析 一" TITLE="PowerPC E600内核MMU机制分析 一" />


备注:

SRn[T]位来决定是访问内存映射区域还是访问直接存储段(direct-store segment),直接存储段是为了和老的设备相兼容,性能不是最优的,新的设备已经不再使用;目前最有效的访问方式是通过内存映射到I/0区域,统一通过内存地址来访问I/O设备。

BAT机制可以将一连续的大于一页地址的逻辑地址映射到物理内存中。如果有效地址与相应的BAT寄存器匹配,将使用BAT寄存器中的信息来转换有效地址为物理地址。BAT是一种简单有效的映射机制,映射关系比较简单,转换效率上比页转换快,但功能不如页转换强大,最大的缺点就是不能提供虚拟映射机制。因此如果BAT和页转换相互结合能组成一个为强大高效的转换机制。

特别需要注意的是在做地址映射的时候,TLB匹配和BAT匹配会并行进行。但如果BAT命中,那么会用BAT中的映射关系去转换地址,TLB会被忽略;如果BAT未命中,那么会尝试用TLB机制去映射地址。

 

MMU的地址映射流程图

http://s5/middle/70dd1691gbde03f34d274&690E600内核MMU机制分析 一" TITLE="PowerPC E600内核MMU机制分析 一" />

页表地址转换的流程图如下

 

http://s1/middle/70dd1691gbde046e833a0&690E600内核MMU机制分析 一" TITLE="PowerPC E600内核MMU机制分析 一" />



MMU所使用到的寄存器如下

 

http://s1/middle/70dd1691gbde04cea7dc0&690E600内核MMU机制分析 一" TITLE="PowerPC E600内核MMU机制分析 一" />


上图中各个寄存器的解如下:

http://s14/middle/70dd1691gbde05556cc9d&690E600内核MMU机制分析 一" TITLE="PowerPC E600内核MMU机制分析 一" />

2.2 地址映射地址详细说明

2.2.1 实模式

该模式比较简单,EA就是PA,这里就不再详述。

 

2.2.2 块地址映射

BAT地址映射,我将结合Linux-2.6.38-smp在MPC8641HPCN上的初始化过程中的initial_bat函数来叙述。

initial_bats指令序列如下:

initial_bats:

       lis    r11,PAGE_OFFSET@h         <1>

       mfspr      r9,SPRN_PVR           <2>

       rlwinm    r9,r9,16,16,31         <3>

       cmpwi    0,r9,1

       bne  4f                          <4>

4:     tophys(r8,r11)                   <5>

#ifdef CONFIG_SMP

       ori   r8,r8,0x12                 <6>

#else

       ori   r8,r8,2                  // R/W access

#endif // CONFIG_SMP

       ori   r11,r11,BL_256M<<2|0x2     <7>

       mtspr      SPRN_DBAT0L,r8        <8>

       mtspr      SPRN_DBAT0U,r11       <9>

       mtspr      SPRN_IBAT0L,r8        <10>

       mtspr      SPRN_IBAT0U,r11       <11>

       isync

       blr

解释:

<1>PAGE_OFFSET的值赋值给r11寄存器

<2><3>读取PVR寄存器,获取CPU的版本号

<4>对于MPC8641d而言,r9寄存器的值为0x8004,所以跳转到“标签4:”执行。

<5>tophys(r8,r11)的目的是把r11中存放的虚拟地址c000 0000(即3G)转换成是运行时的物理地址0x0000 0000存放到r8寄存器中

<6>目的是构造低位DBAT0L寄存器的值,DBAT0L寄存器的格式如下:


http://s10/middle/70dd1691gbde05d6265f9&690E600内核MMU机制分析 一" TITLE="PowerPC E600内核MMU机制分析 一" />

BATxL[0:14]BRPN字段会和BATxU寄存器的BEPIBlock effective page index)字段连接起来产生块物理地址的高bit位。

BATxL[25:28]WIMG字段

BATxL[30:31]PP字段,段保护位,值的含义如下:

http://s1/middle/70dd1691gbde0613c57e0&690E600内核MMU机制分析 一" TITLE="PowerPC E600内核MMU机制分析 一" />


所以:BAT的低8位为0x12意味着PP=0b10,可读写,

BATxL描述决定着对应BAT块的起始物理地址和BAT所具有的属性,在这段代码中我们只构造了BAT0L的值为:0x0000 0012 = 0b0000 0000 0000 0000 0000 0000 0001 0010

所以BRPN=0b0000 0000 0000 000

BAT0L/BAT0U维护的BAT块的起始物理地址为0x0000 0000

http://s3/middle/70dd1691gbde064963b12&690E600内核MMU机制分析 一" TITLE="PowerPC E600内核MMU机制分析 一" />



BATxU[0:14]BEPIBlock effective page index)字段,这个字段和有效地址EA的高bit位(具体是高多少比特位是由BL字段来决定的)进行比较来确定对应的BAT数组中是否命中,该字段决定着BATxL/BATxU维护的BAT块的起始有效地址。

BATxU[19:29]BL字段,是决定BAT块长度的掩码;

该值为设置为0x7FF<<|0x2,含义是设置为系统模式下的块,且块长为256M

这段汇编中,我们构造的BAT0U寄存器的值为:

0xc000 1ffe=0b1100 0000 0000 0000 0001 1111 1111 1110

所以BEPI的值为=0b1100 0000 0000 000

所以BAT0L/BAT0U维护的BAT块的起始有效地址为0xc000 0000,即3G

 

为了说明BATxL/BATxU(x=03)的功能,我们以32位的通用PowerPC构架来详细的分析一下BAT寄存器的原理。

在通用32位构架中:

指令BAT4组:IBATxL/IBATxU(x=03)

数据BAT4组:DBATxL/DBATxU(x=03)

其中BATxL决定着所维护的BATx块的起始有效地址;BATxU决定着BATx块的起始虚拟地址。

BL字段的掩码值和BAT维护的内存块的长度的关系如下:

http://s7/middle/70dd1691gbde071864c16&690E600内核MMU机制分析 一" TITLE="PowerPC E600内核MMU机制分析 一" />


BARxU[30]:系统模式位,该位会和MSR[PR]位比较来确定是否EA是否符合特权级要求

BARxU[31]:用户模式位,该位会和MSR[PR]位比较来确定是否EA是否符合特权级要求

BATxL格式

http://s3/middle/70dd1691gbde07925d3a2&690E600内核MMU机制分析 一" TITLE="PowerPC E600内核MMU机制分析 一" />


解释:

BATxL[0:14]BRPN字段会和BATxU寄存器的BEPIBlock effective page index)字段连接起来产生块物理地址的高bit位。

BATxL[25:28]WIMG字段

BATxL[30:31]PP字段,段保护位,值的含义如下:

http://s1/middle/70dd1691gbde08c262b60&690E600内核MMU机制分析 一" TITLE="PowerPC E600内核MMU机制分析 一" />


所以:BAT的低8位为0x12意味着PP=0b10,可读写,

BATxL描述决定着对应BAT块的起始物理地址和BAT所具有的属性,在这段代码中我们只构造了BAT0L的值为:0x0000 0012 = 0b0000 0000 0000 0000 0000 0000 0001 0010

所以BRPN=0b0000 0000 0000 000

BAT0L/BAT0U维护的BAT块的起始物理地址为0x0000 0000

 

对于一个待寻址的有效地址EAPowerPC判断其在块地址空间中命中的机制:

EABATs数组中命中需要满足两个条件:

第一条:BEPI[0:3]= =EA[0:3]成立 BEPI[4:14]= = EA[4:14]&(not BL)

备注:从这我们可以看出,为啥BL全为0时,BAT数组的长度是128K,因为EA中的11位全部是当做块内有效页的索引位,页内偏移地址用去17位。所有页的大小为128K

 

第二条:检查BAT数组中的特权位。

即如果MSR[PR]=0,对应的是系统模式下,我们要核实BARxU[30]是否置位;

如果MSR[PR]=1,对应的是用户模式下,我们要核实BARxU[31]是否置位

同时为了提高寻找有效地址EA的效率,PowerPC构架采用全相连的方式,即EA[0:14],MSR[PR]位同时和xBATy进行比较,示意图如下:

http://s4/middle/70dd1691g796341ae7ce3&690E600内核MMU机制分析 一" TITLE="PowerPC E600内核MMU机制分析 一" />



备注:

每一对BAT寄存器都定义了EA地址空间中的起始EA块的长度以及起始物理地址。如果待寻址EABAT寄存器组定义的有效地址空间中,那么EA的偏移地址(由BL掩码决定)加之起始的块的物理地址就是EA对应的物理地址!

比较过程如下:

1说明了如何从EA定位到相应的块BATx

http://s1/middle/70dd1691g7963423f7940&690E600内核MMU机制分析 一" TITLE="PowerPC E600内核MMU机制分析 一" />

 

2:说明了找到了规定的块之后,如何把EA转换成物理地址PA


 

 


http://s2/middle/70dd1691gbde09a03e651&690E600内核MMU机制分析 一" TITLE="PowerPC E600内核MMU机制分析 一" />




<8><9><10><11>:

 mtspr      SPRN_DBAT0L,r8        <8>

     mtspr      SPRN_DBAT0U,r11       <9>

     mtspr      SPRN_IBAT0L,r8          <10>

     mtspr      SPRN_IBAT0U,r11        <11>

解释:

用构造的r8寄存器的值:0x0000 0012 = 0b0000 0000 0000 0000 0000 0000 0001 0010

来初始化DBAT0LIBAT0L,来确定BAT块的起始物理地址和BAT所具有的属性;

用构造的r11寄存器的值:0xc000 1ffe=0b1100 0000 0000 0000 0001 1111 1111 1110

来初始化DBAT0UIBAT0U,来确定BAT块的起始有效地址为0xc000 0000

 

总结:我们的MPC8641d是基于PPC604平台,从PAGE_OFFSET(即地址0xc0000 0000)起始的256M的虚拟空间提供给Linux-2.6.38内核,并且在启动过程中没有动态内存分配来说足够用的了。

DBAT0L/DBAT0UIBAT0L/IBAT0U的作用就是把虚拟地址0xc000 0000 0xc000 0000+256M-1映射到物理地址0x0000 00000x0000 0000+256M-1处。这样的话,在后面当我们打开MMU机制时,就可以用MMU中的BAT块地址映射机制把虚拟地址映射成物理地址,我们就可以不再调用reloc_offset()函数来显示的计算EA对应的PA了。

 

我们列举一个例子来说明转换的机制(不考虑权限检测问题):

BAT0L的值为:0x0000 0012 = 0b0000 0000 0000 0000 0000 0000 0001 0010

其中BRPN=0b0000 0000 0000 000

BAT0U值为:0xc000 1ffe=0b1100 0000 0000 0000 0001 1111 1111 1110

所以BEPI的值为:0b1100 0000 0000 000BF=0b0111 1111

所以BAT0L/BAT0U维护的BAT0块的起始有效地址为0xc000 0000 起始物理地址为0x0000 0000BAT块的长度为256M

所以该块实现了把虚拟地址空间:3G3G+256M-1映射到00+256M-1

 

比如对于EA=0xc000 00ef,根据图1,因为BEPI[0:3]==EA[0:3]BEPI[4:14]=EA[4:14]&(not BL)=0b1100 000 0000 000

所以EABAT0块映射的地址空间中。

再根据图2中的规则可以得到EA对应的物理地位为0x0000 00ef

 

待续。。。。。。。




0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有