【问题标题】:Is it possible to change virtual memory page size?是否可以更改虚拟内存页面大小?
【发布时间】:2012-04-19 20:12:01
【问题描述】:

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

【问题讨论】:

  • 您是在问应用程序如何改变其页面大小,或者操作系统如何创建不同大小的页面?
  • 好吧,我在问是否可以更改页面大小,但如果可以按应用程序完成,那将非常酷!

标签: c linux x86-64


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    据我所知,没有操作系统允许应用程序请求页面大小。 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 的页面。

    【讨论】:

    • 在 linux 上查看 madvise(),您至少可以使用 MADV_HUGEPAGE 更大的页面
    【解决方案3】:

    是和不是。

    页面大小是固定的。但是虚拟内存区域的大小不是(在 x86 架构上)。当您创建一个大小不等于页面大小的虚拟内存区域时,它被称为一个段。

    【讨论】:

      【解决方案4】:
      【解决方案5】:

      窗户: 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

      下面的文章在 cmets 部分进行了解释。

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

      /proc/sys/vm/swappiness 参数,它改变了换出运行时内存与从系统页面缓存中删除页面之间的平衡。

      【讨论】:

      • OP 询问是否更改虚拟内存中给定页面的大小,而不是更改虚拟内存本身的大小。此外,这个问题被标记为 linux。
      • 嗯... OP 在询问 Linux... 您的链接适用于 Windows。
      猜你喜欢
      • 2016-09-26
      • 2013-01-13
      • 1970-01-01
      • 2014-07-14
      • 2018-07-27
      • 2011-03-25
      • 1970-01-01
      • 2020-02-19
      • 1970-01-01
      相关资源
      最近更新 更多