linux - 将 O_DIRECT 与 IO 内存一起使用

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

我正在尝试将一些数据从 I/O 内存 (HIGHMEM) 写入 HDD。 我已经使用 io_remap_pfn_range() 映射了内存缓冲区。 我的应用程序使用 O_DIRECT 进行磁盘读/写操作。 使用 O_DIRECT,写入返回 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 ),告诉“这些页面不是具有通常结构页面的常规页面”(请参阅​​代码中的注释以上)
__get_user_pages 检查此标志并返回错误 ( http://elixir.free-electrons.com/linux/v4.11.7/source/mm/nommu.c#L136 )
附言io_remap_pfn_range__get_user_pages 中也有 VM_IO 标志,因此内核页面上不会有任何 I/O,映射到用户-空间,否则任何人都会重写内核内存

关于linux - 将 O_DIRECT 与 IO 内存一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44820740/

相关文章:

java - 从 Linux EXTREME VPS 读取文件时出现文件未找到异常

linux - 是否有适用于 Mac OS 和 Linux 的 MSDN 等效项?

linux - 不使用 printk 写入 Linux 控制台

linux - lsmod 显示模块被-2使用

python -/usr/bin/ld : cannot find -lffi while installing cffi 1. 11.5 包

linux - x86-64 架构上的 gnu 汇编 RET 指令失败

python - 在读取或写入文件系统时执行其他操作

linux-kernel - 内核配置文件中的 m 是什么意思?

linux - 如何在 Linux 的帧缓冲区中定义不支持的屏幕分辨率?

基本数据类型的 copy_to_user() 和 copy_from_user()