如何将 mmap 输入内存写入 O_DIRECT 输出文件?

问题描述 投票:0回答:2

为什么下面的伪代码不起作用(O_DIRECT 导致 EFAULT)

in_fd = open("/dev/mem");
in_mmap = mmap(in_fd);
out_fd = open("/tmp/file", O_DIRECT);
write(out_fd, in_mmap, PAGE_SIZE);

同时执行(无 O_DIRECT)

in_fd = open("/dev/mem");
in_mmap = mmap(in_fd);
out_fd = open("/tmp/file");
write(out_fd, in_mmap, PAGE_SIZE);

我猜这是虚拟内核页面到虚拟用户页面的东西,不能在写调用中翻译?

最好的问候,

弗里德里希

linux-kernel mmap
2个回答
0
投票

将 mmap() 与 O_DIRECT 一起使用是很棘手的。有一些限制。文件的输出应该是块对齐的。例如,如果您将 mmap() 中的偏移量设置为 0,您的代码将起作用。您必须检查文件系统的块大小以正确设置该值。


0
投票

有两种方法:

  1. 使用

    CMA
    vm_insert_pages
    。详细说明可以在my另一个Stack Overflow答案中找到

  2. 使用

    no-map
    预留内存结合我的补丁系列。本系列包括一个演示如何轻松实施此方法的示例。

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