代码之家  ›  专栏  ›  技术社区  ›  MK.

使用大型页映射编写mmamapped文件

  •  2
  • MK.  · 技术社区  · 6 年前

    据我所知,目前,在linux上,没有办法对文件(在xfs或ext4上)进行mmap,然后对其进行写操作,也无法以某种方式使用巨大的页面。

    这是正确的还是过时的信息,现在有办法了?

    谢谢。

    1 回复  |  直到 6 年前
        1
  •  0
  •   noname    6 年前

    如果您使用MAP_HUGETLB对一个不是来自“hugetlbfs”的文件进行mmap,那么mmap将失败。从 ksys_mmap_pgoff()

    if (!(flags & MAP_ANONYMOUS)) {
        ...
        if (unlikely(flags & MAP_HUGETLB && !is_file_hugepages(file)))
             goto out_fput;
    

    is_file_hugepages() 检查文件操作是否为hugetlbfs_file_操作,这对于ext4来说是不正确的。

    但是,您可以使用透明的大页面。目前(4.19左右),您还必须使用DAX(直接访问,通常与nvdimm和持久内存一起使用)。我还没有做过,但这是通过跟踪代码实现的。具体来说,要使大页面正常工作,您至少需要一个大的页面对齐地址,它来自 thp_get_unmapped_area() ,如果您不使用DAX,这将解决问题:

     if (!IS_DAX(filp->f_mapping->host) || !IS_ENABLED(CONFIG_FS_DAX_PMD))
        goto out;