4.3.7 哈希页表
页表保存的是虚拟页号和物理页号之间的映射关系,其实也就是一个函数关系,将24位的VSID和16位的页索引作为参数,通过某种函数关系映射,结果就是实际的物理内存中,由于这种映射关系一般通过哈希函数实现,因此页表也称作哈希表。页索引为16位,而页大小4k,由此也可见段的大小为256M(2^28)。
页表的设计必须注意2个问题:
1. 页表大小设计;
2. 页表地址转换速度。
页表大小与逻辑地址位宽和实际的物理内存大小有关系。而页表转换速度可以通过使用快表TLB等来提高速度。
如果TLB没有命中,处理器必须在OS建立的页表搜索PTE,哈希函数就是根据虚拟地址位来访问页表。因此PTE必须均匀的分布在页表中,来提高页表的命中率。这儿有个比较费解的问题,地址转换,需要使用页表,而页表地址本身就不能再次转换,否则就是个鸡与蛋的问题了,因此地址转换,访问页表时,最好应在实地址模式下。
哈希页表(Hash Page Table)为可变大小数据结构,定义了虚拟页号与物理页号的映射关系。页大小为2的N次方,起始地址也应能为页大小的整数倍,哈希表存储位置内存WIMG属性必须为0b0010,也就是缓存和内存一致。
页表中由PTE组(Page Table Entry Group)组成。一个PTEG包含8个PTE,而每个PTE为8字节,因此一个PTEG共64字节。PTEG地址也就是表搜索操作的入口点,哈希函数的最终功能就是根据虚拟页号,生成PTEG地址,在主辅PTEG中找到对应的PTE。
给定一个PTE,可能存在于2个可能的PTEG中,一个是主PTEG,而另外一个是辅PTEG,而且可能存在于PTEG中的任何一个PTE内,因此一个PTE储存在页表中的16个可能的地址。表搜索操作开始时,对虚拟地址执行主哈希函数,结构和SDR1寄存器中的位一起创建主PTEG的物理地址。然后对命中PTEG的每个PTE进行检查,查看是否匹配,如果都不匹配,则执行第二个哈希函数,生成新的PTEG物理地址,重新匹配PTE。如果主PTEG和辅PTEG中都找不到该PTE,则产生缺页故障(page fault)。
SDR1寄存器:SDR1包含了页表结构的控制信息,包括页表物理地址的高位,以及页表大小。
HTABORG:页表物理基地址
页表大小为2^n字节,16 <= n <= 25,也就是 64K < size < 32M,因此页表索引必须为10 <= index <= 19,因此HTABMASK为9位,刚好对应于页大小对应,末尾的几个1bit加上10与哈希函数结果相与,HTABMASK低位1bit数目正好与HTABORG低位的0bit数相等。
比如1M页表大小,2^14 * 64则:
HTABORG = 0bxxxx xxxx xxxx 0000
HTABMASK = 0b0 0000 1111
页大小影响页表命中率,也就影响系统性能。32位系统,页表大小范围见SDR1寄存器定义。推荐页表大小,包含的PTEG数目至少应超过映射的物理页数目一半大小,比如256M(2^28)内存,包含2^16个4K的页,因此页表包含的PTEG也至少需要一半即2^15,因此页表大小至少为2^15 * 64 = 2M。
5 编程实例
6 参考资料
《G2 PowerPC Core Referenc Manual》
《Programming Environments Manual For 32-Bit Implementations of the PowerPC Architecture》
PowerPC Memory Management Unit