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

发布于 2024-11-16 23:19:43 字数 430 浏览 3 评论 0原文

为什么下面的伪代码不起作用(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);

我猜这是虚拟内核页面到虚拟用户页面的问题,无法在写入调用中进行转换?

最好的问候,

弗里德里希

why doesn't following pseudo-code work (O_DIRECT results in 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);

while following does (no O_DIRECT)

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

I guess it's something with virtual kernel pages to virtual user pages, which cannot be translated in the write call?

Best regards,

Friedrich

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

江挽川 2024-11-23 23:19:43

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

Using mmap() with O_DIRECT is tricky. There are some restrictions. The output to the file should be block aligned. For example, if you set offset in mmap() to 0 your code will work. You have to check the block size of your filesystem to set that value properly.

断爱 2024-11-23 23:19:43

有两种方法:

  1. 使用CMAvm_insert_pages。详细说明可以在我的另一个 Stack Overflow 答案

    中找到

  2. 使用no-map保留记忆与我的补丁系列相结合。本系列包含一个示例,演示如何轻松实现此方法。

There are two approaches:

  1. Use CMA and vm_insert_pages. Detailed instructions can be found in my another Stack Overflow answer

  2. Use no-map reserved memory combined with my patch series. This series includes a sample that demonstrates how to implement this approach easily.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文