Mmap : 失败并显示MAP_SYNC

Mmap : failing with MAP_SYNC

提问人:LeXav 提问时间:5/17/2023 最后编辑:genpfaultLeXav 更新时间:5/18/2023 访问量:102

问:

[Linux 内核 6.1.27 在 Debian 测试中,最新。Clang 16 或 gcc 12.2]

有人可以告诉我们出了什么问题以及为什么 mmap 返回MAP_FAILED:

int fd = ::open( file_name.data(), O_RDWR );
auto *ptr = mmap( nullptr, size, PROT_READ | PROT_WRITE, MAP_SHARED_VALIDATE | MAP_SYNC, fd, 0 );

Errno 告诉:“不支持操作”

删除MAP_SYNC时,一切正常。

它在指定 或 时也有效。MAP_SHARED_VALIDATE | MS_SYNCMAP_SHARED_VALIDATE |MS_ASYNC

我基本上想避免在编写后调用 msync,并让内核自动为我管理它。

C++ MMAP的

评论

0赞 Botje 5/17/2023
失败时还会在 中放置错误代码。你到底得到了什么错误?mmaperrno
0赞 LeXav 5/18/2023
@Botje:是的,当然:“不支持操作”
0赞 Turtlefight 5/18/2023
您是否使用文件系统挂载或在文件上设置了标志?(如果要使用,则文件必须支持直接文件访问 (DAX),否则操作将失败,并显示 (不支持操作) - 参见 mmap 手册页)(底层块设备当然也必须支持 DAX)-o dax=alwaysFS_XFLAG_DAXMAP_SYNCEOPNOTSUPP
0赞 LeXav 5/18/2023
@Turtlefight:我认为 dax 激活是这里的问题。docs.kernel.org/filesystems/dax.html#details,当你使用 xfs 时,你有xfs_io但对于 ext4,我们什么都没有,对吧?
0赞 Turtlefight 5/18/2023
ext4 确实支持 DAX(假设底层块设备也支持),您可以挂载文件系统以启用所有文件的 DAX,或者在 inode 上设置 DAX 标志。我不知道有任何重建的 cli 程序,例如 ext4 的 xfs_io,但也许有一个。从代码中设置它并不太困难 - 您只需要在带有 / 的文件上发出 ioctl 并设置EXT4_DAX_FL标志-o dax=alwaysFS_IOC_GETFLAGSFS_IOC_SETFLAGS

答: 暂无答案