我做了什么:
用root开启大页面(我的系统支持1MB大页面)
$ echo 20 > /proc/sys/vm/nr_hugepages
将大页面文件系统挂载到/mnt/hugepages
$ mount -t hugetlbfs nodev /mnt/hugepages
在大页面文件系统中创建一个文件
$ touch /mnt/hugepages/hello
然后使用
mmap
映射一个大页面到地址0,如下面的代码所示#define FILE_NAME "/mnt/hugepages/hello" #define PROTECTION (PROT_READ | PROT_WRITE) // page flag #define LENGTH (1024*1024*1024) // huge page size #define FLAGS (MAP_SHARED) //page flag #define ADDR (void *) (0x0UL) //starting address of the page fd = open(FILE_NAME, O_CREAT | O_RDWR, 0755); if (fd < 0) { // perror("Open failed"); exit(1); } // allocate a buffer using huge pages buf = mmap(ADDR, LENGTH, PROTECTION, FLAGS, fd, 0); if (buf == MAP_FAILED) { perror("mmap"); unlink(FILE_NAME); exit(1); }
程序输出:
mmap: Cannot allocate memory
最佳答案
Linux 只支持用于私有(private)匿名映射的大页面(不受文件支持)。 IE。您只能为堆栈、数据和堆启用大表。
关于c - 尝试映射大页面 (1GB) 时 mmap 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28826470/