Hugepages的前世今生 (三)

众所周知,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。

PAE paging

paging & pae

注:

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 sizepaging modeCR0.PGIA32_EFER.LMECR4.PAECR4.PSE
4MPSE1001
4kPAE1010
2MPAE+PSE1011
2MIA-32e1111
4knormal 32/641000
显示第 1 至 5 项结果,共 5 项

当前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的大小。

 

ArchitecturePage SizeHuge Page SizeLarge Page Size
i3864 KB4M (2M in PAE mode)1 GB
IA-644 KB4K, 8K, 64K, 256K, 1M, 4M, 16M, 256M-
ppc644 KB-16M
sparc8 KB-8K, 64K, 4M, 256M, 2G

 

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值