Linux 将O_DIRECT与IO内存一起使用

Linux 将O_DIRECT与IO内存一起使用,linux,linux-kernel,linux-device-driver,embedded-linux,archlinux,Linux,Linux Kernel,Linux Device Driver,Embedded Linux,Archlinux,我正在尝试从I/O内存(HIGHMEM)向HDD写入一些数据。 我已使用io_remap_pfn_range()映射内存缓冲区。 我的应用程序使用O_DIRECT进行磁盘读/写操作。 使用O_DIRECT,write返回EFAULT(错误地址)。我跟踪到mm/memory.c中的uuu get_uuser_u页面,其中有IO页面 被拒绝。这是我目前的知识所允许的最深刻的 进入内核。我不明白为什么IO指针不是 允许。我们的项目需要超快的磁盘IO,因此 两者之间不是一种选择。任何暗示都将不胜感激 提

我正在尝试从I/O内存(HIGHMEM)向HDD写入一些数据。 我已使用io_remap_pfn_range()映射内存缓冲区。 我的应用程序使用O_DIRECT进行磁盘读/写操作。 使用O_DIRECT,write返回EFAULT(错误地址)。我跟踪到mm/memory.c中的uuu get_uuser_u页面,其中有IO页面 被拒绝。这是我目前的知识所允许的最深刻的 进入内核。我不明白为什么IO指针不是 允许。我们的项目需要超快的磁盘IO,因此 两者之间不是一种选择。任何暗示都将不胜感激


提前谢谢

我认为,这一切都是因为
VM\u PFNMAP
flag()
当您使用
io\u remap\u pfn\u range
时,它会设置
VM\u PFNMAP
标志(),告诉您“这些页面不是具有常规结构页面的常规页面”(请参见上面代码中的注释)
\uu get\u user\u pages
检查此标志并返回错误()
另外,在
IO\u remap\u pfn\u范围
\u get\u user\u页面
中都有
VM\u IO
标志,因此内核页面上不会有任何I/O映射到用户空间,否则任何人都会重写内核内存