c - 尝试映射大页面 (1GB) 时 mmap 失败

标签 c linux-kernel kernel huge-pages

我做了什么:

  1. 用root开启大页面(我的系统支持1MB大页面)

    $ echo 20 > /proc/sys/vm/nr_hugepages
    
  2. 将大页面文件系统挂载到/mnt/hugepages

    $ mount -t hugetlbfs nodev /mnt/hugepages
    
  3. 在大页面文件系统中创建一个文件

    $ touch /mnt/hugepages/hello
    
  4. 然后使用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。您只能为堆栈、数据和堆启用大表。


如今,有 hugeadm配置系统大页面池,无需摆弄/procmount。和 hugectl为代码和数据使用大页面。

关于c - 尝试映射大页面 (1GB) 时 mmap 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28826470/

相关文章:

java - 进程 killer 识别

c - 为什么 ticket spinlock .h 文件没有被内核编译?

c - 尝试.c :8: error: incompatible types in initialization - c

c# - 如何使用 C# 或 C/C++ 在 Windows 7 中获取智能卡读卡器名称?

cs50 pset4 recovery.c 需要建议

linux - CPU节流系统中时间测量的可靠方法是什么?

linux-kernel - 为什么我在运行 readelf -s 时得到这个输出

c - 使用 Windows MiniFilter 驱动程序拦截进程访问

c - 为什么samples/bpf 中的ebpf 程序不起作用?

c - 从套接字中读取一行