PowerPC体系结构学习笔记之内存管理

E500MMU简介

E500采用了两级MMU机制,L1-MMU和L2-MMU,以及一些辅助寄存器和指令来实现虚实地址的转换。E500与其他PowerPC处理器相比的一个最大不同就是,E500不能禁止虚实地址转换,并且支持两个地址空间,分别是地址空间0与地址空间1。其实这点有些类似于MIPS,除了直接通过虚拟地址来区分以外,MIPS处理器也没有机制禁止/启用地址翻译。

L1-MMU包含I-L1VSP,D-L1VSP,I-L1TLB4K和D-L1TLB4K。I-L1VSP和D-L1VSP含有4个条目,采用全相连结构。I-L1TLB4K和D-L1TLB4K含有64个条目,采用4路组相连结构。L2-MMU包含TLB0和TLB1。其中TLB0含有256个条目,采用2路组相连结构。TLB1含有16个条目,采用全相连结构。TLB0用来进行页式映射,TLB1用来处理段式映射。

在E500内核中将MMU分为两级有一下两个作用:
    L1-MMU的访问速度较快。这个原理类似于Cache的原理。
    L1-MMU采用哈佛结构,也就是程序地址空间与数据地址空间分离,可以提高地址转换的效率。但是L2-MMU没有采用这种结构。

E500虚拟地址与MMU结构

最近比较忙,一直没有更新PowerPC的学习笔记,今天补上一篇。

E500是一个32位的处理器,支持4GB的地址空间。在内部使用41位的临时虚拟地址,组成如下:
40    39 32 31            0
AS     PID        EA

AS:来自于MSR寄存器的IS或DS位。所以,E500可以根据AS位将地址空间分为两种:地址空间0和地址空间1。但是,Linux并没有使用这个功能。kernel和用户空间的代码,数据都在地址空间0中,即AS位一直是0。
PID:E500支持3个8位的PI的寄存器来保存进程的PID。这点于MIPS的ASID作用一样。但是,Linux并没有使用PID,在TLB中简单的忽略PID的检查,全部设为0。
EA:32位的有效地址。

下面介绍一下E500 MMU的结构。在E500中,MMU的entry包含下列字段:
V:用来表示当前entry是否有效。为0时表示无效,为1时表示有效。在系统reset之后,所有entry的V位都设为0。
TS:就是上面地址空间中的AS。为0表示地址空间0,为1表示地址空间1。
TID[0:7]:就是上面地址空间中的PID。TID为0时,忽略PID的比较。在Linux中,全为0。
EPN[0:19]:虚拟页桢号。根据页大小不同,有效的位数页不同。
RPN[0:19]:物理页桢号。
SIZE[0:3]:表示当前entry的页大小。
PERMIS[0:5]:用于描述当前entry的访问控制位。分别是UR,SR,UW,SW,UX,SX。分别表示用户态和内核态的读/写/执行权限。
WIMGE[0:4]:W表示当前entry是write through还是write back。I表示当前entry是否忽略Cache。M表示对此数据区的访问需要进行存储一致性处理。G表示对相应存储区域进运行保护。E表示当前entry是小端还是大端。
X0,X1:描述一些额外属性。
U[0:3]:自定义用途。
IPROT:当IPROT为1时,表示当前entry被保护。不能使用tlbivax指令无效该entry。只能用tlbwe指令清除。在E500中只有TLB1支持该位,在TLB0中,该位一直为0。

与MMU有关的寄存器

E500有一系列寄存器用于管理MMU。

PID0-2寄存器:用于保存当前进程的PID,该寄存器只有54-63位有效。
MMUCSR0寄存器:用于使无效TLB0和TLB1的所有entry。该寄存器由两位组成:L2TLB0_FI使无效TLB0的所有entry;L2TLB1_FI使无效TLB1的所有entry。
MMUCFG寄存器:用来保存当前MMU的配置信息,包括PID寄存器数量,大小,TLB的数量等。
TLB0CFG和TLB1CFG寄存器:用于描述TLB0和TLB1的配置信息,包括entry数量,页表尺寸等信息。

除上述寄存器外,E500还包含一些MAS寄存器,主要作用就是维护MMU中TLB的entry,作用类似于MIPS中的EntryHi和EntryLo 寄存器。其中MAS1-3中存放的各个字段与TLB entry中的各个字段一一对应,MAS0寄存器用于决定写哪个TLB的哪个entry,作用类似于MIPS中的random和index寄存器。

MAS0寄存器:TLBSEL字段用于选择要操作的TLB,0表示TLB0,1表示TLB1。ESEL字段用于选择TLB的entry。当使用TLB1 时,ESEL字段中低4位有效,用于选择TLB1中的entry。当使用TLB0时,ESEL中只有最低位有效,因为TLB0是两路组相连。此时,E500还需要MAS2寄存器的EPN的第45-51位决定组内不同的entry。NV位用于确定如何替换TLB0中的entry。
MAS1寄存器:
32 33      40      47   51 52   55
V IPROT        TID      TS   SIZE

MAS2寄存器:
32                       51   57 58 59 60 61 62 63
            EPN               X0 X1 W   I   M   G   E

MAS3寄存器:
32                       51 54   57 58 59 60 61 62 63
            RPN              U0-U3   UX SX UW SW UR SR

MAS4寄存器:用于存放当TLB miss异常发生时,对MAS0-3寄存器自动加载而使用的默认值,也就是说MAS4寄存器的内容是硬件写入的。E500为了提高TLB miss异常的效率,在异常出现时,E500会用MAS4寄存器中的值,自动填写MAS0-2寄存器中的一部分内容:
    MAS0[TLBSEL] <- MAS4[TLBSELD]
    MAS1[TID] <- MAS4[TIDSELD]
    MAS1[TSIZE] <- MAS4[TSIZED]
    MAS2[X0,X1] <- MAS4[X0D,X1D]
    MAS2[WIMGE] <- MAS4[WD,ID,MD,GD,ED]
MAS6寄存器:用于对TLB进行检索,MAS6寄存器提供SPID0和SAS,也就是PID和AS字段。

MMU指令

tlbre指令
用于读取TLB中相应的entry。
输入是MAS0寄存器的TLBSEL和ESEL字段,MAS2寄存器的EPN字段。在读TLB1时,ESEL有效,EPN无效;在读TLB0时,ESEL无效,EPN有效。
输出是将TLB的相应entry放入MAS1,MAS2和MAS3寄存器中。

tlbwe指令
用于设置TLB中的相应entry。
输入是MAS0寄存器的TLBSEL,ESEL字段个MAS1-3寄存器。
无输出。

tlbsx指令
该指令格式为“tlbsx RA, RB”。主要功能是使用RA+RB的地址,配合MAS6寄存器对TLB进行查找,如果命中,则将结果放入MAS0-3寄存器。

tlbivax指令
该指令格式是“tlbivax RA, RB”。主要作用是使用RA+RB的地址,配合MAS6寄存器对TLB进行查找,如果命中,则无效该entry。如果entry的IPROT位设置了,则不能用tlbivax无效。注意,MIPS中并没有tlbivax类似的指令。所有TLB的无效操作都通过tlbwi或者tlbwr指令实现。

tlbsync指令
该指令用于同步对TLB entry的读写。主要用途是将tlbivax指令的更新entry广播到系统总线上,用来同步其他处理器。该指令只在SMP系统中有效。

复位时的TLB

当E500上电复位时,只有TLB1中的entry 0有效,其他entry都是无效的。
TLB1的entry 0初始值如下:
V        1        表示当前entry有效
TS       0        使用地址空间0
TID[0:7] 0x00     不与PID寄存器比较
RPN      0xFFFFF 有效地址空间0xFFFFF000-0xFFFFFFFF与物理地址空间0xFFFFF000-0xFFFFFFFF映射,大小是4KB
EPN      0xFFFFF
SIZE[0:3]0001
SX/SR/SW 111      处理器在超级模式下可以对这段地址空间读/写/执行
UX/UR/UW 000      处理器在用户模式下不可以操作这段地址空间
WIMGE    01000    对该地址空间不使用Cache,不执行存储器一致性操作,采用大端模式
X0-X1    00
U0-U3   00
IPROT    1        该entry受保护,不会被tlbivax指令无效

E500的复位地址是0xFFFFFFFC,此时系统只能访问从0xFFFFF000开始的4KB地址空间。在这段程序空间里,bootloader要完成对TLB1其他entry的初始化。

你可能感兴趣的:(linux,cache,Random,存储)