有没有可能改变虚拟内存页面大小?

是否有可能更改虚拟内存页面大小? 我这样问是因为在维基百科的MMU文章的X86_64部分 ,它讨论了不同的页面大小。 如果页面大小确实可以改变,它是如何改变的?

在x86_64上,你可以在hugetlbfs的帮助下明确请求2个MiB页面,而不是通常的4个KiB页面。 在具有透明大页面支持的现代内核上,由于内存碎片不够大,内存不足,所以小页面可以自动连接到后台的大页面。

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

是和不是。

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

Windows: 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参数,它改变了运行时内存之间的平衡,而不是从系统页面缓存中删除页面。