Hugepages的前世今生 (三)

原文链接: http://www.dbaleet.org/the_cirle_of_hugepages_part_3

 

众所周知,x86是32位的,所以默认情况下,其可寻址的空间为2的32次方——4G。在X86设计之初,4G内存似乎是一个遥不可及的天文数字,但是摩尔定律打破了这一切,所以软硬件的设计和开发商必须想出一个对策来解决4G以上不可寻址的问题。

注意:这里没有说4G以上的内存不可寻址,而是说4G以上的地址空间不可寻址,这两者实际上有区别的。例如4G内存的CPU在32bit的Windows(非server版本)能识别到的内存一般在3G左右。 这其中的主要是主板或者操作系统的限制。因为计算机上一些其他的设备同样需要可寻址,而这一部分地址需要从总的可寻址空间中预留,例如BIOS芯片的ROM,显卡上的显存(RAM)和BIOS(ROM),以及PCI、PCI-E设备上的RAM和ROM都需要占用一定的可寻址的空间。这个叫MMIO(Memory-mapped I/O)。这里有点off the topic了,所以不再赘述,要了解更详细的原因和机制,请参考以下链接:(RAM limit    PCI hole,   Conventional memory,   3GB barrier )

CPU的设计者碰到了难题了:既要解决4G以上可寻址,又要兼容已有的架构和程序,那该怎么办呢?一种最可行的方式就是通过增加扩展地址来解决4G以上的寻址问题。于是Intel引入一个workaround PAE (Physical Address Extensions)机制:增加20位扩展地址,将原来的32位的物理地址扩展为52位,那么可寻址的空间就增加到了2的52次方——4PB,但是实际上x86只使用了其中的36位,也就是X86实际可寻址的物理地址为64G,而转化的过程为操作系统通过使用页表将4GB的地址空间映射到大小为64GB的物理地址空间。尽管物理地址为52位,但是线性地址还是32位,所以在这种架构下单个程序/进程使用的内存限制实际上仍然还是4G。

 

 

注:

PSE(Page Size Extension) 使得用户可以使用4M的页表。

PAE (Physical Address Extension)使得32位的系统就能够使用接近64GB的内存的一种技术。

如果PAE和PSE同时使用,则只能使用2M的页表。

x86_64默认使用PAE的扩展—— long mode

通过上面两个图可知:

是否使用分页是通过CR0寄存器的PG表示来控制的,如果只使用传统的分段模式,则将CR0.PG置为0, 如果启用分页则需要将PG设置为1。使用page的大小则是由IA32_EFER寄存器LME标志以及CR4寄存器的PAE标志和PSE标志控制的, 其中IA32_EFER.LME标志控制是否是否启用IA-32e模式,而CR4.PAE标志为控制是否启用PAE, CR4.PSE标志控制是否启用PSE。但是并不是这三者的任意组合都是存在的,现实中存在的情况为以下几种:

page size paging mode CR0.PG IA32_EFER.LME CR4.PAE CR4.PSE
4M PSE 1 0 0 1
4k PAE 1 0 1 0
2M PAE+PSE 1 0 1 1
2M IA-32e 1 1 1 1
4k normal 32/64 1 0 0 0

当前x86/x86_64架构支持的page的大小包括: 4k, 2M, 4M, 1G (操作系统到目前还不支持1G的page table)

以下以x86_64的Linux为例,说明page的大小是如何得到的:

在内核源代码include/asm-x86_64/pgtable.h文件中,可以找到如下宏定义:

#define PMD_SHIFT 21

...

#define PMD_SIZE (1UL <<PMD_SHIFT)

可知使用long mode的page的大小为:

1 << 21 = 2097152

这个移位运算的结果,可询问wolframalpha大神: http://www.wolframalpha.com/input/?i=1%3C%3C21

需要注意的是page table的大小用户无法自定义,在Linux中即使修改这个宏定义,重新编译内核,也无法修改page的大小。

 

Architecture Page Size Huge Page Size Large Page Size
i386 4 KB 4M (2M in PAE mode) 1 GB
IA-64 4 KB 4K, 8K, 64K, 256K, 1M, 4M, 16M, 256M
ppc64 4 KB 16M
sparc 8 KB 8K, 64K, 4M, 256M, 2G

 

 

Comment

*

沪ICP备14014813号

沪公网安备 31010802001379号