您的位置:首页 > 其它

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

2012-04-30 22:17 330 查看
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的初始化。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: