【发布时间】:2013-06-27 14:22:36
【问题描述】:
我在内核模块中创建了块设备。当一些 I/O 发生时,我从另一个现有设备读取/写入所有数据(比如说/dev/sdb)。
打开正常,但读/写操作返回 14 错误(EFAULT,Bad Address)。经过一番研究,我发现我需要将地址映射到用户空间(可能是buffer 或filp 变量),但copy_to_user 函数没有帮助。我还查看了mmap() 和remap_pfn_range() 函数,但我不知道如何在我的代码中使用它们,尤其是在哪里可以获得正确的vm_area_struct 结构。我发现的所有示例都使用了字符设备和file_operations 结构,而不是块设备。
有什么提示吗?感谢您的帮助。
这是我的阅读代码:
mm_segment_t old_fs;
old_fs = get_fs();
set_fs(KERNEL_DS);
filp = filp_open("/dev/sdb", O_RDONLY | O_DIRECT | O_SYNC, 00644);
if(IS_ERR(filp))
{
set_fs(old_fs);
int err = PTR_ERR(filp);
printk(KERN_ALERT"Can not open file - %d", err);
return;
}
else
{
bytesRead = vfs_read(filp, buffer, nbytes, &offset); //It gives 14 error
filp_close(filp, NULL);
}
set_fs(old_fs);
【问题讨论】:
-
buffer是一个char*变量。我们从/dev/sdb读取数据给它。它来自request函数,如request->buffer。
标签: linux-kernel kernel-module kernel