内核中的copy_from_user问题

时间:2015-01-13 23:30:31

标签: linux kernel

我正在尝试使用此函数将缓冲区从用户复制到内核中的缓冲区。 两个缓冲区都已分配。我正在使用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;
    }
}

1 个答案:

答案 0 :(得分:0)

由于无法从中恢复的原因,它可能合法地失败。

请查看: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()函数不同的野兽,鼓励您在循环中读取()。
  • 确定您是否传递了正确的dest_buffcopy_from_user

提示:

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