是否可以更改虚拟内存页面大小?

时间:2012-04-19 20:12:02

标签: c linux x86-64

是否可以更改虚拟内存页面大小?我问这个是因为在X86_64 part of the MMU article on wikipedia中,它讨论了不同的页面大小。如果确实可以更改页面大小,它是如何更改的?

5 个答案:

答案 0 :(得分:4)

在x86_64上,您可以在hugetlbfs的帮助下显式请求2个MiB页面而不是通常的4个KiB页面。在具有透明大页面支持的现代内核上,一个小页面可以自动连接到后台的大页面,因为内存碎片不是很大,而且有足够的内存仍然是免费的。

答案 1 :(得分:3)

据我所知,没有操作系统允许应用程序请求页面大小。 x86_64分页系统提供了混合不同大小的页面的功能,但这通常仅在一次分配大量内存时使用。

在x86_64(和x86)上,虚拟地址通过一系列页表映射到物理地址。每个表为物理虚拟地址提供一定数量的位。 x86_64当前每个映射最多可以使用4个表,每个表提供9个虚拟地址位,低12位指定页面内的偏移量。前3个表分别指向下一个表的物理地址,最后一个指向实际页面的物理地址。

| PML4T entry |-+
                V
  +-| PDPT entry |
  V
 | PDT entry |-+
               V
     | PT entry |-> Physical address (4kB page)

但是,第二个和第三个表条目也包含一个位,如果设置则表示没有其他表,并且该条目提供物理地址。发生这种情况时,其他表提供的位将移动到物理页偏移量,将每个表的页面大小乘以512。

| PML4T entry |-+
                V
  +-| PDPT entry |
  V
 | PDT entry (PS=1) | -> Physical address (2MB page)

通过更改用于映射到给定虚拟地址的表的数量,操作系统可以创建4kB(4个表),2MB(3个表)或1GB(2个表)的页面。由于每个表条目中都提供了该位,因此可以混合使用不同的页面大小,例如,2MB页面后面可以跟随4kB页面。

答案 2 :(得分:2)

是和否。

页面大小已修复。但是虚拟内存区域的大小不是(在x86架构上)。当您创建一个与页面大小不相等的虚拟内存区域时,它称为段。

答案 3 :(得分:1)

答案 4 :(得分:-2)

视窗: http://windows.microsoft.com/en-US/windows-vista/Change-the-size-of-virtual-memory

Linux的:

在/usr/src/linux/include/asm-generic/page.h中,您可以找到以下行:

/ * PAGE_SHIFT确定页面大小* /

定义PAGE_SHIFT 12

以下文章在评论部分解释。

http://www.cyberciti.biz/faq/linux-check-the-size-of-pagesize/

/ proc / sys / vm / swappiness参数,用于更改交换运行时内存之间的平衡,而不是从系统页面缓存中删除页面。