PowerPC Linux 内存管理优化设想

1、总体概述

    我们都知道在PowerPC处理器e500系列内核MMU单元分为两级结构,L1L2L1 包括I-L1VSPI-L1TLB4KD-L1VSPD-L1TLB4K(前缀I指示指令,D指示数据。后缀VSP指示可以变大小页,TLB4K指示固定大小页,4Kbyte大小)。即在L1中指令和数据的页转换模块是独立的。L2中包括TLB1TLB0,其中TLB1为可变大小的页,TLB0为固定大小的页(4Kbyte)。指令和数据共用L2MMU模块。L1的页转换模块是L2页转换模块的cache。具体说L1 I-L1VSPD-L1VSP L2TLB1cacheL1I-L1TLB4KD-L1TLB4KL2 TLB0cache。如下图所示


 

L2TLB1TLB0是用户可操作的,而L1模块是由硬件维护的,对用户透明。

2Linux基于e500V1 内存管理

    在PowerPC e500 V1 MMU中有16L2 TLB1 条目,页大小可以设置为4K16K64K256K… … 256M。有256TLB0 条目,每个固定4K大小。

L2 TLB1TLB0是实现相同功能,在虚实地址转换时只要在其中之一找到对应的映射关系即可。它们之间的区别仅在于一次映射的区域大小的不同。Linux PowerPC 使用TLB1 进行虚拟地址的段式映射,采用段式映射可以直接使用硬件提供的TLB1查找表,可以一次映射较大区域(可达256MB),从而减少缺页故障次数,其虚实地址转换效率高。

但在e500V1 TLB1中的条目有限,仅16个,Linux PowerPC不可能使用TLB1完成所有的虚实转换。Linux PowerPC 使用的内核空间的虚实地址转换是由段式映射完成的,即32位系统中4G空间的高端1G0xc000-0000—0xffff-ffff

32位系统中4G空间的低3G0x000-0000—0xbfff-ffff)空间是采用页式映射。TLB0中一共有256entry,每个4Kbyte,只能映射1Mbyte的空间。即使已经给某进程的虚拟空间分配了实际的物理页面,也会经常产生TLB miss 异常。尤其是操作系统中进程调度频繁,每次调度进程都要无效掉整个TLB0,产生很多的TLB miss。这样应该会比较影响系统的性能。

3e500mc MMU介绍

Freescale 的多核处理,如P4080采用的内核是e500mc的内核,其MMU的架构和e500V1相同。在e500mc MMUTLB1的条目增加到了64个,单个条目最大支持到4GBTLB0条目增加到512个,同一时刻可以映射2MB空间。如图1所示。

4、基于e500mc MMU Linux 内存管理优化设想

 

    在e500mc内核中,TLB1的条目增加到了64个。是否可以把其中的8个或4个划分给用户空间使用,在进程创建或要被调度运行时,把分配给进程的代码空间、数据空间等物理地址连续的较大空间的映射关系填充到TLB1entity中。当然,能使用段式映射的需要满足物理空间连续,且地址边界段对齐,如要映射1MB的空间,其虚拟地址和物理地址至少都要1MB边界对齐。

如果进程的虚拟地址2M边界对齐,而实际分配的物理地址空间是1MB地址对齐,此时只能使用1MB映射区域,当然可以使用多个1MB的映射区。以此类推。

这种设想方式可能导致一个进程的代码段会同时使用段式映射和页式映射。大段的地址边界整齐(虚拟地址和物理地址都要边界对齐)的部分采用段式映射,其他区域采用页式映射。

如果内核中创建进程部分内核代码模块能考虑到这种优化的话,在给进程分配大段的虚拟空间和物理空间时尽量做到一定的边界对齐的话。这种内存管理优化的方式应该能提高不少的性能。

这可能需要对内核代码有不少的改动。请各位高手评价一下这种设想的方式是否可行?

 

参考文档:

1Linux PowerPC 详解核心篇  作者王齐  机械工业出版社

2e500mc_RM_RevF.pdf  freescale manual

3linux内核之内存管理.doc

posted @ 2012-07-26 10:51  软件小书童  阅读(378)  评论(0)    收藏  举报