vfs_read返回-使用DirectIO打开的文件的默认值(在内核空间中运行的代码)
因此,我想在Linux内核空间中模拟一个pread(带有DIRECT_IO)。因此,我使用kmalloc在内核空间中分配了一块内存,并进行了vfs_读取。vfs_read希望将数据放入用户空间缓冲区。我通过执行set_fs(KERNEL_DS)绕过了这个检查。总体而言,我的代码如下所示:vfs_read返回-使用DirectIO打开的文件的默认值(在内核空间中运行的代码),c,linux,kernel,C,Linux,Kernel,因此,我想在Linux内核空间中模拟一个pread(带有DIRECT_IO)。因此,我使用kmalloc在内核空间中分配了一块内存,并进行了vfs_读取。vfs_read希望将数据放入用户空间缓冲区。我通过执行set_fs(KERNEL_DS)绕过了这个检查。总体而言,我的代码如下所示: temp = (char*)kmalloc(count, GFP_KERNEL); mm_segment_t old_fs; old_fs = get_fs(); set_fs(KERNEL_DS); r
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)
现在的问题是,上述方法只有在没有直接IO的情况下才能很好地工作。使用直接IO时,vfs读取将返回-EFAULT
有人能帮我知道DIRECT_IO中违反了哪些限制吗?我知道count和pos都是4kb对齐的。这可能是像内存对齐这样简单的事情吗?直接io通常需要块或页面对齐,而kmalloc可能不会这样做。谢谢您的回复。即使在对齐内存缓冲区后,我仍然得到-EFAULT。这可能是直接IO的本质。DIO希望避免在内核内存中保存东西,这就是我在这里尝试做的。这里的代码由系统调用上的systemtap探测调用。这就是代码在内核空间中运行的原因。顺便问一下,您知道如何从systemtap探测器在用户空间中分配一些内存吗?我认为能够在用户空间中获得一个缓冲区可以解决我从kernelOne那里得到的所有问题。我曾经想过的一个非常愚蠢的方法是,编写一个c程序,它所做的只是一个malloc()。不知何故,我让c程序持续运行。同时,Systemtap探测器从malloc调用触发,stap可以记录返回的内存地址。。。这可能有效,但我确实需要一些更好的方法从systemtap probe在用户空间中分配内存