所以我想在Linux内核空间中模拟一个pread(使用DIRECT_IO)。所以我使用kmalloc在内核空间中分配一块内存并执行了vfs_read。 vfs_read希望将数据放在user_space缓冲区中。我通过执行set_fs(KERNEL_DS)来绕过该检查。总体而言,我的代码如下:
temp = (char*)kmalloc(count, GFP_KERNEL);
mm_segment_t old_fs;
old_fs = get_fs();
set_fs(KERNEL_DS);
ret = vfs_read(file, temp, count, &pos);
set_fs(old_fs);
kfree(tmp)
现在的问题是,上述方法只有在没有DIRECT_IO的情况下才能正常工作。使用DIRECT_IO,vfs_read将返回-EFAULT。
有人可以帮助我,以便我知道DIRECT_IO中的哪些限制被违反了吗?我知道count和pos都是4kb对齐。