加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

copy_to_user vs memcpy

发布时间:2020-12-16 05:56:15 所属栏目:百科 来源:网络整理
导读:我一直被告知(在书籍和教程中)在将数据从内核空间复制到用户空间时,我们应该使用copy_to_user()并使用memcpy()将导致系统出现问题.最近我错误地使用了memcpy(),它的工作非常好,没有任何问题.为什么我们应该使用copy_to_user而不是memcpy() 我的测试代码(内核
我一直被告知(在书籍和教程中)在将数据从内核空间复制到用户空间时,我们应该使用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 testn");

    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()失败的示例都将非常有用.谢谢.

解决方法

这有几个原因.

一,安全.因为内核可以写入任何想要的地址,如果你只使用一个用户空间地址,并使用memcpy,攻击者可以写入另一个进程的页面,这是一个巨大的安全问题. copy_to_user检查目标页面是否可由当前进程写入.

还有一些架构考虑.例如,在x86上,目标页面必须固定在内存中.在某些架构上,您可能需要特殊说明.等等. Linux内核非常便携的目标需要这种抽象.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读