我用root权限运行程序,但它一直在抱怨mmap无法分配内存.代码段如下:
#define PROTECTION (PROT_READ | PROT_WRITE) #define LENGTH (4*1024) #ifndef MAP_HUGETLB #define MAP_HUGETLB 0x40000 #endif #define ADDR (void *) (0x0UL) #define FLAGS (MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB) int main (int argc,char *argv[]){ ... // allocate a buffer with the same size as the LLC using huge pages buf = mmap(ADDR,LENGTH,PROTECTION,FLAGS,0); if (buf == MAP_Failed) { perror("mmap"); exit(1); } ...}
硬件:我有8G内存.处理器是ivybridge
Uname输出:
Linux mymachine 3.13.0-43-generic #72-Ubuntu SMP Mon Dec 8 19:35:06 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
编辑1:perror的输出
mmap: Cannot allocate memory
还添加了一行来打印errno
printf("something is wrong: %d\n",errno);
但输出是:
something is wrong: 12
编辑2:来自/ proc / meminfo的巨大的tlb相关信息
HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB
解决方法
好吧,正如
Documentation/vm/hugetlspage.txt建议的那样
echo 20 > /proc/sys/vm/nr_hugepages
解决了这个问题.在ubuntu 14.04上测试过.检查Why I can’t map memory with mmap.