为什么下面的伪代码不起作用(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);
我猜这是虚拟内核页面到虚拟用户页面的东西,不能在写调用中翻译?
最好的问候,
弗里德里希
将 mmap() 与 O_DIRECT 一起使用是很棘手的。有一些限制。文件的输出应该是块对齐的。例如,如果您将 mmap() 中的偏移量设置为 0,您的代码将起作用。您必须检查文件系统的块大小以正确设置该值。
有两种方法:
使用
CMA
和vm_insert_pages
。详细说明可以在my另一个Stack Overflow答案中找到
使用
no-map
预留内存结合我的补丁系列。本系列包括一个演示如何轻松实施此方法的示例。