为什么我不能mmap超过1G的hugepages?

问题描述 投票:1回答:1
pqy@3500X ~/projects/hp/build $ cat ../main.c 
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>
#include <fcntl.h>

int main(int argc, char *argv[])
{
    int n = atoi(argv[1]);
    void *addr = mmap(NULL, n*1024*1024*1024, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_HUGETLB, -1, 0);
    if(addr == -1){
        perror("mmap");
    }
    return 0;
}
pqy@3500X ~/projects/hp/build $ cat /proc/meminfo |grep -i huge
AnonHugePages:   1058816 kB
ShmemHugePages:        0 kB
FileHugePages:     36864 kB
HugePages_Total:       4
HugePages_Free:        4
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:    1048576 kB
Hugetlb:         4194304 kB
pqy@3500X ~/projects/hp/build $ ./hp 1
pqy@3500X ~/projects/hp/build $ ./hp 2
mmap: Cannot allocate memory
pqy@3500X ~/projects/hp/build $ ./hp 3
mmap: Cannot allocate memory
pqy@3500X ~/projects/hp/build $ ./hp 4
mmap: Invalid argument

我有4个免费的1G的hugepages,我想把所有的hugepages都映射到我的程序中。但是在我的测试程序中,我只能成功地mmap 1G。更大的值会抛出 "Cannotate memory "或 "Invalid argument",这让我很困惑。这里有什么陷阱吗?

c linux mmap huge-pages
1个回答
2
投票

你的 n 变量是一个 int,在Linux的x86_64中是32位宽。这意味着 2 或更高的溢流。

在实践中。23 产生负数,这些负数会被解释为巨大的64位无符号值(所以分配失败),并且 4 准确地得出 0 (所以这个论点是无效的)。

© www.soinside.com 2019 - 2024. All rights reserved.