【问题标题】:How to write mmap input memory to O_DIRECT output file?如何将 mmap 输入内存写入 O_DIRECT 输出文件?
【发布时间】:2011-06-22 18:31:23
【问题描述】:

为什么不遵循伪代码工作(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);

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

最好的问候,

弗里德里希

【问题讨论】:

  • O_DIRECT 写入需要固定页面;也许这就是问题所在……你到底想做什么?如果这是一个内存映射的硬件设备,您最好在驱动程序中添加splice 支持......另外,请提供一个更完整的示例(包括所有系统调用的所有标志)。理想情况下,任何人都可以编译并运行以重现。

标签: linux-kernel mmap


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-18
    • 2011-09-20
    • 2016-07-13
    • 2014-10-18
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    相关资源
    最近更新 更多