虚拟地址转换[四] - large page/hugepage
上文提到,使用large page(在Linux中对应的概念叫hugepage)可以优化对多级页表的访问时间,那处理器硬件层面是如何实现large page的呢?
在页表的任何级别,指向下一级的指针可以为空,表示该范围内没有有效的虚拟地址。中间级别也可以有特殊条目(设置了page size flag),表明它们直接指向large page。
例如,在32位的x86系统中,支持4MB的huge page($\text{4KB} \times 2^{10}= \text{4MB}$,PD跳过PT直接指向page)。在64位的x86-64中,支持2MB($\text{4KB} \times 2^9 = \text{2MB}$,PD跳过PT直接指向page)和1GB($\text{2MB} \times 2^9 = \text{1GB}$,PDPT跳过PD和PTE直接指向page)的large page。
如果使用2MB的large page, 则其页表查找过程是这样的:
如果使用1GB的large page, 则其页表查找过程是这样的:
large page的使用可以减少页表的级数,也就减少了查找页表的内存访问次数,而且对于同样entries数目的TLB,可以扩大TLB对内存地址的覆盖范围,减小TLB miss的概率。此外,因为页表本身也要占用内存空间,减少页表的大小也可以节约那么一丢丢的内存。
在使用large page的系统中,可能存在4KB,2MB,1GB等不同大小的page共存的情况,这就需要不同的TLB支持。以intel的某款处理器为例,其含有的TLB种类如下:
当然,使用large page也会带来一些问题,比如:
- 由于各种内存操作基本都要求按照
page对齐,比如一个可执行文件映射到进程地址空间,根据文件大小的不同,平均算下来会浪费掉半个page size的物理内存,使用large page的话这个消耗就显得比较大了。 - 系统运行一段时间后,会很难再也大块的连续物理内存,这时分配
large page将会变的很困难,所以通常需要在系统初始化的时候就划分出一段物理内存给large page用(类似于DMA的内存分配),这样就减少了一些灵活性。 - 动态
large page(THP)在换出到外部的flash/disk和从flash/disk换入物理内存的过程会比normal size的page带来更大的开销(可参考这篇文章)。
This post is licensed under CC BY 4.0 by the author.



