gpt4 book ai didi

linux - 内核中的 copy_from_user 问题

转载 作者:太空宇宙 更新时间:2023-11-04 03:46:44 27 4
gpt4 key购买 nike

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

最佳答案

有可能由于您无法恢复的原因而发生合理的失败。

请查看: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 是否被改变?很可能不是。

关于linux - 内核中的 copy_from_user 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27933423/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com