Mac OS X 上的大页面

Posted

技术标签:

【中文标题】Mac OS X 上的大页面【英文标题】:Huge pages on Mac OS X 【发布时间】:2015-11-26 23:45:47 【问题描述】:

Mac OS X mmap 手册页说可以分配超级页面,我认为这与 Linux 大页面相同。

https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man2/mmap.2.html

但是,以下简单测试在 Mac OS X (Yosemite 10.10.5) 上失败:

#include <stdio.h>
#include <sys/mman.h>
#include <mach/vm_statistics.h>

int
main()

    void *p = mmap((void *) 0x000200000000, 8 * 1024 * 1024,
                   PROT_READ | PROT_WRITE,
                   MAP_ANON | MAP_FIXED | MAP_PRIVATE,
                   VM_FLAGS_SUPERPAGE_SIZE_2MB, 0);
    printf("%p\n", p);
    if (p == MAP_FAILED)
        perror(NULL);
    return 0;

输出是:

0xffffffffffffffff
Cannot allocate memory

结果与从标志中删除MAP_FIXED 和作为地址参数提供的NULL 相同。将VM_FLAGS_SUPERPAGE_SIZE_2MB替换为-1会得到预期的结果,即没有错误发生,但显然分配的内存空间使用了常规的4k页。

以这种方式分配超级页面可能会出现什么问题?

【问题讨论】:

您确定地址区域空间能够使用超级页面寻址模式吗?先尝试使用空地址或尝试删除MAP_FIXED 以查看。 对不起,我很惊讶没有看到它。请原谅我。我不太了解 OSX 内存管理,但是这个地址可能无法用于超级分页,因为超级分页仅在某些区域可用,或者在当前使用不同分页大小的区域中不可用。 有一些内核参数可通过sysctl 获得,在我的 10.10.5 上,每个与页面大小相关的参数都有值 4096(vm.pagesize,hw.pagesize)。 sysctl 声明 1GBPAGE 在硬件上可用。当前的内核配置可能不允许使用某些页面大小。 有可能,但我想知道那是什么。关于sysctl 表示1GBPAGE 可用性,您指的是machdep.cpu.extfeatures 值吗?然后,如果您查看machdep.cpu.features 值,那里的PSE 标志意味着至少CPU 也支持2 MB 页面。 我有1GBPAGE,但没有PSE36。所有这一切让我觉得有很多东西已经准备好支持超分页,但是在某些配置中缺少一些东西......缺乏文档...... 【参考方案1】:

对已发布示例的此小修改适用于我在 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;

【讨论】:

很遗憾,不能在 macOS Catalina 上的 MBP "15 (2019) 上运行。有什么需要特别注意或配置的吗?我收到与帖子发布者相同的错误。跨度>

以上是关于Mac OS X 上的大页面的主要内容,如果未能解决你的问题,请参考以下文章

Mac OS X上的Oracle 11g

如何 在Mac OS X 上的 Appium 上 Run *.app 文件

在 Mac OS X 上用于 Python 3 的 Kivy

php pdf报价中的大页脚

Mac OS X 上的 GCC 标志 -Os 来自哪里?

text Mac OS X上的Git和凭据