我正在尝试使用此函数将缓冲区从用户复制到内核中的缓冲区。
两个缓冲区都已分配。我正在使用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;
}
}
答案 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_buff
至copy_from_user
?提示:
left
是否被更改?可能不会。