以下是返回值的说明。
unsigned long copy_from_user
(void *to, const void __user *from, unsigned long count)
返回值是仍要复制的内存量。
这究竟是什么意思?如果返回值为5,是否复制了(count-5)
个字节?仅(count-5)
个字节被复制的原因是什么?是因为to
的大小小于from
(系统应该崩溃,然后,右)?
答案 0 :(得分:14)
copy_from_user
函数可能由于各种原因(通常是因为地址无效)而失败,只复制部分请求的数据,甚至都不复制。
有一个约定(不是普遍遵循)的函数返回0表示成功。在copy_from_user
的情况下,将结果定义为 not 复制的字节数允许它使用相当简单的规则遵循此约定。
直观地说,返回实际复制的字节数可能更有意义,但它定义的方式允许使用它的代码以与其他函数类似的方式测试错误成功时返回0。 (在许多情况下,无法复制多少字节无关紧要;任何非零结果都只是一个错误。)
如果它返回小于count
的非零值,表示部分副本,则可能表示用户空间内存缓冲区在用户进程的地址空间内启动但是延伸到它的最后。