Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
vfs_read返回-使用DirectIO打开的文件的默认值(在内核空间中运行的代码)_C_Linux_Kernel - Fatal编程技术网

vfs_read返回-使用DirectIO打开的文件的默认值(在内核空间中运行的代码)

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

因此,我想在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);

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在用户空间中分配内存