Linux 将O_DIRECT与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,因此 两者之间不是一种选择。任何暗示都将不胜感激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,因此 两者之间不是一种选择。任何暗示都将不胜感激 提
提前谢谢 我认为,这一切都是因为
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映射到用户空间,否则任何人都会重写内核内存