PowerPC E600内核MMU机制分析 一

标签:
e600powerpcmmu |
分类: PowerPC平台 |
本文我将详细的讨论一下E600内核的MMU机制,为了能清晰的阐述E600的MMU机制,我将从Power ISA的32位通用MMU的机制说起。
PowerPC的MMU机制作用是把有效地址EA转换成物理地址PA,同时考虑到内存保护。
第一部分 PowerPC ISA通用MMU机制
1.1概述
PowerPC 使用load和store指令来读取指令和数据,读取的过程需要地址转换机制:段寄存器组SRs(16个SR寄存器)把32位EA转换成52位的内部虚拟地址VA,页表再把52位的VA转换成32位的物理地址PA。
TLBs(Translation Lookaside Buffers)用来保存最近使用过的页表项PTEs;
SRs寄存器用来产生内部52位的虚拟地址VA;
BATs寄存器用来存放可以访问到的块地址信息,并且BATs寄存器组被当做SPRs寄存器来访问。
MMU和中断机制为“请求换页”机制的虚拟内存提供了支持,它使得比物理内存空间更大的程序得以运行,“请求换页”意味着只有正在执行的程序访问这些页时,它们才会被装入内存。
再次强调:PowerPC的MMU所包含的虚拟地址是指52位的虚拟地址,它是由16个SR寄存器来维护的;在地址转换的过程中,MMU首先把32位的EA转换成52位的VA,然后再把VA转换成PA。操作系统来管理系统的物理内存资源,它首先初始化MMU寄存器组,主要包括SRs寄存器、BATs寄存器以及SDR1寄存器,并在内存中建立页表;然后MMU协助OS管理页表的状态,并选择缓存最近使用过的页表信息来提高后续的访问速度。
EA地址空间被分割成大小为 256M的段(段会被细分为4K的页)或者大小从128K到256M的BAT块;对于每个块或者页,OS建立地址描述符PTE(Page 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机制分析
http://s14/middle/70dd1691gbde0362aa7fd&690E600内核MMU机制分析
从图中我们可以看出有效地址EA高12位(EA[20:31])直接作为PA的高12位,因为它们是作为页内偏移地址使用的,不需要转换。
从图中我们可以看出PowerPC支持三种地址转换格式:
第一:页地址转换,通过SRs、TLBs或者页表把EA转换成PA;
第二:块地址映射,通过BATs寄存器组把EA转换成PA;
第三:实模式地址转换,关闭地址转换机制,EA就是PA;
地址转换的流程图
http://s12/middle/70dd1691gbde03a69c0eb&690E600内核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机制分析
页表地址转换的流程图如下
http://s1/middle/70dd1691gbde046e833a0&690E600内核MMU机制分析
MMU所使用到的寄存器如下
http://s1/middle/70dd1691gbde04cea7dc0&690E600内核MMU机制分析
上图中各个寄存器的解如下:
http://s14/middle/70dd1691gbde05556cc9d&690E600内核MMU机制分析
2.2 地址映射地址详细说明
2.2.1 实模式
该模式比较简单,EA就是PA,这里就不再详述。
2.2.2 块地址映射
BAT地址映射,我将结合Linux-2.6.38-smp在MPC8641HPCN上的初始化过程中的initial_bat函数来叙述。
initial_bats指令序列如下:
initial_bats:
4:
#ifdef CONFIG_SMP
#else
#endif // CONFIG_SMP
解释:
<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机制分析
BATxL[0:14]:BRPN字段会和BATxU寄存器的BEPI(Block effective page index)字段连接起来产生块物理地址的高bit位。
BATxL[25:28]:WIMG字段
BATxL[30:31]:PP字段,段保护位,值的含义如下:
http://s1/middle/70dd1691gbde0613c57e0&690E600内核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机制分析
BATxU[0:14]:BEPI(Block 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=0至3)的功能,我们以32位的通用PowerPC构架来详细的分析一下BAT寄存器的原理。
在通用32位构架中:
指令BAT有4组:IBATxL/IBATxU(x=0至3);
数据BAT有4组:DBATxL/DBATxU(x=0至3);
其中BATxL决定着所维护的BATx块的起始有效地址;BATxU决定着BATx块的起始虚拟地址。
BL字段的掩码值和BAT维护的内存块的长度的关系如下:
http://s7/middle/70dd1691gbde071864c16&690E600内核MMU机制分析
BARxU[30]:系统模式位,该位会和MSR[PR]位比较来确定是否EA是否符合特权级要求
BARxU[31]:用户模式位,该位会和MSR[PR]位比较来确定是否EA是否符合特权级要求
BATxL格式
http://s3/middle/70dd1691gbde07925d3a2&690E600内核MMU机制分析
解释:
BATxL[0:14]:BRPN字段会和BATxU寄存器的BEPI(Block effective page index)字段连接起来产生块物理地址的高bit位。
BATxL[25:28]:WIMG字段
BATxL[30:31]:PP字段,段保护位,值的含义如下:
http://s1/middle/70dd1691gbde08c262b60&690E600内核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
对于一个待寻址的有效地址EA,PowerPC判断其在块地址空间中命中的机制:
EA在BATs数组中命中需要满足两个条件:
第一条: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机制分析
备注:
每一对BAT寄存器都定义了EA地址空间中的起始EA块的长度以及起始物理地址。如果待寻址EA在BAT寄存器组定义的有效地址空间中,那么EA的偏移地址(由BL掩码决定)加之起始的块的物理地址就是EA对应的物理地址!
比较过程如下:
图1说明了如何从EA定位到相应的块BATx
http://s1/middle/70dd1691g7963423f7940&690E600内核MMU机制分析
图2:说明了找到了规定的块之后,如何把EA转换成物理地址PA
http://s2/middle/70dd1691gbde09a03e651&690E600内核MMU机制分析
<8><9><10><11>:
解释:
用构造的r8寄存器的值:0x0000 0012 = 0b0000 0000 0000 0000 0000 0000 0001 0010
来初始化DBAT0L和IBAT0L,来确定BAT块的起始物理地址和BAT所具有的属性;
用构造的r11寄存器的值:0xc000 1ffe=0b1100 0000 0000 0000 0001 1111 1111 1110
来初始化DBAT0U和IBAT0U,来确定BAT块的起始有效地址为0xc000 0000
总结:我们的MPC8641d是基于PPC604平台,从PAGE_OFFSET(即地址0xc0000 0000)起始的256M的虚拟空间提供给Linux-2.6.38内核,并且在启动过程中没有动态内存分配来说足够用的了。
DBAT0L/DBAT0U和IBAT0L/IBAT0U的作用就是把虚拟地址0xc000 0000 至0xc000 0000+256M-1映射到物理地址0x0000 0000至0x0000 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 000,BF=0b0111 1111
所以BAT0L/BAT0U维护的BAT0块的起始有效地址为0xc000 0000 起始物理地址为0x0000 0000,BAT块的长度为256M。
所以该块实现了把虚拟地址空间:3G至3G+256M-1映射到0至0+256M-1
比如对于EA=0xc000 00ef,根据图1,因为BEPI[0:3]==EA[0:3]且BEPI[4:14]=EA[4:14]&(not BL)=0b1100 000 0000 000
所以EA在BAT0块映射的地址空间中。
再根据图2中的规则可以得到EA对应的物理地位为0x0000 00ef
待续。。。。。。。