使用O_DIRECT和IO内存

我试图从I / O内存(HIGHMEM)写入一些数据到硬盘。 我已经使用io_remap_pfn_range()mmap了内存缓冲区。 我的应用程序使用O_DIRECT进行磁盘读写操作。 使用O_DIRECT,写入返回EFAULT(坏地址)。 我把它logging在mm / memory.c中的__get_user_pages,IO页面被拒绝。 这和我现在的知识一样深,可以让我进入内核。 我不明白为什么IO指针不被允许。 超快磁盘IO是我们项目的一个要求,所以任何复制都不是一个选项。 任何暗示是赞赏。

提前致谢!

我想,这一切都是因为VM_PFNMAP标志( http://elixir.free-electrons.com/linux/v4.11.7/source/include/linux/mm.h#L174
当你使用io_remap_pfn_range ,它会设置VM_PFNMAP标志( http://elixir.free-electrons.com/linux/v4.11.7/source/mm/memory.c#L1914 ),告诉“这些页面不是常规的页面通常的结构页面“(见上面的代码注释)
__get_user_pages检查这个标志并返回错误( http://elixir.free-electrons.com/linux/v4.11.7/source/mm/nommu.c#L136
PS在io_remap_pfn_range__get_user_pages也有VM_IO标志,所以在内核页面上不会有任何I / O映射到用户空间,否则任何人都会重写内核内存