Linux kernel 如何将mmap输入内存写入O_直接输出文件?

Linux kernel 如何将mmap输入内存写入O_直接输出文件?,linux-kernel,mmap,Linux Kernel,Mmap,为什么下面的伪代码不起作用(O_直接导致EFAULT) 而以下情况(无O_DIRECT) 我猜是虚拟内核页面到虚拟用户页面,在写调用中无法转换 致以最良好的祝愿 Friedrich将mmap()与O_DIRECT一起使用是很棘手的。有一些限制。文件的输出应该是块对齐的。例如,如果将mmap()中的偏移量设置为0,则代码将正常工作。您必须检查文件系统的块大小以正确设置该值。O\u DIRECT写入需要固定页面;也许这就是问题所在。。。你到底想做什么?如果这是一个内存映射硬件设备,您最好向驱动程序添

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

而以下情况(无O_DIRECT)

我猜是虚拟内核页面到虚拟用户页面,在写调用中无法转换

致以最良好的祝愿


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

O\u DIRECT
写入需要固定页面;也许这就是问题所在。。。你到底想做什么?如果这是一个内存映射硬件设备,您最好向驱动程序添加
splice
支持。。。另外,请提供一个更完整的示例(包括所有系统调用的所有标志)。理想情况下,任何人都可以编译并运行以复制。
in_fd = open("/dev/mem");
in_mmap = mmap(in_fd);
out_fd = open("/tmp/file", O_DIRECT);
write(out_fd, in_mmap, PAGE_SIZE);
in_fd = open("/dev/mem");
in_mmap = mmap(in_fd);
out_fd = open("/tmp/file");
write(out_fd, in_mmap, PAGE_SIZE);