MacOSX上的巨大页面
Mac OS X mmap手册页说可以分配超级页面,我推测这与Linux的巨型页面是一样的 但是,以下简单测试在Mac OS X(约塞米蒂10.10.5)上失败: 如果将MacOSX上的巨大页面,c,macos,memory,memory-management,huge-pages,C,Macos,Memory,Memory Management,Huge Pages,Mac OS X mmap手册页说可以分配超级页面,我推测这与Linux的巨型页面是一样的 但是,以下简单测试在Mac OS X(约塞米蒂10.10.5)上失败: 如果将MAP\u FIXED从标志中删除,并将NULL作为地址参数提供,则结果相同。将VM\u FLAGS\u SUPERPAGE\u SIZE\u 2MB替换为-1会得到预期的结果,即不会发生错误,但显然分配的内存空间会使用常规的4k页面 以这种方式分配超级页面可能会有什么问题?对发布的示例进行的这一小修改在Mac OS 10.1
MAP\u FIXED
从标志中删除,并将NULL
作为地址参数提供,则结果相同。将VM\u FLAGS\u SUPERPAGE\u SIZE\u 2MB
替换为-1
会得到预期的结果,即不会发生错误,但显然分配的内存空间会使用常规的4k页面
以这种方式分配超级页面可能会有什么问题?对发布的示例进行的这一小修改在Mac OS 10.10.5上适用:
#include <stdio.h>
#include <sys/mman.h>
#include <mach/vm_statistics.h>
int
main()
{
void *p = mmap(NULL,
8*1024*1024,
PROT_READ | PROT_WRITE,
MAP_ANON | MAP_PRIVATE,
VM_FLAGS_SUPERPAGE_SIZE_2MB, // mach flags in fd argument
0);
printf("%p\n", p);
if (p == MAP_FAILED)
perror(NULL);
return 0;
}
#包括
#包括
#包括
int
main()
{
void*p=mmap(空,
8*1024*1024,
保护读,保护写,
阿农地图|私人地图|,
VM_FLAGS_SUPERPAGE_SIZE_2MB,//fd参数中的马赫标志
0);
printf(“%p\n”,p);
如果(p==映射_失败)
perror(空);
返回0;
}
您确定地址区域空间能够使用超级页面寻址模式吗?请先尝试使用空地址,或尝试删除MAP\u FIXED
以查看。抱歉,我很惊讶没有看到它。请原谅我。我不太了解OSX内存管理,但可能该地址不可用于超级分页,因为超级分页仅在某些区域中可用,或者在当前使用不同分页大小的区域中不可用。有一些内核参数可通过sysctl
,在我的10.10.5版本中,每个与页面大小相关的页面都有值4096(vm.pagesize,hw.pagesize)。sysctl声明1GBPAGE在硬件上可用。可能当前的内核配置不允许使用某些页面大小。这是可能的,但我想知道它是什么。关于指示1GBPAGE
可用性的sysctl
,您指的是machdep.cpu.extfeatures
值吗?然后,如果你看一下machdep.cpu.features
值,那里的PSE
标志意味着至少cpu也支持2MB页面。我有1GBPAGE
,但没有PSE36
。所有这些让我想到,很多东西都已经准备好支持超级老化,但是在某些配置中缺少了一些东西。。。缺少文档…不幸的是,macOS Catalina上的MBP“15(2019)不起作用。有什么需要特别注意或配置的吗?我收到的错误与线程海报相同。
0xffffffffffffffff
Cannot allocate memory
#include <stdio.h>
#include <sys/mman.h>
#include <mach/vm_statistics.h>
int
main()
{
void *p = mmap(NULL,
8*1024*1024,
PROT_READ | PROT_WRITE,
MAP_ANON | MAP_PRIVATE,
VM_FLAGS_SUPERPAGE_SIZE_2MB, // mach flags in fd argument
0);
printf("%p\n", p);
if (p == MAP_FAILED)
perror(NULL);
return 0;
}