MacOSX上的巨大页面

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

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.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;
}