【问题标题】:issue with copy_from_user in kernel内核中的 copy_from_user 问题
【发布时间】:2015-01-13 23:30:31
【问题描述】:

我正在尝试使用此功能将缓冲区从用户复制到内核中的一个。 两个缓冲区都已分配。我正在使用while,以防在第一次尝试时并非所有字节都被复制。但由于某种原因,没有复制任何内容,程序卡在 while 循环中。 这可能是什么原因?

void my_copy_from_user(const char* source_buff, char* dest_buff, int size_to_copy){
    int not_copied = size_to_copy
    int left = size_to_copy;

    while( not_copied ){
        not_copied = copy_from_user(dest_buff, source_buff, left);
        dest_buff += (left - not_copied);
        source_buff += (left - not_copied);
        left = not_copied;
    }
}

【问题讨论】:

    标签: linux kernel


    【解决方案1】:

    它可能由于您无法恢复的原因而合法地失败。

    请看:http://lxr.free-electrons.com/source/arch/x86/lib/usercopy_32.c#L681

    unsigned long _copy_from_user(void *to, const void __user *from, unsigned n)
    {
        if (access_ok(VERIFY_READ, from, n))
            n = __copy_from_user(to, from, n);
        else
            memset(to, 0, n);
        return n;
    }
    

    这是在 x86 处理器上用于 Linux 的 copy_from_user 的底层实现。它首先检查access_ok。如果不允许访问,它将失败并立即返回n(您请求复制的字节数)。这会导致无限循环。

    两点:

    • 我认为您不应该在这样的循环中调用copy_from_user。如果它无法在内核模式下复制,则有一个原因。这与read() 函数在从套接字等读取时不同,在这种情况下,我们鼓励您在循环中使用 read()。
    • 您是否确定将正确的dest_buff 传递给copy_from_user

    提示:

    • 打印所有值,看看发生了什么。 left 是否被更改?可能不会。

    【讨论】:

    • 链接里的信息看起来很有用,但是请把相关代码贴在这里,以防万一以后链接失效,让你的回答更完整。
    猜你喜欢
    • 2013-05-03
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    相关资源
    最近更新 更多