使用带有IO内存的O_DIRECT

时间:2017-06-29 09:05:13

标签: linux linux-kernel linux-device-driver embedded-linux archlinux

我正在尝试从I / O内存(HIGHMEM)向HDD写入一些数据。 我使用io_remap_pfn_range()mmap了内存缓冲区。 我的应用程序使用O_DIRECT进行磁盘读/写操作。 使用O_DIRECT,write返回EFAULT(错误地址)。我将其跟踪到mm / memory.c中的__get_user_pages,其中包含IO页面 被拒绝了。这与我目前的知识允许我一样深 进入内核。我不明白为什么IO指针不是 允许。超快磁盘IO是我们项目的要求,因此任何复制都是如此 之间不是一种选择。任何提示都表示赞赏。

提前致谢!

1 个答案:

答案 0 :(得分:1)

我认为,这一切都是因为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
附: VM_IOio_remap_pfn_range中都有__get_user_pages标志,因此内核页面上的任何I / O都不会被映射到用户空间,或者任何人都会重写内核记忆