使用 O_DIRECT 和 IO 内存

using O_DIRECT with IO memory

我正在尝试将一些数据从 I/O 内存 (HIGHMEM) 写入 HDD。 我已经使用 io_remap_pfn_range() 映射了内存缓冲区。 我的应用程序使用 O_DIRECT,用于磁盘 read/write 操作。 使用 O_DIRECT,写入 returns EFAULT(错误地址)。我在 mm/memory.c 中追踪到 __get_user_pages,其中 IO 页面 被拒绝。这是我目前的知识所允许的深度 进入内核。我不明白为什么 IO 指针不是 允许。超快磁盘 IO 是我们项目的要求,因此任何复制 between 不是一个选项。任何提示表示赞赏。

提前致谢!

我认为,这一切都是因为 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 ),告诉 "those pages aren't regular pages with usual struct page" (请参阅上面代码中的注释)
并且 __get_user_pages 检查此标志和 returns 错误 ( http://elixir.free-electrons.com/linux/v4.11.7/source/mm/nommu.c#L136 )
P.S。在 io_remap_pfn_range__get_user_pages 中也有 VM_IO 标志,所以内核页面上不会有任何 I/O,映射到 user-space,或者任何人都会重写内核内存