我一直被告知(在书籍和教程中)在将数据从内核空间复制到用户空间时,我们应该使用copy_to_user()并使用memcpy()将导致系统出现问题.最近我错误地使用了memcpy(),它的工作非常好,没有任何问题.为什么我们应该使用copy_to_user而不是memcpy()
我的测试代码(内核模块)是这样的:
static ssize_t test_read(struct file *file,char __user * buf,size_t len,loff_t * offset) { char ani[100]; if (!*offset) { memset(ani,'A',100); if (memcpy(buf,ani,100)) return -EFAULT; *offset = 100; return *offset; } return 0; } struct file_operations test_fops = { .owner = THIS_MODULE,.read = test_read,}; static int __init my_module_init(void) { struct proc_dir_entry *entry; printk("We are testing now!!\n"); entry = create_proc_entry("test",S_IFREG | S_IRUGO,NULL); if (!entry) printk("Failed to creats proc entry test\n"); entry->proc_fops = &test_fops; return 0; } module_init(my_module_init);
从用户空间应用程序,我正在阅读我的/ proc条目,一切正常.
看看copy_to_user()的源代码说,它也是简单的memcpy(),我们只是试图通过access_ok检查指针是否有效,并且做memcpy.
所以我的理解是,如果我们确定我们传递的指针,memcpy()可以永远用于代替copy_to_user.
如果我的理解不正确,请纠正我,并且任何copy_to_user工作和memcpy()失败的示例都将非常有用.谢谢.